สารละลาย
ใช้เฟล็กซ์เฟล็กคอนเทนเนอร์
กำจัดเปอร์เซ็นต์ความสูง กำจัดคุณสมบัติของตาราง vertical-align
กำจัด หลีกเลี่ยงการวางตำแหน่งที่แน่นอน เพียงติดกับ flexbox ตลอดทาง
นำdisplay: flex
ไปใช้กับรายการ flex ( .item
) ทำให้มันเป็นภาชนะบรรจุแบบยืดหยุ่น สิ่งนี้จะตั้งค่าโดยอัตโนมัติalign-items: stretch
ซึ่งบอกลูก ( .item-inner
) เพื่อขยายความสูงเต็มของพาเรนต์
สำคัญ: ลบความสูงที่ระบุออกจากไอเท็มเฟล็กเพื่อให้วิธีนี้ใช้งานได้ หากเด็กมีความสูงที่ระบุ (เช่นheight: 100%
) มันจะไม่สนใจการalign-items: stretch
มาจากผู้ปกครอง สำหรับstretch
ค่าเริ่มต้นในการทำงานความสูงของเด็กจะต้องคำนวณauto
(คำอธิบายแบบเต็ม )
ลองใช้ (ไม่มีการเปลี่ยนแปลง HTML):
.container {
display: flex;
flex-direction: column;
height: 20em;
border: 5px solid black
}
.item {
display: flex; /* new; nested flex container */
flex: 1;
border-bottom: 1px solid white;
}
.item-inner {
display: flex; /* new; nested flex container */
flex: 1; /* new */
/* height: 100%; <-- remove; unnecessary */
/* width: 100%; <-- remove; unnecessary */
/* display: table; <-- remove; unnecessary */
}
a {
display: flex; /* new; nested flex container */
flex: 1; /* new */
align-items: center; /* new; vertically center text */
background: orange;
/* display: table-cell; <-- remove; unnecessary */
/* vertical-align: middle; <-- remove; unnecessary */
}
<div class="container">
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
</div>
การสาธิต jsFiddle
คำอธิบาย
ปัญหาของฉัน.item-inner { height: 100% }
คือไม่ทำงานใน webkit (Chrome)
มันไม่ทำงานเพราะคุณใช้เปอร์เซ็นต์ความสูงในวิธีที่ไม่สอดคล้องกับการนำข้อมูลจำเพาะไปใช้
10.5 ความสูงของเนื้อหา: height
คุณสมบัติ
ร้อยละ
ระบุความสูงร้อยละ เปอร์เซ็นต์จะถูกคำนวณตามความสูงของบล็อกที่มีกล่องที่สร้างขึ้น auto
ถ้าความสูงของตึกมีที่ไม่ได้ระบุไว้อย่างชัดเจนและองค์ประกอบนี้จะไม่ได้ตำแหน่งอย่างนั้นคำนวณค่า
อัตโนมัติ
ความสูงขึ้นอยู่กับค่าของคุณสมบัติอื่น ๆ
กล่าวอีกนัยหนึ่งสำหรับความสูงร้อยละที่จะทำงานกับเด็กในการไหลผู้ปกครองจะต้องมีความสูงที่กำหนด
ในรหัสของคุณคอนเทนเนอร์ระดับบนสุดมีความสูงที่กำหนด: .container { height: 20em; }
คอนเทนเนอร์ระดับที่สามมีความสูงที่กำหนด: .item-inner { height: 100%; }
แต่ระหว่างนั้นคอนเทนเนอร์ระดับที่สอง - .item
- ไม่มีความสูงที่กำหนด Webkit เห็นว่าเป็นลิงค์ที่ขาดหายไป
.item-inner
จะบอก Chrome: ให้ฉัน height: 100%
Chrome มองไปที่ parent ( .item
) เพื่อการอ้างอิงและตอบสนอง: 100% ของอะไร? ฉันไม่เห็นอะไรเลย (ไม่สนใจflex: 1
กฎที่มี) เป็นผลให้มันใช้height: auto
(ความสูงของเนื้อหา) ตามข้อกำหนด
Firefox ในขณะนี้ยอมรับความสูงเฟล็กซ์ของผู้ปกครองเป็นการอ้างอิงสำหรับความสูงร้อยละของเด็ก IE11 และ Edge ยอมรับความยืดหยุ่นสูงเช่นกัน
นอกจากนี้ Chrome จะยอมรับflex-grow
การอ้างอิงหลักอย่างเพียงพอหากใช้ร่วมกับflex-basis
(ค่าตัวเลขใด ๆ ที่ใช้งานได้ ( auto
จะไม่) รวมถึงflex-basis: 0
) อย่างไรก็ตามจากการเขียนนี้การแก้ปัญหานี้ล้มเหลวใน Safari
#outer {
display: flex;
flex-direction: column;
height: 300px;
background-color: white;
border: 1px solid red;
}
#middle {
flex-grow: 1;
flex-basis: 1px;
background-color: yellow;
}
#inner {
height: 100%;
background-color: lightgreen;
}
<div id="outer">
<div id="middle">
<div id="inner">
INNER
</div>
</div>
</div>
โฟร์โซลูชั่น
1. ระบุความสูงขององค์ประกอบหลักทั้งหมด
โซลูชันข้ามเบราว์เซอร์ที่เชื่อถือได้คือการระบุความสูงขององค์ประกอบหลักทั้งหมด การทำเช่นนี้จะป้องกันการเชื่อมโยงที่ขาดหายไปซึ่งเบราว์เซอร์ที่ใช้ Webkit จะพิจารณาการละเมิดข้อกำหนด
โปรดทราบว่าmin-height
และmax-height
ไม่สามารถยอมรับได้ มันจะต้องเป็นheight
ทรัพย์สิน
รายละเอียดเพิ่มเติมได้ที่นี่: การทำงานกับheight
คุณสมบัติCSS และค่าเปอร์เซ็นต์
2. CSS ความสัมพันธ์ & การกำหนดตำแหน่งแบบสัมบูรณ์
นำposition: relative
ไปใช้กับผู้ปกครองและposition: absolute
กับเด็ก
ขนาดเด็กที่มีheight: 100%
และหรือใช้คุณสมบัติชดเชย:width: 100%
, , ,top: 0
right: 0
bottom: 0
left: 0
ด้วยการกำหนดตำแหน่งที่แน่นอนเปอร์เซ็นต์ความสูงจะทำงานโดยไม่มีความสูงที่ระบุบนพาเรนต์
3. ลบคอนเทนเนอร์ HTML ที่ไม่จำเป็น (แนะนำ)
จำเป็นต้องมีตู้คอนเทนเนอร์สองตู้button
หรือไม่? ทำไมไม่ลบ.item
หรือ.item-inner
หรือทั้งสองอย่าง แม้ว่าbutton
องค์ประกอบบางครั้งจะล้มเหลวในฐานะภาชนะบรรจุแบบยืดหยุ่นแต่ก็อาจเป็นรายการที่ยืดหยุ่นได้ พิจารณาสร้างbutton
เด็ก.container
หรือหรือ.item
ลบมาร์คฟรี
นี่คือตัวอย่าง:
.container {
height: 20em;
display: flex;
flex-direction: column;
border: 5px solid black
}
a {
flex: 1;
background: orange;
border-bottom: 1px solid white;
display: flex; /* nested flex container (for aligning text) */
align-items: center; /* center text vertically */
justify-content: center; /* center text horizontally */
}
<div class="container">
<a>Button</a>
<a>Button</a>
<a>Button</a>
</div>
4. ภาชนะบรรจุแบบซ้อน (แนะนำ)
กำจัดเปอร์เซ็นต์ความสูง กำจัดคุณสมบัติของตาราง vertical-align
กำจัด หลีกเลี่ยงการวางตำแหน่งที่แน่นอน เพียงติดกับ flexbox ตลอดทาง
นำdisplay: flex
ไปใช้กับรายการ flex ( .item
) ทำให้มันเป็นภาชนะบรรจุแบบยืดหยุ่น สิ่งนี้จะตั้งค่าโดยอัตโนมัติalign-items: stretch
ซึ่งบอกลูก ( .item-inner
) เพื่อขยายความสูงเต็มของพาเรนต์
สำคัญ: ลบความสูงที่ระบุออกจากไอเท็มเฟล็กเพื่อให้วิธีนี้ใช้งานได้ หากเด็กมีความสูงที่ระบุ (เช่นheight: 100%
) มันจะไม่สนใจการalign-items: stretch
มาจากผู้ปกครอง สำหรับstretch
ค่าเริ่มต้นในการทำงานความสูงของเด็กจะต้องคำนวณauto
(คำอธิบายแบบเต็ม )
ลองใช้ (ไม่มีการเปลี่ยนแปลง HTML):
.container {
display: flex;
flex-direction: column;
height: 20em;
border: 5px solid black
}
.item {
display: flex; /* new; nested flex container */
flex: 1;
border-bottom: 1px solid white;
}
.item-inner {
display: flex; /* new; nested flex container */
flex: 1; /* new */
/* height: 100%; <-- remove; unnecessary */
/* width: 100%; <-- remove; unnecessary */
/* display: table; <-- remove; unnecessary */
}
a {
display: flex; /* new; nested flex container */
flex: 1; /* new */
align-items: center; /* new; vertically center text */
background: orange;
/* display: table-cell; <-- remove; unnecessary */
/* vertical-align: middle; <-- remove; unnecessary */
}
<div class="container">
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
</div>