इस उत्तर के दो मुख्य भाग हैं:
- यह समझना कि सीएसएस ग्रिड में संरेखण कैसे काम करता है।
- सीएसएस ग्रिड में केंद्रित करने के लिए छह तरीके।
यदि आप केवल समाधानों में रुचि रखते हैं, तो पहले खंड को छोड़ दें।
ग्रिड लेआउट की संरचना और क्षेत्र
यह समझने के लिए कि ग्रिड कंटेनर में केंद्र कैसे काम करता है, पहले ग्रिड लेआउट की संरचना और दायरे को समझना महत्वपूर्ण है।
एक ग्रिड कंटेनर की HTML संरचना में तीन स्तर होते हैं:
ग्रिड गुणों को लागू करने के मामले में इनमें से प्रत्येक स्तर दूसरों से स्वतंत्र है।
गुंजाइश एक ग्रिड कंटेनर के एक माता पिता के बच्चे का रिश्ता तक सीमित है।
इसका मतलब है कि एक ग्रिड कंटेनर हमेशा माता-पिता होता है और एक ग्रिड आइटम हमेशा बच्चा होता है। ग्रिड गुण केवल इस रिश्ते के भीतर काम करते हैं।
बच्चों से परे एक ग्रिड कंटेनर के वंशज ग्रिड लेआउट का हिस्सा नहीं हैं और ग्रिड गुणों को स्वीकार नहीं करेंगे। (कम से कम तब तक नहीं जब तक कि यह subgrid
सुविधा लागू नहीं हो जाती है, जो कि ग्रिड आइटम के वंशजों को प्राथमिक कंटेनर की लाइनों का सम्मान करने की अनुमति देगा।)
यहां ऊपर वर्णित संरचना और गुंजाइश अवधारणाओं का एक उदाहरण है।
टिक-टैक-टो-जैसे ग्रिड की कल्पना करें।
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
आप चाहते हैं कि X और O प्रत्येक सेल में केंद्रित हों।
तो आप कंटेनर स्तर पर केंद्र को लागू करते हैं:
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
लेकिन ग्रिड लेआउट की संरचना और दायरे के justify-items
कारण, कंटेनर में ग्रिड आइटम होते हैं, सामग्री नहीं (कम से कम सीधे नहीं)।
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
align-items
इसके साथ एक ही समस्या : सामग्री एक उप-उत्पाद के रूप में केंद्रित हो सकती है, लेकिन आपने लेआउट डिज़ाइन खो दिया है।
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
align-items: center;
}
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
align-items: center;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
सामग्री को केंद्रित करने के लिए आपको एक अलग दृष्टिकोण लेने की आवश्यकता होती है। ग्रिड लेआउट की संरचना और दायरे का फिर से जिक्र करते हुए, आपको ग्रिड आइटम को माता-पिता और बच्चे के रूप में सामग्री का इलाज करने की आवश्यकता है।
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
section {
display: flex;
justify-content: center;
align-items: center;
border: 2px solid black;
font-size: 3em;
}
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
section {
display: flex;
justify-content: center;
align-items: center;
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
jsFiddle डेमो
सीएसएस ग्रिड में केंद्रित करने के लिए छह तरीके
ग्रिड आइटम और उनकी सामग्री को केंद्रित करने के लिए कई तरीके हैं।
यहाँ एक मूल 2x2 ग्रिड है:
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
flexbox
ग्रिड आइटम की सामग्री को केंद्रित करने के लिए एक सरल और आसान तरीके के लिए फ्लेक्सबॉक्स का उपयोग करें।
विशेष रूप से, फ्लेक्स कंटेनर में ग्रिड आइटम बनाते हैं।
इस पद्धति के साथ कोई संघर्ष, कल्पना उल्लंघन या अन्य समस्या नहीं है। यह साफ और मान्य है।
grid-item {
display: flex;
align-items: center;
justify-content: center;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex; /* new */
align-items: center; /* new */
justify-content: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
पूर्ण विवरण के लिए इस पोस्ट को देखें:
जाली का नक्शा
उसी तरह से कि एक फ्लेक्स आइटम भी एक फ्लेक्स कंटेनर हो सकता है, एक ग्रिड आइटम भी एक ग्रिड कंटेनर हो सकता है। यह समाधान ऊपर दिए गए फ्लेक्सबॉक्स समाधान के समान है, सिवाय इसके कि ग्रिड के साथ केन्द्रित किया जाता है, न कि फ्लेक्स, गुणों के साथ।
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: grid; /* new */
align-items: center; /* new */
justify-items: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
auto
मार्जिन
margin: auto
लंबवत और क्षैतिज रूप से केंद्र ग्रिड आइटम का उपयोग करें ।
grid-item {
margin: auto;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
margin: auto;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
ग्रिड आइटम की सामग्री को केंद्र में रखने के लिए आपको आइटम को ग्रिड (या फ्लेक्स) कंटेनर में बनाने की जरूरत है, अपने स्वयं के तत्वों में अनाम आइटम लपेटें ( क्योंकि वे सीधे सीएसएस द्वारा लक्षित नहीं किए जा सकते हैं ), और नए तत्वों के लिए मार्जिन लागू करें।
grid-item {
display: flex;
}
span, img {
margin: auto;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex;
}
span, img {
margin: auto;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
बॉक्स संरेखण गुण
ग्रिड आइटम संरेखित करने के लिए निम्नलिखित गुणों का उपयोग करते समय, auto
ऊपर दिए गए मार्जिन पर अनुभाग पढ़ें ।
align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
एक ग्रिड आइटम में क्षैतिज रूप से सामग्री को केंद्र में रखने के लिए, आप text-align
संपत्ति का उपयोग कर सकते हैं।
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
ध्यान दें कि ऊर्ध्वाधर केंद्र के लिए, vertical-align: middle
काम नहीं करेगा।
ऐसा इसलिए है क्योंकि vertical-align
संपत्ति केवल इनलाइन और टेबल-सेल कंटेनरों पर लागू होती है।
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* <--- works */
vertical-align: middle; /* <--- fails */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
कोई कह सकता है कि display: inline-grid
एक इनलाइन-स्तरीय कंटेनर स्थापित करता है, और यह सच होगा। तो क्यों vertical-align
ग्रिड आइटम में काम नहीं करता है ?
कारण यह है कि एक ग्रिड स्वरूपण संदर्भ में , आइटम को ब्लॉक-स्तरीय तत्वों के रूप में माना जाता है।
6.1। ग्रिड आइटम प्रदर्शन
display
एक ग्रिड आइटम के मूल्य है blockified : यदि निर्दिष्ट display
एक तत्व एक ग्रिड कंटेनर पैदा करने का इन-प्रवाह बच्चे की एक इनलाइन स्तर के मूल्य है, यह अपने ब्लॉक स्तर बराबर करने के लिए गणना करता है।
एक में ब्लॉक स्वरूपण संदर्भ , कुछ vertical-align
संपत्ति मूल रूप से के लिए डिजाइन किया गया था, ब्राउज़र एक इनलाइन स्तर के कंटेनर में एक ब्लॉक स्तर तत्व पाने की उम्मीद नहीं है। यह अमान्य HTML है।
सीएसएस पोजिशनिंग
अन्त में, सामान्य सीएसएस केन्द्रित समाधान है जो ग्रिड में भी काम करता है: पूर्ण स्थिति
यह ऑब्जेक्ट्स को केंद्रित करने के लिए एक अच्छी विधि है जिसे दस्तावेज़ प्रवाह से निकालने की आवश्यकता है। उदाहरण के लिए, यदि आप चाहते हैं:
बस position: absolute
केंद्रित होने वाले तत्व पर सेट करें , और position: relative
पूर्वज पर जो युक्त ब्लॉक के रूप में काम करेगा (यह आमतौर पर माता-पिता है)। कुछ इस तरह:
grid-item {
position: relative;
text-align: center;
}
span {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
position: relative;
text-align: center;
}
span, img {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
यह विधि कैसे काम करती है, इसके लिए यहां एक पूर्ण विवरण दिया गया है:
यहाँ ग्रिड कल्पना में पूर्ण स्थिति पर अनुभाग है: