lang एट्रिब्यूट में सिर्फ़ एक भाषा हो सकती है. इसका मतलब है कि <html>
एट्रिब्यूट में सिर्फ़ एक भाषा हो सकती है. भले ही, पेज पर एक से ज़्यादा भाषाएं हों. lang
को पेज की मुख्य भाषा पर सेट करें.
<html lang="ar,en,fr,pt">...</html>
<html lang="ar">...</html>
लिंक
बटन की तरह ही, लिंक का सुलभता नाम मुख्य रूप से उनके टेक्स्ट कॉन्टेंट से मिलता है. लिंक बनाते समय, "यहां" या "ज़्यादा पढ़ें" जैसे फ़िलर शब्दों के बजाय, लिंक में सबसे ज़्यादा काम का टेक्स्ट डालना एक अच्छी तरकीब है.
Check out our guide to web performance <a href="/guide">here</a>.
Check out <a href="/guide">our guide to web performance</a>.
यह देखना कि कोई ऐनिमेशन लेआउट को ट्रिगर करता है या नहीं
transform
के अलावा किसी और चीज़ का इस्तेमाल करके, एलिमेंट को मूव करने वाले ऐनिमेशन का चलना धीमा हो सकता है.
नीचे दिए गए उदाहरण में, मैंने top
और left
को ऐनिमेट करके और transform
का इस्तेमाल करके, एक ही विज़ुअल नतीजा हासिल किया है.
.box { position: absolute; top: 10px; left: 10px; animation: move 3s ease infinite; } @keyframes move { 50% { top: calc(90vh - 160px); left: calc(90vw - 200px); } }
.box { position: absolute; top: 10px; left: 10px; animation: move 3s ease infinite; } @keyframes move { 50% { transform: translate(calc(90vw - 200px), calc(90vh - 160px)); } }
इसकी जांच करने के लिए, यहां दिए गए Glitch के दो उदाहरण देखें. साथ ही, DevTools का इस्तेमाल करके परफ़ॉर्मेंस के बारे में जानें.
एक ही मार्कअप का इस्तेमाल करके, हम padding-top: 56.25%
को aspect-ratio: 16 / 9
से बदल सकते हैं. साथ ही, aspect-ratio
को width
/ height
के तय अनुपात पर सेट कर सकते हैं.
.container { width: 100%; padding-top: 56.25%; }
.container { width: 100%; aspect-ratio: 16 / 9; }
padding-top
के बजाय aspect-ratio
का इस्तेमाल करना ज़्यादा बेहतर है. इससे पैडिंग प्रॉपर्टी को उसके सामान्य दायरे से बाहर कुछ करने के लिए, पूरी तरह से बदलने की ज़रूरत नहीं पड़ती.
हां, यह सही है. मैं reduce
का इस्तेमाल करके, एक से ज़्यादा वादे करने के लिए चेन बना रहा/रही हूं. मैं बहुत चतुर हूं. हालांकि, यह बहुत स्मार्ट कोडिंग है, जिसे इस्तेमाल करने से बचना चाहिए.
हालांकि, ऊपर दिए गए फ़ंक्शन को असाइन फ़ंक्शन में बदलते समय, बहुत क्रम से काम करने का मन करता है:
async function logInOrder(urls) { for (const url of urls) { const response = await fetch(url); console.log(await response.text()); } }
function markHandled(...promises) { Promise.allSettled(promises); } async function logInOrder(urls) { // fetch all the URLs in parallel const textPromises = urls.map(async (url) => { const response = await fetch(url); return response.text(); }); markHandled(...textPromises); // log them in sequence for (const textPromise of textPromises) { console.log(await textPromise); } }
reduce
बिट को स्टैंडर्ड, बोरिंग, और पढ़ने लायक for-loop से बदल दिया गया है.
Houdini कस्टम प्रॉपर्टी लिखना
यहां कस्टम प्रॉपर्टी (सीएसएस वैरिएबल) सेट करने का उदाहरण दिया गया है. हालांकि, अब इसमें सिंटैक्स (टाइप), शुरुआती वैल्यू (फ़ॉलबैक), और इनहेरिटेंस बूलियन (क्या यह अपने पैरंट से वैल्यू इनहेरिट करता है या नहीं?) है. फ़िलहाल, ऐसा करने के लिए JavaScript में CSS.registerProperty()
का इस्तेमाल किया जाता है. हालांकि, Chromium 85 और उसके बाद के वर्शन में, आपकी सीएसएस फ़ाइलों में @property
सिंटैक्स का इस्तेमाल किया जा सकेगा:
CSS.registerProperty({ name: '--colorPrimary', syntax: '' , initialValue: 'magenta', inherits: false });
@property --colorPrimary { syntax: '' ; initial-value: magenta; inherits: false; }
अब --colorPrimary
को किसी भी अन्य सीएसएस कस्टम प्रॉपर्टी की तरह, var(--colorPrimary)
के ज़रिए ऐक्सेस किया जा सकता है. हालांकि, यहां फ़र्क़ यह है कि --colorPrimary
को सिर्फ़ स्ट्रिंग के तौर पर नहीं पढ़ा जाता. इसमें डेटा है!
CSS backdrop-filter
, पारदर्शी या पारभासी एलिमेंट पर एक या उससे ज़्यादा इफ़ेक्ट लागू करता है. इसे समझने के लिए, नीचे दी गई इमेज देखें.

.frosty-glass-pane { backdrop-filter: blur(2px); }

.frosty-glass-pane { opacity: .9; backdrop-filter: blur(2px); }
बाईं ओर दी गई इमेज से पता चलता है कि backdrop-filter
का इस्तेमाल न करने या काम न करने पर, ओवरलैप होने वाले एलिमेंट कैसे रेंडर किए जाएंगे. दाईं ओर दी गई इमेज में, backdrop-filter
का इस्तेमाल करके धुंधला करने वाला इफ़ेक्ट लागू किया गया है. ध्यान दें कि इसमें backdrop-filter
के साथ-साथ opacity
का भी इस्तेमाल किया गया है. opacity
के बिना, धुंधला करने की सुविधा लागू नहीं की जा सकती. यह बताने की ज़रूरत नहीं है कि अगर opacity
को 1
(पूरी तरह से अपारदर्शी) पर सेट किया जाता है, तो बैकग्राउंड पर कोई असर नहीं पड़ेगा.
हालांकि, unload
इवेंट के उलट, beforeunload
का इस्तेमाल सही तरीके से किया जा सकता है. उदाहरण के लिए, जब आपको उपयोगकर्ता को चेतावनी देनी हो कि पेज छोड़ने पर, सेव नहीं किए गए बदलाव मिट जाएंगे. इस मामले में, हमारा सुझाव है कि आप beforeunload
दर्शकों को सिर्फ़ तब जोड़ें, जब उपयोगकर्ता ने सेव नहीं किए गए बदलाव किए हों. इसके बाद, सेव नहीं किए गए बदलावों को सेव करने के तुरंत बाद उन्हें हटा दें.
window.addEventListener('beforeunload', (event) => { if (pageHasUnsavedChanges()) { event.preventDefault(); return event.returnValue = 'Are you sure you want to exit?'; } });
beforeunload
दर्शक को बिना किसी शर्त के जोड़ता है.
function beforeUnloadListener(event) { event.preventDefault(); return event.returnValue = 'Are you sure you want to exit?'; }; // A function that invokes a callback when the page has unsaved changes. onPageHasUnsavedChanges(() => { window.addEventListener('beforeunload', beforeUnloadListener); }); // A function that invokes a callback when the page's unsaved changes are resolved. onAllChangesSaved(() => { window.removeEventListener('beforeunload', beforeUnloadListener); });
beforeunload
लिसनर को सिर्फ़ तब जोड़ता है, जब ज़रूरत होती है. साथ ही, ज़रूरत न होने पर उसे हटा देता है.
Cache-Control: no-store
का इस्तेमाल कम से कम करना
Cache-Control: no-store
एक एचटीटीपी हेडर है. वेब सर्वर, रिस्पॉन्स पर इसे सेट कर सकते हैं. इससे ब्राउज़र को यह निर्देश मिलता है कि वह रिस्पॉन्स को किसी भी एचटीटीपी कैश में सेव न करे. इसका इस्तेमाल, उपयोगकर्ता की संवेदनशील जानकारी वाले संसाधनों के लिए किया जाना चाहिए. उदाहरण के लिए, लॉगिन करने के बाद दिखने वाले पेज.
fieldset
एलिमेंट में हर इनपुट ग्रुप (.fieldset-item
) होता है. यह एलिमेंट, एलिमेंट के बीच में हेयरलाइन बॉर्डर बनाने के लिए gap: 1px
का इस्तेमाल करता है. बॉर्डर के लिए कोई मुश्किल समाधान नहीं!
.grid { display: grid; gap: 1px; background: var(--bg-surface-1); & > .fieldset-item { background: var(--bg-surface-2); } }
.grid { display: grid; & > .fieldset-item { background: var(--bg-surface-2); &:not(:last-child) { border-bottom: 1px solid var(--bg-surface-1); } } }
ग्रिड को अपने-आप रैप होना
सबसे जटिल लेआउट, मैक्रो लेआउट था. यह <main>
और <form>
के बीच का लॉजिकल लेआउट सिस्टम था.
<input type="checkbox" id="text-notifications" name="text-notifications" >
<label for="text-notifications"> <h3>Text Messages</h3> <small>Get notified about all text messages sent to your device</small> </label>
fieldset
एलिमेंट में हर इनपुट ग्रुप (.fieldset-item
) होता है. यह एलिमेंट, एलिमेंट के बीच में हेयरलाइन बॉर्डर बनाने के लिए gap: 1px
का इस्तेमाल करता है. बॉर्डर के लिए कोई मुश्किल समाधान नहीं!
.grid { display: grid; gap: 1px; background: var(--bg-surface-1); & > .fieldset-item { background: var(--bg-surface-2); } }
.grid { display: grid; & > .fieldset-item { background: var(--bg-surface-2); &:not(:last-child) { border-bottom: 1px solid var(--bg-surface-1); } } }
टैब <header>
लेआउट
अगला लेआउट भी लगभग एक जैसा है: वर्टिकल क्रम बनाने के लिए, मैं फ़्लेक्स का इस्तेमाल करता/करती हूं.
<snap-tabs> <header> <nav></nav> <span class="snap-indicator"></span> </header> <section></section> </snap-tabs>
header { display: flex; flex-direction: column; }
.snap-indicator
को लिंक के ग्रुप के साथ हॉरिज़ॉन्टल तौर पर ट्रैवल करना चाहिए. साथ ही, यह हेडर लेआउट उस स्टेज को सेट करने में मदद करता है. यहां कोई एलिमेंट, एब्सोलूट पोज़िशन में नहीं है!
Gentle Flex, सिर्फ़ केंद्रित करने वाली रणनीति है. यह सॉफ़्ट और आसान है, क्योंकि place-content: center
के उलट, केंद्रित करने के दौरान बच्चों के बॉक्स के साइज़ में कोई बदलाव नहीं होता. सभी आइटम को धीरे से स्टैक किया जाता है, बीच में रखा जाता है, और उनके बीच स्पेस दिया जाता है.
.gentle-flex {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1ch;
}
- सिर्फ़ अलाइनमेंट, डायरेक्शन, और डिस्ट्रिब्यूशन को मैनेज करता है
- बदलाव और रखरखाव की सुविधाएं एक ही जगह पर उपलब्ध हैं
- Gap की मदद से, n बच्चों के बीच बराबर स्पेस बनाए रखने की गारंटी मिलती है
- कोड की ज़्यादा से ज़्यादा लाइनें
यह मैक्रो और माइक्रो लेआउट, दोनों के लिए बेहतरीन है.
इस्तेमाल
gap
, वैल्यू के तौर पर किसी भी CSS लंबाई या प्रतिशत को स्वीकार करता है.
.gap-example {
display: grid;
gap: 10px;
gap: 2ch;
gap: 5%;
gap: 1em;
gap: 3vmax;
}
गैप के लिए एक लंबाई दी जा सकती है. इसका इस्तेमाल, पंक्ति और कॉलम, दोनों के लिए किया जाएगा.
.grid { display: grid; gap: 10px; }
.grid { display: grid; row-gap: 10px; column-gap: 10px; }
Gap फ़ंक्शन में दो वैल्यू दी जा सकती हैं. इनका इस्तेमाल पंक्ति और कॉलम के लिए किया जाएगा.
.grid { display: grid; gap: 10px 5%; }
.grid { display: grid; row-gap: 10px; column-gap: 5%; }