उपाय
नेस्टेड फ्लेक्स कंटेनर का उपयोग करें।
प्रतिशत ऊंचाइयों से छुटकारा पाएं। तालिका गुणों से छुटकारा पाएं। छुटकारा पाना vertical-align
। पूर्ण स्थिति से बचें। बस फ्लेक्सबॉक्स के माध्यम से सभी तरह से छड़ी।
display: 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% }
वेबकिट (क्रोम) में काम नहीं कर रहा है।
यह काम नहीं कर रहा है क्योंकि आप प्रतिशत ऊंचाई का उपयोग इस तरह से कर रहे हैं जो कल्पना के पारंपरिक कार्यान्वयन के अनुरूप नहीं है।
10.5 सामग्री ऊंचाई: height
संपत्ति
प्रतिशत
एक प्रतिशत ऊंचाई निर्दिष्ट करता है। प्रतिशत की गणना उत्पन्न बॉक्स की ऊंचाई के संबंध में की जाती है। यदि युक्त ब्लॉक की ऊंचाई स्पष्ट रूप से निर्दिष्ट नहीं है और यह तत्व पूरी तरह से तैनात नहीं है, तो मान गणना करता है auto
।
ऑटो
ऊँचाई अन्य गुणों के मूल्यों पर निर्भर करती है।
दूसरे शब्दों में, इन-फ्लो बच्चे पर काम करने के लिए प्रतिशत ऊंचाई के लिए, माता-पिता के पास एक निश्चित ऊंचाई होनी चाहिए ।
आपके कोड में, शीर्ष-स्तरीय कंटेनर में एक परिभाषित ऊँचाई होती है: .container { height: 20em; }
तीसरे स्तर के कंटेनर में एक परिभाषित ऊंचाई होती है: .item-inner { height: 100%; }
लेकिन उनके बीच, दूसरे स्तर के कंटेनर - .item
- में एक परिभाषित ऊंचाई नहीं है। वेबकिट एक लापता लिंक के रूप में देखता है।
.item-inner
Chrome को बता रहा है: मुझे दे दोheight: 100%
। .item
संदर्भ के लिए Chrome माता-पिता को देखता है ( उत्तर देता है): 100% क्या? मुझे कुछ भी दिखाई नहीं दे रहा है ( flex: 1
नियम की अनदेखी )। नतीजतन, यह height: auto
कल्पना के अनुसार (सामग्री ऊंचाई) लागू होता है ।
दूसरी ओर, फ़ायरफ़ॉक्स, अब बच्चे के प्रतिशत की ऊँचाई के संदर्भ के रूप में माता-पिता के लचीले कद को स्वीकार करता है। IE11 और एज फ्लेक्स हाइट्स को भी स्वीकार करते हैं।
साथ ही, यदि कोई (कोई संख्यात्मक मान कार्य ( नहीं) सहित ) के साथ संयोजन में उपयोग किया जाता है , तो क्रोम flex-grow
एक पर्याप्त मूल संदर्भ के रूप में स्वीकार करेगा । इस लेखन के रूप में, हालांकि, यह समाधान सफारी में विफल रहता है।flex-basis
auto
flex-basis: 0
#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. सभी मूल तत्वों पर एक ऊँचाई निर्दिष्ट करें
एक विश्वसनीय क्रॉस-ब्राउज़र समाधान सभी मूल तत्वों पर एक ऊंचाई निर्दिष्ट करना है। यह गुम लिंक को रोकता है, जिसे वेबकिट-आधारित ब्राउज़र कल्पना का उल्लंघन मानते हैं।
ध्यान दें कि min-height
और max-height
स्वीकार्य नहीं हैं। यह height
संपत्ति होनी चाहिए ।
यहां अधिक विवरण: CSS height
संपत्ति और प्रतिशत मूल्यों के साथ कार्य करना
2. सीएसएस सापेक्ष और पूर्ण स्थिति
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
। पूर्ण स्थिति से बचें। बस फ्लेक्सबॉक्स के माध्यम से सभी तरह से छड़ी।
display: 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>