เด็กที่มีความสูงสูงสุด: ผู้ปกครองล้น 100%


145

ฉันพยายามเข้าใจสิ่งที่ดูเหมือนจะเป็นพฤติกรรมที่ไม่คาดคิดสำหรับฉัน:

ฉันมีองค์ประกอบที่มีความสูงสูงสุด 100% ภายในคอนเทนเนอร์ที่ใช้ความสูงสูงสุด แต่ลูกจะล้นแม่โดยไม่คาดคิด:

กรณีทดสอบ: http://jsfiddle.net/bq4Wu/16/

.container {  
    background: blue; 
    padding: 10px; 
    max-height: 200px; 
    max-width: 200px; 
}

img { 
    display: block;
    max-height: 100%; 
    max-width: 100%; 
}

สิ่งนี้ได้รับการแก้ไขแล้วหากผู้ปกครองได้รับความสูงที่ชัดเจน:

กรณีทดสอบ: http://jsfiddle.net/bq4Wu/17/

.container {  
    height: 200px;
}

ไม่มีใครรู้ว่าทำไมเด็กถึงไม่ให้เกียรติกับความสูงสูงสุดของพ่อแม่ในตัวอย่างแรก? เหตุใดจึงต้องมีความสูงที่ชัดเจน

คำตอบ:


228

เมื่อคุณระบุเปอร์เซ็นต์สำหรับmax-heightเด็กก็คือเปอร์เซ็นต์ของความสูงที่แท้จริงของผู้ปกครองที่ไม่ได้เป็นผู้ปกครองmax-height, ผิดปกติพอ max-widthเช่นเดียวกับ

ดังนั้นเมื่อคุณไม่ได้ระบุความสูงที่ชัดเจนบนพ่อแม่ก็จะไม่มีความสูงพื้นฐานสำหรับเด็กmax-heightที่จะคำนวณจากนั้นmax-heightคำนวณเพื่อnoneให้เด็กสูงที่สุดเท่าที่จะทำได้ ข้อ จำกัด อื่น ๆ ที่มีผลกับเด็กในตอนนี้คือความmax-widthเป็นแม่ของมันและเนื่องจากภาพนั้นสูงกว่าความกว้างมันจึงทำให้ความสูงของคอนเทนเนอร์ล้นลงด้านล่างเพื่อรักษาอัตราส่วนในขณะที่ยังคงมีขนาดใหญ่ที่สุดโดยรวม

เมื่อคุณทำระบุความสูงที่ชัดเจนสำหรับผู้ปกครองแล้วเด็กรู้ว่ามันจะต้องมีที่มากที่สุด 100% ของผู้ที่มีความสูงอย่างชัดเจน ซึ่งทำให้สามารถจำกัดความสูงของผู้ปกครองได้ (ในขณะที่ยังคงรักษาอัตราส่วนไว้)


4
นี่เป็นคำอธิบายที่มีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อผสมกับข้อมูลที่เพื่อนของฉันป้อน: "max-height: 100% (child) of max-height: 100% (parent) = 0 - นี่คือสาเหตุที่บุตรหลานของคุณไม่เคารพคุณค่าของผู้ปกครอง"
iamkeir

11
ฉันไม่แน่ใจว่าจะยอมรับคำตอบใด - คำตอบนี้ตอบว่า 'ทำไม'
iamkeir

ฉันตอบได้แค่ว่า 'ทำไม' เพราะฉันไม่แน่ใจว่าเป้าหมายของคุณคืออะไรเนื่องจากไม่ได้ระบุไว้อย่างชัดเจน บางทีถ้าคุณอธิบายอย่างละเอียดฉันก็ตอบได้
BoltClock

ยอมรับสิ่งนี้เนื่องจากตอบคำถามจริงของฉันขอบคุณ โปรดทราบคำตอบของ @ Daniel ด้านล่างเสนอการแก้ไข
iamkeir

ในกรณีของฉันการdisplay: flex; flex-direction: columnแก้ไขปัญหาและเพิ่มแถบเลื่อนที่ฉันต้องการ
xdevs23

73

ฉันเล่นรอบเล็กน้อย ในภาพขนาดใหญ่ใน firefox ฉันได้รับผลลัพธ์ที่ดีจากการใช้ค่าคุณสมบัติที่สืบทอดมา สิ่งนี้จะช่วยคุณได้หรือไม่?

.container {
    background: blue;
    padding: 10px;
    max-height: 100px;
    max-width: 100px;
    text-align:center;
}

img {
    max-height: inherit;
    max-width: inherit;
}

ฉันไม่แน่ใจว่าจะยอมรับคำตอบใด - คำตอบนี้ตอบโจทย์ 'การแก้ไข'
iamkeir

ยอมรับ @BoltClock สำหรับการตอบคำถาม แต่ขอขอบคุณที่เสนอการแก้ไข
iamkeir

1
นอกจาก @BoltClock แล้วคำตอบของฉันคือทำตามที่เขาพูด CSS เป็นเพียงการบอกคอมพิวเตอร์ถึงวิธีจัดการองค์ประกอบ แต่หลังจากคำนวณแล้วจะมีการคั่นค่าทั้งหมดลงไปเป็นค่าพื้นฐานที่จำเป็นสำหรับการแสดงผลเช่นความสูงความกว้างสีพิกัด ... คุณสมบัติการสืบทอดกำลังบอก img ถึง ใช้ค่า "คำนวณ" ของระดับบนสุด ดังนั้นคุณจะได้รับค่าที่คำนวณสำหรับความสูงและความกว้างในคุณสมบัติ css ความสูงสูงสุดและความกว้างสูงสุดของคุณ
Daniel

2
สิ่งนี้ใช้ไม่ได้เมื่อmax:height: 100%แทนที่จะเป็นความสูงคงที่: jsfiddle.net/umbreak/n6czk9xt/1
Didac Montero

2
dispaly: flex;ฉันไม่สามารถประกาศกว้างและความสูงเป็นสาเหตุคงรูปแบบของฉันคือการตอบสนอง ฉันเปิดเธรดใหม่: ฉันเปิดเธรดใหม่: stackoverflow.com/questions/29732391/… อย่างไรก็ตามในกรณีที่แย่กว่านั้นฉันสามารถใช้ Jquery เพื่อดึงความกว้างและความสูงจริง img และตั้งค่าใน div ของอิมเมจหลัก
Didac Montero

7

ฉันพบวิธีแก้ปัญหาที่นี่: http://www.sitepoint.com/maintain-image-aspect-ratios-responsive-web-design/

เคล็ดลับนี้เป็นไปได้เนื่องจากมีความสัมพันธ์ระหว่าง WIDTH และ PADDING-BOTTOM ขององค์ประกอบ ดังนั้น:

ผู้ปกครอง:

container {
  height: 0;
  padding-bottom: 66%; /* for a 4:3 container size */
  }

child ( ลบ css ทั้งหมดที่เกี่ยวข้องกับ widthเช่น width: 100%):

img {
  max-height: 100%;
  max-width: 100%;
  position: absolute;     
  display:block;
  margin:0 auto; /* center */
  left:0;        /* center */
  right:0;       /* center */
  }

5

คุณสามารถใช้คุณสมบัติobject-fit

.cover {
    object-fit: cover;
    width: 150px;
    height: 100px;
}

ชอบแนะนำที่นี่

คำอธิบายทั้งหมดของคุณสมบัตินี้โดย Chris Mills ใน Dev.Opera

และสิ่งที่ดีกว่าใน CSS-Tricks

ได้รับการสนับสนุนใน

  • Chrome 31+
  • Safari 7.1+
  • Firefox 36+
  • Opera 26+
  • Android 4.4.4+
  • iOS 8+

ฉันเพิ่งตรวจสอบว่า vivaldi และโครเมียมรองรับเช่นกัน (ไม่แปลกใจที่นี่)

ขณะนี้ยังไม่รองรับ IE แต่ ... ใครจะสนล่ะ? นอกจากนี้ iOS ยังรองรับ object-fit แต่ไม่ใช่ object-position แต่จะเร็ว ๆ นี้


ทางเลือกที่ดี! ฉันคิดว่าเฟล็กซ์บ็อกซ์อาจช่วยได้เช่นกันหากการย่อยสลายอย่างสง่างามใน IE เป็นที่ยอมรับได้
iamkeir

3

นี่คือวิธีแก้ปัญหาสำหรับคำถามที่เพิ่งเปิดเมื่อเร็ว ๆ นี้ซึ่งทำเครื่องหมายว่าซ้ำกับคำถามนี้ แท็กเกินสูงสุดความสูงของแม่<img><div>

หัก: ซอ

การทำงาน: Fiddle

ในกรณีนี้การเพิ่มแท็กdisplay:flexหลัก 2 <div>แท็กคือคำตอบ


3

แทนที่จะใช้ความสูงสูงสุด: 100% / 100% วิธีอื่นในการเติมพื้นที่ทั้งหมดจะใช้โดยposition: absoluteตั้งค่าบน / ล่าง / ซ้าย / ขวาเป็น 0

กล่าวอีกนัยหนึ่ง HTML จะมีลักษณะดังต่อไปนี้:

<div class="flex-content">
  <div class="scrollable-content-wrapper">
    <div class="scrollable-content">
      1, 2, 3
    </div>
   </div>
</div>
.flex-content {
  flex-grow: 1;
  position: relative;
  width: 100%;
  height: 100%;
}

.scrollable-content-wrapper {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  overflow: auto;
}

.scrollable-content {
}

คุณสามารถดูตัวอย่างสดได้ที่Codesandbox - Overflow ภายใน CSS Flex / Grid


2

อาจมีคนอื่นอธิบายสาเหตุที่อยู่เบื้องหลังปัญหาของคุณได้ แต่คุณสามารถแก้ปัญหาได้โดยระบุความสูงของคอนเทนเนอร์จากนั้นตั้งค่าความสูงของรูปภาพเป็น 100% มันเป็นสิ่งสำคัญที่ของภาพที่ปรากฏขึ้นก่อนwidthheight

<html>
    <head>
        <style>
            .container {  
                background: blue; 
                padding: 10px;
                height: 100%;
                max-height: 200px; 
                max-width: 300px; 
            }

            .container img {
                width: 100%;
                height: 100%
            }
        </style>
    </head>
    <body>
        <div class="container">
            <img src="http://placekitten.com/400/500" />
        </div>
    </body>
</html>

ถ้าพวกเขาต้องการให้คอนเทนเนอร์มีขนาดเล็กลงหากรูปภาพมีขนาดเล็กกว่า 200x200 ใช่จะต้องใช้ความสูงต่ำสุด / ความสูงสูงสุด
cimmanon

2

สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถทำได้คือตัวอย่างนี้:

http://jsfiddle.net/YRFJQ/1/

หรือ

.container {  
  background: blue; 
  border: 10px solid blue; 
  max-height: 200px; 
  max-width: 200px; 
  overflow:hidden;
  box-sizing:border-box;
}

img { 
  display: block;
  max-height: 100%; 
  max-width: 100%; 
}

ปัญหาหลักคือความสูงจะใช้เปอร์เซ็นต์ของความสูงของคอนเทนเนอร์ดังนั้นจึงต้องมองหาความสูงที่กำหนดไว้อย่างชัดเจนในคอนเทนเนอร์หลักไม่ใช่ความสูงสูงสุด

วิธีเดียวที่ฉันสามารถมองเห็นสิ่งนี้ได้คือซอด้านบนซึ่งคุณสามารถซ่อนส่วนที่ล้นออกมาได้ แต่ช่องว่างภายในยังคงทำหน้าที่เป็นช่องว่างที่มองเห็นได้เพื่อให้ภาพไหลเข้ามาดังนั้นการแทนที่ด้วยเส้นขอบทึบจะใช้งานได้แทน (แล้ว เพิ่ม border-box เพื่อให้เป็น 200px หากนั่นคือความกว้างที่คุณต้องการ)

ไม่แน่ใจว่าสิ่งนี้จะเข้ากับสิ่งที่คุณต้องการหรือไม่ แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้


น่าเสียดายที่การครอบตัดรูปภาพไม่เหมาะ ขอบคุณสำหรับข้อมูลของคุณ
iamkeir

1

ทางออกที่ดีคืออย่าใช้ความสูงกับผู้ปกครองและใช้เฉพาะกับลูกที่มีView Port :

ตัวอย่างซอ: https://jsfiddle.net/voan3v13/1/

body, html {
  width: 100%;
  height: 100%;
}
.parent {
  width: 400px;
  background: green;
}

.child {
  max-height: 40vh;
  background: blue;
  overflow-y: scroll;
}

1

โดยทั่วไปภาชนะบรรจุจะห่อหุ้มเนื้อหาไว้อย่างดีอยู่แล้ว มักจะไม่ได้ผลเช่นกัน: เด็ก ๆ ไม่ได้เติมเต็มบรรพบุรุษของพวกเขาอย่างดี ดังนั้นตั้งค่าความกว้าง / ความสูงของคุณในองค์ประกอบด้านในสุดแทนที่จะเป็นองค์ประกอบด้านนอกสุดแล้วปล่อยให้องค์ประกอบด้านนอกห่อหุ้มเนื้อหาไว้

.container {
    background: blue;
    padding: 10px;
}

img {
    display: block;
    max-height: 200px;
    max-width: 200px;
}

ใช้ดีฉันชอบสิ่งนี้
iamkeir


0

ภาชนะของคุณไม่มีความสูง

เพิ่มความสูง: 200px;

ไปที่คอนเทนเนอร์ css แล้วคิตตี้จะอยู่ข้างใน


ขอบคุณสำหรับข้อมูลที่ป้อน แต่ฉันระบุสิ่งนี้ใน OP
iamkeir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.