इस लेआउट को प्राप्त करने के लिए नीचे पांच विकल्प दिए गए हैं:
- सीएसएस पोजिशनिंग
- अदृश्य डोम तत्व के साथ फ्लेक्सबॉक्स
- अदृश्य छद्म तत्व के साथ फ्लेक्सबॉक्स
- फ्लेक्सबॉक्स के साथ
flex: 1
- सीएसएस ग्रिड लेआउट
विधि # 1: सीएसएस पोजिशनिंग गुण
position: relativeफ्लेक्स कंटेनर पर लागू करें ।
position: absoluteआइटम डी पर लागू करें ।
अब यह आइटम फ्लेक्स कंटेनर के भीतर बिल्कुल स्थित है।
अधिक विशेष रूप से, आइटम डी को दस्तावेज़ प्रवाह से हटा दिया जाता है, लेकिन निकटतम तैनात पूर्वज की सीमा के भीतर रहता है ।
CSS ऑफसेट गुणों का उपयोग करें topऔर rightइस तत्व को स्थिति में ले जाने के लिए।
li:last-child {
position: absolute;
top: 0;
right: 0;
background: #ddd;
}
ul {
position: relative;
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
li {
display: flex;
margin: 1px;
padding: 5px;
background: #aaa;
}
p {
text-align: center;
margin-top: 0;
}
span {
background-color: aqua;
}
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>true center</span></p>
इस विधि के लिए एक चेतावनी यह है कि कुछ ब्राउज़र सामान्य प्रवाह से पूरी तरह से तैनात फ्लेक्स आइटम को पूरी तरह से हटा नहीं सकते हैं। यह गैर-मानक, अप्रत्याशित तरीके से संरेखण को बदलता है। अधिक विवरण: IE11 में सामान्य प्रवाह से बिल्कुल तैनात फ्लेक्स आइटम को हटाया नहीं जाता है
विधि # 2: फ्लेक्स ऑटो मार्जिन और अदृश्य फ्लेक्स आइटम (DOM तत्व)
मार्जिन के संयोजन के साथauto और एक नए, अदृश्य फ्लेक्स आइटम के लेआउट को प्राप्त किया जा सकता है।
नया फ्लेक्स आइटम आइटम डी के समान है और इसे विपरीत छोर (बाएं किनारे) पर रखा गया है।
अधिक विशेष रूप से, क्योंकि फ्लेक्स संरेखण मुक्त स्थान के वितरण पर आधारित है, नई वस्तु तीन मध्य बक्से को क्षैतिज रूप से केंद्रित रखने के लिए एक आवश्यक असंतुलन है। नया आइटम मौजूदा डी आइटम के समान चौड़ाई होना चाहिए, या मध्य बक्से ठीक से केंद्रित नहीं होंगे।
नए आइटम को देखने से हटा दिया जाता है visibility: hidden।
संक्षेप में:
Dतत्व का डुप्लिकेट बनाएं ।
- इसे सूची की शुरुआत में रखें।
- उपयोग फ्लेक्स
autoमार्जिन रखने के लिए A, Bऔर Cकेंद्रित है, दोनों के साथ Dतत्वों दोनों सिरों से बराबर संतुलन बनाने।
visibility: hiddenडुप्लिकेट पर लागू करेंD
li:first-child {
margin-right: auto;
visibility: hidden;
}
li:last-child {
margin-left: auto;
background: #ddd;
}
ul {
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
li {
display: flex;
margin: 1px;
padding: 5px;
background: #aaa;
}
p { text-align: center; margin-top: 0; }
span { background-color: aqua; }
<ul>
<li>D</li><!-- new; invisible spacer item -->
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>true center</span></p>
विधि # 3: फ्लेक्स ऑटो मार्जिन और अदृश्य फ्लेक्स आइटम (छद्म तत्व)
यह विधि # 2 के समान है, सिवाय इसके कि यह शब्दार्थिक रूप से क्लीनर है और इसकी चौड़ाई Dज्ञात होनी चाहिए।
- के रूप में एक ही चौड़ाई के साथ एक छद्म तत्व बनाएँ
D।
- इसे कंटेनर की शुरुआत में रखें
::before।
autoरखने के लिए फ्लेक्स मार्जिन का उपयोग करें A, Bऔर Cपूरी तरह से केन्द्रित, छद्म और Dतत्वों दोनों सिरों से समान संतुलन बनाने के लिए।
ul::before {
content:"D";
margin: 1px auto 1px 1px;
visibility: hidden;
padding: 5px;
background: #ddd;
}
li:last-child {
margin-left: auto;
background: #ddd;
}
ul {
padding: 0;
margin: 0;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
li {
display: flex;
margin: 1px;
padding: 5px;
background: #aaa;
}
p { text-align: center; margin-top: 0; }
span { background-color: aqua; }
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>true center</span></p>
विधि # 4: जोड़ें flex: 1 बाएँ और दाएँ आइटम में
समान संतुलन बनाए रखने के लिए बाएँ और दाएँ आइटम के लिए समान चौड़ाई के बारे में चिंता करने के बजाय, विधि # 2 या # 3 से शुरू करना, बस एक-दूसरे को देना flex: 1 । यह उन दोनों को उपलब्ध स्थान का उपभोग करने के लिए मजबूर करेगा, इस प्रकार मध्य वस्तु को केंद्रित करना।
फिर आप display: flexउनकी सामग्री को संरेखित करने के लिए अलग-अलग मदों में जोड़ सकते हैं ।
इस पद्धति का उपयोग करने के बारे में min-heightध्यान दें : वर्तमान में क्रोम, फ़ायरफ़ॉक्स, एज और संभवतः अन्य ब्राउज़रों में, शॉर्टहैंड नियम इसके लिएflex: 1टूट जाता है:
flex-grow: 1
flex-shrink: 1
flex-basis: 0%
यही कारण है कि प्रतिशत इकाई (%) पर flex-basisकारणों इस विधि जब तोड़ने के लिए min-heightकंटेनर पर प्रयोग किया जाता है। ऐसा इसलिए है, क्योंकि एक सामान्य नियम के रूप में, बच्चों पर प्रतिशत ऊंचाइयों को स्पष्ट रूप से देखने की आवश्यकता होती हैheight लिए माता-पिता को संपत्ति की ।
यह एक पुराना CSS नियम है जो 1998 ( CSS लेवल 2 ) के पीछे है जो अभी भी कई ब्राउज़रों में कुछ हद तक या किसी अन्य के प्रभाव में है। पूर्ण विवरण के लिए यहां और यहां देखें ।
यहाँ उपयोगकर्ता 2651804 द्वारा टिप्पणियों में पोस्ट की गई समस्या का एक चित्रण है :
#flex-container {
display: flex;
flex-direction: column;
background: teal;
width: 150px;
min-height: 80vh;
justify-content: space-between;
}
#flex-container>div {
background: orange;
margin: 5px;
}
#flex-container>div:first-child {
flex: 1;
}
#flex-container::after {
content: "";
flex: 1;
}
<div id="flex-container">
<div>very long annoying text that will add on top of the height of its parent</div>
<div>center</div>
</div>
इसका समाधान प्रतिशत इकाई का उपयोग नहीं करना है। कोशिश करो pxया बस कुछ भी नहीं ( जो वास्तव में कल्पना की सिफारिश करता है , इस तथ्य के बावजूद कि कम से कम कुछ प्रमुख ब्राउज़रों ने किसी भी कारण से प्रतिशत इकाई को जोड़ दिया है)।
#flex-container {
display: flex;
flex-direction: column;
background: teal;
width: 150px;
min-height: 80vh;
justify-content: space-between;
}
#flex-container > div {
background: orange;
margin: 5px;
}
/* OVERRIDE THE BROWSER SETTING IN THE FLEX PROPERTY */
#flex-container > div:first-child {
flex: 1;
flex-basis: 0;
}
#flex-container::after {
content: "";
flex: 1;
flex-basis: 0;
}
/* OR... JUST SET THE LONG-HAND PROPERTIES INDIVIDUALLY
#flex-container > div:first-child {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
#flex-container::after {
content: "";
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
*/
<div id="flex-container">
<div>very long annoying text that will add on top of the height of its parent</div>
<div>center</div>
</div>
विधि # 5: CSS ग्रिड लेआउट
यह सबसे साफ और सबसे कुशल तरीका हो सकता है। पूर्ण स्थिति, नकली तत्वों या अन्य हैकरी की कोई आवश्यकता नहीं है।
बस कई कॉलम के साथ एक ग्रिड बनाएं। फिर अपने आइटम को मध्य और अंत कॉलम में रखें। मूल रूप से, बस पहला कॉलम खाली छोड़ दें।
ul {
display: grid;
grid-template-columns: 1fr repeat(3, auto) 1fr;
grid-column-gap: 5px;
justify-items: center;
}
li:nth-child(1) { grid-column-start: 2; }
li:nth-child(4) { margin-left: auto; }
/* for demo only */
ul { padding: 0; margin: 0; list-style: none; }
li { padding: 5px; background: #aaa; }
p { text-align: center; }
<ul>
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
<p><span>| true center |</span></p>