भाषा एट्रिब्यूट के साथ सिर्फ़ एक भाषा जुड़ी हो सकती है. इसका मतलब है कि
<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
के बजाय किसी अन्य चीज़ का इस्तेमाल करके, एलिमेंट को मूव करने वाले ऐनिमेशन के धीमे होने की संभावना होती है.
यहां दिए गए उदाहरण में, मुझे transform
का इस्तेमाल करके top
और left
पर वही विज़ुअल नतीजा मिला है.
.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)); } }
इन दो ग्लिच उदाहरणों की मदद से इसकी जांच की जा सकती है. साथ ही, 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
बिट को एक स्टैंडर्ड, बोरिंग, और आसानी से पढ़े जा सकने वाले डेटा से बदल दिया जाता है.
हौडीनी कस्टम प्रॉपर्टी लिखी जा रही है
यहां कस्टम प्रॉपर्टी (जैसे कि सीएसएस वैरिएबल) सेट करने का उदाहरण दिया गया है. हालांकि, अब इसमें सिंटैक्स (टाइप), शुरुआती वैल्यू (फ़ॉलबैक), और इनहेरिटेंस बूलियन (क्या यह अपने पैरंट से वैल्यू को इनहेरिट करता है या नहीं?) के साथ दिया गया है. फ़िलहाल, 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
को सिर्फ़ स्ट्रिंग के तौर पर नहीं पढ़ा जाता. इसमें डेटा है!
सीएसएस backdrop-filter
, किसी ऐसे एलिमेंट पर एक या उससे ज़्यादा इफ़ेक्ट लागू करता है जो पारदर्शी या पारदर्शी है. इसे समझने के लिए, नीचे दी गई इमेज देखें.
![एक त्रिभुज जिसके चारों तरफ़ वृत्त बना है. त्रिभुज के पार से वृत्त नहीं देखा जा सकता.](https://web.dev/static/examples/image/admin/LOqxvB3qqVkbZBmxMmKS.png?hl=hi)
.frosty-glass-pane { backdrop-filter: blur(2px); }
![एक त्रिभुज जिसके चारों तरफ़ वृत्त बना है. त्रिभुज पारदर्शी है, जिसकी वजह से वृत्त दिखाई देता है.](https://web.dev/static/examples/image/admin/VbyjpS6Td39E4FudeiVg.png?hl=hi)
.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-item
) वाले fieldset
एलिमेंट में 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-item
) वाले fieldset
एलिमेंट में 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;
}
- सिर्फ़ अलाइनमेंट, डायरेक्शन, और डिस्ट्रिब्यूशन को हैंडल करता है
- सभी बदलाव और रखरखाव एक ही जगह पर पाएं
- गैप n बच्चों के बीच बराबर स्पेस की गारंटी देता है
- कोड की ज़्यादातर लाइनें
मैक्रो और माइक्रो, दोनों तरह के लेआउट के लिए बेहतरीन.
इस्तेमाल का तरीका
gap
, वैल्यू के तौर पर किसी भी सीएसएस length
या percentage को स्वीकार करता है.
.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; }
गैप को दो लंबाई तक बढ़ाया जा सकता है. इसका इस्तेमाल पंक्ति और कॉलम के लिए किया जाएगा.
.grid { display: grid; gap: 10px 5%; }एक ही बार में पंक्तियों और कॉलम, दोनों को अलग-अलग सेट करें
.grid { display: grid; row-gap: 10px; column-gap: 5%; }