आधुनिक HTML/CSS की कम-ज्ञात सुविधाएँ
(lyra.horse)- हाल की वेबसाइट performance गिरावट का एक बड़ा कारण JavaScript का अत्यधिक उपयोग और tracking scripts हैं, जबकि कई मामलों में इन्हें सिर्फ HTML/CSS से ही पर्याप्त रूप से बदला जा सकता है
- हाल में जोड़ी गई सुविधाएँ जैसे CSS nesting, relative colors, नए viewport units (lvh, svh, dvh) उन कामों को आसान बनाती हैं जिनके लिए पहले JS या preprocessor पर निर्भर रहना पड़ता था
- CSS सिर्फ एक style tool नहीं, बल्कि animation, input validation, dark mode theme, accordion menu तक लागू कर सकने वाली एक शक्तिशाली भाषा है
- performance के लिहाज़ से भी CSS, GPU acceleration और अलग thread पर चलकर animation और transition effects में JS से अधिक smooth और efficient हो सकती है
- लेखक CSS को सिर्फ एक practical tool नहीं बल्कि अभिव्यक्ति और कला के माध्यम के रूप में रेखांकित करते हैं, और web developers से आधुनिक CSS की क्षमता का अधिक उपयोग करने की सलाह देते हैं
परिचय: वेब की जटिलता, और नए प्रयास
- कई वेबसाइटें JavaScript frameworks के अत्यधिक उपयोग के कारण performance गिरावट और जटिलता का सामना कर रही हैं
- React app लोड होने में कई सेकंड लेते हैं, और NextJS hydration errors पैदा करता है
node_modulesफ़ोल्डर कई gigabytes जगह घेर लेता है
- बिना JavaScript के भी सिर्फ HTML और CSS से शक्तिशाली सुविधाएँ लागू की जा सकती हैं
- जटिल shopping cart या dashboard वाली e-commerce sites को छोड़ दें, तो JavaScript हमेशा अनिवार्य नहीं हो सकता
- यह लेख CSS की नई सुविधियों का परिचय देता है और developers को केवल JavaScript पर निर्भर हुए बिना अन्य संभावनाओं की खोज करने के लिए प्रेरित करता है
CSS को लेकर गलतफहमियाँ और धारणा
क्या CSS सच में कठिन और असुविधाजनक है?
- CSS को लेकर नकारात्मक धारणा अक्सर बुनियादी सीख की कमी से आती है
- कई developers CSS की बुनियाद छोड़कर JavaScript या TypeScript पर ध्यान केंद्रित करते हैं
- CSS सिर्फ एक styling tool नहीं, बल्कि शक्तिशाली सुविधाएँ देने वाली domain-specific language है
- CSS में flexbox जैसे tools के साथ जटिल layout भी आसानी से बनाए जा सकते हैं
- उदाहरण:
display: flexऔरjustify-content: centerसे div को केंद्र में रखना आसान है - browser developer tools flexbox properties को visually adjust करने के लिए widgets देते हैं
- उदाहरण:
- अगर कोई सिर्फ एक पक्ष (जैसे JS) में बहुत गहराई तक जाए और CSS की अनदेखी करे, तो बोझ बढ़ना स्वाभाविक है
CSS लिखने की तकलीफ़, और बदलाव
- पहले CSS उतना सुविधाजनक नहीं था, इसलिए Sass और Tailwind जैसे tools आए
- उदाहरण:
.post > .buttons .like:hoverजैसी लंबी selector chains को manage करना पड़ता था
- उदाहरण:
- हाल के वर्षों में quality-of-life features (जैसे nesting) जुड़ने से अब सिर्फ मूल CSS से भी आराम से development करना संभव हुआ है
- CSS nesting संबंधित styles को एक ही जगह रखकर readability बढ़ाता है
- उदाहरण:
.post { & > .buttons { .like { &:hover { ... } } } } - parent-child संबंध स्पष्ट हो जाता है, इसलिए छोटे और सरल class names इस्तेमाल किए जा सकते हैं
- उदाहरण:
- CSS nesting संबंधित styles को एक ही जगह रखकर readability बढ़ाता है
- relative colors रंगों को adjust करना आसान बनाते हैं
hsl(from #123456 h s calc(l + 10))से brightness बदली जा सकती हैcolor-mix()से दो रंग मिलाकर dynamic colors बनाए जा सकते हैं
- media query range syntax
(width <= 768px)जैसे intuitive conditions सेट करने देता है - lh unit line height के अनुसार styling का समर्थन करती है
- scrollbar-gutter property scrollbar के कारण होने वाले layout shift की समस्या हल करती है
- Baseline प्रमुख browsers में feature compatibility सुनिश्चित करता है
- newly available features नवीनतम browsers में काम करती हैं
- widely available features 2.5 साल पुराने browsers तक समर्थित होती हैं
- उदाहरण: CSS nesting को दिसंबर 2023 से सभी browsers में support मिला
सिर्फ CSS/HTML से विकास क्यों?
- कुछ users JavaScript को default रूप से disable रखते हैं, जैसे security या privacy कारणों से
- यदि वेबसाइट सिर्फ CSS/HTML से उपलब्ध कराई जाए, तो ऐसे users के लिए भी site का उपयोग संभव होने की संभावना बढ़ जाती है
- development और user experience दोनों के दृष्टिकोण से सिर्फ CSS/HTML इस्तेमाल करने पर speed, accessibility, CPU और battery usage में फायदे हैं
- CSS animations compositor thread पर चलती हैं, इसलिए CPU पर दबाव कम होता है
- JavaScript event loop के ज़रिए चलता है, इसलिए थोड़ा delay हो सकता है
- accessibility और usability बेहतर होती है
- button hover effects, toast animations, input validation जैसी चीजें CSS से सरलता से लागू की जा सकती हैं
CSS के व्यावहारिक उदाहरण और मुख्य सुविधाएँ
@starting-style से स्वाभाविक शुरुआती animation लागू करना
- पहले elements के entry animation लागू करने के लिए keyframes, JS triggers जैसी जटिल संरचना चाहिए होती थी
- @starting-style आने से शुरुआती state तय करना आसान हो गया है। element की initial-state animation (जैसे fade-in) आसानी से लागू की जा सकती है
transition: opacity 1s; @starting-style { opacity: 0; }से सेट किया जा सकता है- अलग
@keyframesया JavaScript के बिना भी काम करता है
- सिर्फ transition के साथ शुरुआती state बताने पर animation स्वाभाविक रूप से लागू हो जाती है
- उदाहरण: toast message की opacity और position transition को smooth बनाना
dark/light mode के लिए आसान theme setup
- color-scheme: light dark user preference के अनुसार theme अपने-आप बदलता है
- light-dark(#000, #FFF) function light/dark mode के लिए उपयुक्त रंग निर्धारित करता है
- radio buttons और :has selector से user theme selection का समर्थन किया जा सकता है
- JavaScript के बिना सिर्फ CSS से theme switching संभव है
- theme को save/load करने के लिए वैकल्पिक रूप से JavaScript जोड़ा जा सकता है
radio/checkbox और :has, :checked से custom UI बनाना
- tabs, accordion, toggles जैसी जटिल interactions भी JavaScript के बिना लागू की जा सकती हैं
- radio buttons को :checked और :has के साथ custom style किया जा सकता है
- उदाहरण:
label:has(input:checked)से selected button की style तय की जा सकती है opacity: 0से input element को छिपाया जा सकता है, जबकि screen reader accessibility बनी रहती है
- उदाहरण:
- details element FAQ जैसे accordion menu लागू करने के लिए उपयुक्त है
nameattribute से single-open state नियंत्रित की जा सकती है[open]state के अनुसार animation जोड़ी जा सकती है
input validation और state reflection
- pattern, required जैसे HTML attributes और CSS pseudo-classes (
:valid,:invalid,:user-validआदि) के संयोजन से real-time validation और visual feedback दिया जा सकता है - input fields के outline/border style बदलकर user experience बेहतर किया जा सकता है
- HTML के pattern attribute से input field validity check की जा सकती है
- उदाहरण:
\w{3,16}से 3–16 अक्षर, अंक या underscore की अनुमति
- उदाहरण:
- CSS के :valid और :invalid validity के आधार on styling करते हैं
- :user-valid और :user-invalid केवल user के input करने के बाद style लागू करते हैं
- :has selector से input state के अनुसार दूसरे elements की styling की जा सकती है
- कुछ मामलों में (जैसे जटिल input conditions) JS की ज़रूरत पड़ सकती है, लेकिन अधिकतर स्थितियों में CSS/HTML पर्याप्त है
viewport units का सही उपयोग
- मोबाइल में address/navigation bar के दिखने-छिपने के कारण vw/vh units में accuracy issues आती हैं
- lvh/svh/dvh (largest/smallest/dynamic viewport height) जैसे नए viewport units इस्तेमाल करने की सलाह दी जाती है
- lvh: full-screen उपयोग के लिए, जैसे full background
- svh: उन buttons, links आदि के लिए जो हमेशा स्क्रीन पर दिखने चाहिए
- dvh: scroll जैसी बदलती परिस्थितियों के अनुसार flexible sizing के लिए
- keyboard overlay को interactive-widget property या VirtualKeyboard API से संभाला जा सकता है
<meta name="viewport" content="width=device-width, interactive-widget=resizes-content">- Chromium-आधारित browsers में
navigator.virtualKeyboard.overlaysContent = true
CSS wishlist: कमी महसूस होने वाली या चाही गई सुविधाएँ
- reusable blocks: class के भीतर दूसरी class apply करना (जैसे
@apply border) - combined media query selectors:
@mediaऔर class selector का संयोजन - nth-child variable:
span { --nth: nth-child(); }से dynamic styling - nth-letter selector: किसी खास अक्षर की styling (जैसे
p::nth-letter(2)) - unit removal:
calc(100vw / 1px)से unit-less values बनाना - image() function: fallback colors और image fragments का समर्थन
- body के अंदर style tag: आधिकारिक standard support से FOUC समस्या कम करना
निष्कर्ष: CSS, और वेब की कलात्मकता
- CSS सिर्फ एक tool नहीं, बल्कि रचनात्मक अभिव्यक्ति का माध्यम है
- AI tools या build chain (linter, minifier) रचनात्मकता को सीमित कर सकते हैं
- CSS एक साथ performance, accessibility, और कलात्मक अभिव्यक्ति को पूरा करता है
- यह लेख लगभग 49kB के JavaScript-रहित HTML/CSS से लिखा गया है
- सभी interactive widgets और visual elements हाथ से बनाए गए हैं
- उदाहरण: CSS click game CSS की programming-language जैसी संभावनाओं का प्रमाण है
3 टिप्पणियां
मैं full-stack था, लेकिन जैसे-जैसे करियर ऊपर की ओर बढ़ता गया, FE करने के मौके कम होते गए। करीब 10 साल तक मैंने इसे लगभग छुआ ही नहीं, फिर हाल ही में एक कंपनी में lecture देने का मौका आया तो सोचा संक्षेप में परिचय देने के लिए थोड़ा देख लूं, और यह देखकर सचमुच हैरान रह गया कि चीजें कितनी बदल चुकी हैं।
scssतक साथ में हो तो और भी बढ़िया लगता है। लेकिन CSS का यह क्षेत्र सच में बड़ा अजीब है। सीखना आसान है, मगर इतना अच्छा इस्तेमाल करना कि लोगों से पहचान मिले, यह काफी हद तक व्यक्ति की aesthetic sense और creativity पर निर्भर करता है। ऐसे web दौर में जहाँ usability और design को ज्यादा महत्व दिया जाता है, यह देखकर अफसोस होता है कि publisher की value शायद उतनी ऊंची नहीं आंकी जाती।इस बार वेब डेवलपमेंट टेक्नोलॉजी को हल्के-फुल्के शौकिया तौर पर आज़माते हुए, बिना किसी बुनियादी ज्ञान के बिल्कुल शून्य से nextjs, authjs, tailwind, shadcn का इस्तेमाल करके एक बेसिक बोर्ड बना कर देखा... और सीखने की सबसे बड़ी कठिनाई CSS रही।
Hacker News राय
मुझे CSS में हाल ही में जो nesting फीचर जोड़ा गया है, उसके लिए आभार है, लेकिन कुल मिलाकर देखें तो CSS वाकई बहुत अजीब है, और व्यक्तिगत रूप से मुझे यह एक खराब भाषा लगती है। हो सकता है कि वजह यह हो कि मैं इसे ठीक से इस्तेमाल नहीं कर पाता, लेकिन यह इतनी जटिल और बेतरतीब लगती है मानो किसी अज्ञात रून लिपि को इधर-उधर खिसका रहा हूँ। styling और layout system आपस में मिले हुए हैं, लेकिन inheritance और containment के रिश्ते अलग होने से यह और उलझा देता है। मुझे लगता है कि styling और layout को मिलाना ही एक गलती थी। जो system पहले से बुनियादी स्तर पर टूटा हुआ है, उसमें बस नए फीचर जोड़ते जाना समाधान नहीं हो सकता.
gapproperty का flex और grid में अलग तरह से व्यवहार करना (लिंक)। एक बार layout बना लेने के बाद वह व्यवहारिक रूप से लगभग स्थिर हो जाता है। जटिल native या JS-आधारित encapsulation के बिना उसे लचीले ढंग से बदलना कठिन है। फिर अनपेक्षित रूप से font weight बदल जाना या mobile menu का desktop पर भी दिखने लगना जैसी समस्याएँ आती हैं.calcजैसी चीज़ों से शायद अधिक व्यवस्थित layout system को गणितीय रूप से लागू किया जा सकता है। मौजूदा preprocessor भाषाएँ तो CSS के ऊपर, जिसमें पहले से अधूरे concepts हैं, फिर और अधूरे फीचर जोड़ देती हैं, जिससे उलझन और बढ़ती है.CSS की सबसे बुरी बात, मेरे हिसाब से, यह है कि बहुत से लोग इसे ठीक से सीखे बिना बस एक दिन मजबूरी में इस्तेमाल करते हैं और फिर बहुत तीखी राय बना लेते हैं.
.foo > .bar:nth-child(2n) ~ .bazजैसा दिखने लगता है। फिर उससे सहकर्मी का कोड टूट जाता है। एक साधारण layout भी सिरदर्द बन जाता है। हालाँकि हाल के वर्षों में चीज़ें काफ़ी सुधरी हैं, लेकिन शुरू से यह cascade-केंद्रित संरचना ही समस्या रही है। syntax वगैरह पर दूसरी आलोचनाएँ मामूली हैं। अगर कोई चीज़ व्यावहारिक और इस्तेमाल में आसान हो, तो syntax बर्दाश्त की जा सकती है, लेकिन CSS ऐसी नहीं थी। मुझे नहीं लगता कि web layout बनाना अपने-आप में एक पेशा होना चाहिए.मुझे इस लेख में "कुछ users JavaScript नहीं चाहते" वाला तर्क बहुत प्रभावी नहीं लगा। मैं खुद Arch user हूँ और तरह-तरह की scripting और crawling में रुचि रखता हूँ, लेकिन "NoScript" environment पर ध्यान केंद्रित करना मुझे ख़ास महत्वपूर्ण नहीं लगता। यह बहुत छोटे समूह की पसंद है, इसलिए इसे आम तौर पर नज़रअंदाज़ किया जा सकता है। यह कुछ-कुछ उस दौर जैसा लगता है जब कहा जाता था कि "10% लोग IE6 इस्तेमाल करते हैं"। फिर भी, CSS के बेहतर होने के और भी बहुत से कारण हैं। वैसे भी यह मुख्य मुद्दा नहीं है, बस बहस का रुख मुझे ऐसा लगा.
मुझे पता ही नहीं था कि nesting अब आधिकारिक standard बन चुकी है। हाल तक मैं समझता था कि यह अभी भी proposal stage में है। CSS में अजीब बातें बहुत हैं, लेकिन JavaScript की तरह यह भी धीरे-धीरे बेहतर भाषा बनती जा रही है। Flexbox,
:hasselector, और nesting की वजह से पुराने कई pain points काफ़ी हद तक दूर हुए हैं.मेरी wishlist में मौजूद CSS के दो features तो पहले से spec में हैं.
sibling-index()औरsibling-count()से implement किया जा सकता है (MDN विवरण)@functionऔर@mixindraft spec मौजूद है (spec draft, CSS Tricks विवरण)मुझे CSS syntax खराब लगती है। मैं 10~15 भाषाओं के साथ काम करता हूँ, लेकिन CSS सबसे कठिन है पढ़ने और समझने के लिहाज़ से। यह x86 assembly से भी ज़्यादा पेचीदा लगती है। CSS renderer के लिए एक तरह का pre-tokenized input है, लेकिन यह न तो सच में tokens जैसा है और न ही इंसानों के लिखने के लिए स्वाभाविक। RFC की ASN.1 की तरह इसे शायद "ऐसा नहीं करना चाहिए" वाले उदाहरण के रूप में इस्तेमाल करना चाहिए.
font-size: 12pxजैसे code को तो काफ़ी आसानी से पढ़ा जा सकता है, इसलिए यह समझ नहीं आता कि यह इतना कठिन क्यों लगता है। मेरे लिए तो यह बहुत सरल है.मुझे जानना है कि radio tabs वाला उदाहरण accessibility के लिहाज़ से ठीक है या नहीं। WAI-ARIA के अनुसार, मेरा मानना है कि tab बदलते समय
aria-selected,tabindex, औरaria-controlsattributes को JS से update करना चाहिए, लेकिन मैं निश्चित नहीं हूँ। accessibility को अक्सर बाद में सोचा जाता है। कभी-कभी लोग यह भी मान लेते हैं कि सिर्फ HTML/CSS इस्तेमाल करने से accessibility अपने-आप सुनिश्चित हो जाती है। किसी approach को चुनते समय इस पर एक बार और विचार होना चाहिए.JS के बिना भी ऐसे interactive effects बनाए जा सकते हैं (उदाहरण पेज)
10 साल के web developer के रूप में, मुझे लगता है कि ऐसे लेखों को हमारे भरोसे को चुनौती देनी चाहिए। शीर्षक इतना अच्छा नहीं था कि मैं लगभग इसे पढ़े बिना छोड़ देता। वैसे, सिर्फ CSS से map rendering नहीं हो सकती.
शायद Vega नाम की वजह से लोगों के मन में पहले से धारणा हो, लेकिन मुझे यह site सच में बहुत पसंद आई। इसका overall design भी अच्छा है, और इस page की सामग्री भी शानदार है। मैं आगे से web development करने वाले लोगों को इसका लिंक ज़रूर साझा करूँगा। मुझे arrupted भी बहुत पसंद है, और इसने पहले भी बहुत शानदार काम किया है, इसलिए main page पर यह परिचित domain देखकर अच्छा लगा.