CSS ग्रिड (Grid) से ऑफ-कैनवास (Off-Canvas) कैसे बनाये
() translation by (you can also view the original English article)
रेस्पॉन्सिव नेविगेशन को प्राप्त करने के लिए ऑफ-कैनवास (off-canvas) का पैटर्न एक क्लासिक एप्रोच है. जब viewport इतना छोटा हो जाये की इसे वारंट कर सके, तो भारी नेविगेशन "ऑफ-कैनवास" में छुप जाएगा और सिर्फ toggle होने पर ही वापस नजर आएगा.
आज हम ऑफ-कैनवास वाला नेविगेशन बनाएंगे, CSS का प्रयोग करके toggle करेंगे (JavaScript की जरूरत नहीं है) और हमारे अच्छे मित्र Grid का प्रयोग हम पेज के स्ट्रक्चर को बनाने में करेंगे. हम क्या करने वाले हैं, यह उसका फुल पेज डेमो है.
सामान्य सा पेज स्ट्रक्चर
आईये एक सामान्य सा पेज बनाकर शुरू करें; हम कुछ इस प्रकार का बनाना चाहते हैं:
यह एक काफी टिपिकल (typical) अर्थपूर्ण (semantic) पेज का स्ट्रक्चर है; आप देखेंगे की छोटे viewports में सभी कुछ एक कॉलम में ही रहेगा, पर बड़ी स्क्रीन पर aside एक तरफ चला जायेगा. <nav>
एलिमेंट को नीले रंग से हाईलाइट किया गया है.
यहाँ हमारा मार्कअप है
1 |
<header role="banner"> |
2 |
<h1>Header</h1> |
3 |
</header>
|
4 |
|
5 |
<nav id="nav" role="navigation"> |
6 |
<ul>
|
7 |
<li>
|
8 |
<a href="#">Item 1</a> |
9 |
</li>
|
10 |
<li>
|
11 |
<a href="#">Item 2</a> |
12 |
</li>
|
13 |
<li>
|
14 |
<a href="#">Item 3</a> |
15 |
</li>
|
16 |
</ul>
|
17 |
</nav>
|
18 |
|
19 |
<section role="main"> |
20 |
<article>
|
21 |
<h2>Article</h2> |
22 |
<p>Curabitur orci lacus, auctor ut facilisis nec, ultricies quis nibh. Phasellus id diam sollicitudin, malesuada turpis id, gravida erat. Maecenas placerat elit vel hendrerit convallis. Sed in mauris ut justo vulputate viverra feugiat ac dui. Fusce feugiat arcu in vehicula vehicula. Donec varius justo at nulla aliquet volutpat.</p> |
23 |
<p>Ut id rutrum eros. Nulla tristique, magna et mattis vulputate, mi eros suscipit turpis, nec bibendum turpis nunc feugiat sapien. Nunc arcu est, lacinia id diam quis, sagittis euismod neque. Nullam fringilla velit sed porta gravida. Proin eu vulputate libero. Ut a lacinia enim. Etiam venenatis mauris et orci tempor congue. Sed tempor eros et ultricies congue. Aenean sed efficitur orci. Nulla vel tempus mi.</p> |
24 |
<p>Ut cursus suscipit augue, id sagittis nibh faucibus eget. Etiam suscipit ipsum eu augue ultricies, at rhoncus mi faucibus. In et tellus vitae leo scelerisque fringilla nec at nunc.</p> |
25 |
</article>
|
26 |
</section>
|
27 |
|
28 |
<aside>
|
29 |
<h3>Aside</h3> |
30 |
</aside>
|
31 |
|
32 |
<footer>
|
33 |
<h3>Footer</h3> |
34 |
</footer>
|
अब चलो कुछ visual styles और कुछ ग्रिड के नियम जोड़ते हैं.
इसके साथ कुछ Griddy करते हैं
किसी तरह के element में हमारे सभी structural elements को लपेटकर शुरू करें- यह हमारा ग्रिड कंटेनर होगा. मैं <div class="container"></div>
का प्रयोग कर रहा हूँ.
अब कुछ बुनियादी ग्रिड styles को जोड़ें:
1 |
.container { |
2 |
display: grid; |
3 |
grid-template-columns: 1fr; |
4 |
grid-gap: 10px; |
5 |
}
|
यहां हम यह declare कर रहे हैं कि कंटेनर को display: grid;
होना चाहिए, इसके पास एक fractional यूनिट का एक कॉलम होना चाहिए (इस पॉइंट पर यह बहुत आवश्यक नहीं है, लेकिन इसे पूरी तरह से (thorough) जोड़ दिया गया है), और यह कि सभी ग्रिड items के बीच का अंतर 10px होना चाहिए
इसके बाद चीजें थोड़ी साफ करने के लिए कुछ visual styles को जोड़ दें
1 |
.container > * { |
2 |
color: #353535; |
3 |
font-size: 1.2em; |
4 |
line-height: 1.5; |
5 |
padding: 20px; |
6 |
background: #d0cfc5; |
7 |
}
|
8 |
|
9 |
.container nav { |
10 |
background: #136fd2; |
11 |
}
|
12 |
|
13 |
nav ul { |
14 |
list-style: none; |
15 |
margin: 0; |
16 |
padding: 0; |
17 |
}
|
18 |
|
19 |
nav a { |
20 |
color: #d0cfc5 |
21 |
}
|
22 |
|
23 |
nav a:hover { |
24 |
text-decoration: none; |
25 |
}
|
इसे Responsive बनाओ
चलो एक मीडिया query जोड़ते हैं, ताकि जब viewport एक निश्चित आकार को हिट करता है (चलो 600px के लिए चलते हैं) layout परिवर्तित होता है.
1 |
@media only screen and (min-width: 600px) { |
2 |
|
3 |
/* grid */
|
4 |
.container { |
5 |
grid-template-columns: repeat(4, 1fr); |
6 |
}
|
7 |
|
8 |
/* specific item styles */
|
9 |
|
10 |
.container header, |
11 |
.container nav, |
12 |
.container footer { |
13 |
grid-column: span 4; |
14 |
}
|
15 |
.container section { |
16 |
grid-column: span 3; |
17 |
}
|
18 |
|
19 |
}
|
तो अब, बड़ी स्क्रीन पर, ग्रिड declaration grid-template-column: repeat(4, 1fr);
में बदलती है: यह हमें समान चौड़ाई के चार column को देता है, इसलिए हमें यह declare करना होगा कि हम अपने प्रत्येक structural elements को कितना फैलाना चाहते हैं. header
, nav
और footer
सभी 4 में फैले (चार columns में फैले हुए) होंगे, जबकि section
सिर्फ तीन ही में span होगा, एक column के गैप को aside
के लिए छोड़ेंगे ताकि वह खुद ब खुद भर जाए.
आखिरकार, nav के दिखने के तरीके को बदलने के लिए कुछ styles:
1 |
/* nav styles */
|
2 |
nav ul li { |
3 |
display: inline-block; |
4 |
padding: 0 20px 0 0; |
5 |
}
|
हमारे पास अब तक क्या है:
Venturing Off-Canvas
यह एक सही उदाहरण है कि कैसे CSS positioning अब भी एक घोषित (declared) ग्रिड के भीतर, structural elements पर काम कर सकता है। हम अपने nav को पकड़ने, इसे दस्तावेज़ के प्रवाह से हटाने, और इसे off-canvas की स्थिति में ले जाने के लिए जा रहे हैं. अन्य ग्रिड items ठीक जगह में सही तरीके से प्लेस हो जायेंगे.
अन्य मीडिया query से शुरू करें. हमारे पास पहले से ही हमारी min-width
वाली query है, लेकिन इस समय हम केवल एक max-width
तक एलिमेंट को स्टाइल देना चाहते हैं। जब तक हमारा viewport मैजिक 600px तक पहुंचता नहीं है, हम चाहते हैं कि nav off-canvas की स्थिति में बने रहें:
1 |
@media only screen and (max-width: 599px) { |
2 |
|
3 |
#nav { |
4 |
position: fixed; /* or choose `absolute` depending on desired behavior*/ |
5 |
top: 0; |
6 |
bottom: 0; |
7 |
width: 300px; |
8 |
left: -340px; |
9 |
transition: left .3s ease-in-out; |
10 |
}
|
11 |
|
12 |
}
|
हमने nav को एक फिक्स चौड़ाई दी है, इसको पूरी तरह से छिपाने के लिए इसकी पोजीशन जरूरत के हिसाब से लेफ्ट की गयी है. हमने पोजीशन fixed
भी की है, हालांकि आप absolute
का उपयोग कर सकते हैं यह इस बात पर निर्भर करता है की आप nav को विंडो के साथ स्क्रॉल करना चाहते हैं या नहीं.
आप transition
के नियम भी देखेंगे, जो एक बार हमारे toggle कंट्रोल बनाने के बाद प्रभावी होंगे।
Toggling
हमारे nav के गायब होने के बाद, हमें अब जरूरत पड़ने पर इसे वापस लाने के लिए कुछ कंट्रोल की ज़रूरत है। चलो इसे ट्रिगर करने के लिए एक लिंक जोड़ते हैं, और इसे फिर से बंद करने के लिए एक लिंक।
इसे header में जोड़ें
1 |
<a class="toggle open" href="#nav">open</a> |
और इसे nav में:
1 |
<a class="toggle close" href="#">close</a> |
2 |
<!-- you might also want to use a “×” -->
|
हमें बड़ी स्क्रीन पर दिखाई देने के लिए open लिंक की ज़रूरत नहीं है, इसलिए हम हमारे min-width मीडिया query के भीतर toggle elements को छिपाएंगे:
1 |
.toggle { |
2 |
display: none; |
3 |
}
|
लक्ष्य
उपरोक्त लिंक्स में क्या महत्वपूर्ण है "fragment identifier" (href में #nav
) की उपस्थिति. ये identifier किसी पृष्ठ पर विशिष्ट elements को सीधे नेविगेट करने के लिए ब्राउज़र द्वारा उपयोग किया जाता है. इस मामले में, हम जो भी element id "nav" से मेल खाता है, को लक्षित कर रहे हैं, और एक बार इसे लक्षित किया गया, तो हम इसे :target
pseudo क्लास देकर स्टाइल दे सकते हैं. कोई JavaScript आवश्यक नहीं है!
हमारी max-width मीडिया query में निम्न जोड़ें:
1 |
#nav:target { |
2 |
left: 0; |
3 |
}
|
बस! यह हमारा toggle है
हमारे पास अब क्या है:
आपको पूर्ण पृष्ठ के डेमो (the full page demo) पर एक नज़र डालने की ज़रूरत है कि यह क्या कर रहा है।
निष्कर्ष
और हम कर चुके हैं! मैंने कम से कम स्टाइल को रखा है ताकि रास्ते में न पड़े, लेकिन पागलपन के लिए खुद को स्वतंत्र महसूस करें और इसे ठीक वैसा ही बनाएं जैसा की आप चाहते हैं.
:target की बजाय, आप JavaScript toggle भी पसंद कर सकते हैं, इस स्थिति में भी आपके पास उस काम को बनाने के लिए सभी कुछ हैं.
मुझे आशा है कि आपने इस छोटे से ग्रिड व्यायाम का आनंद उठाया होगा, इससे अधिक जानने के लिए हमारे साथ बने रहे!
उपयोगी संसाधन
- Tuts+ पर CSS Grid Layoute श्रृंखला को समझें
- Responsive Navigation की जांच: स्टीवन ब्राडली द्वारा Off Canvas पैटर्न
- csslayout.news की सदस्यता लें