Mundarija (40)
- Bu darsda
- 1. Nega bu kerak?
- 2. Tashqi tur: block va inline
- 2.1 Ikki xil qo'shni
- 2.2 Box model satr ichida qanday ishlaydi
- 2.3 display: block — satr ichidagini blokka aylantirish
- 2.4 inline-block — ikki dunyoning yaxshisi
- 3. Ikki qiymatli yozuv: tashqi va ichki tur
- 3.1 Har quti ikki savolga javob beradi
- 3.2 flow-root — margin'larni ichida ushlaydigan blok
- 4. display: contents — o'rovchini olib tashlash
- 4.1 Nima qiladi
- 4.2 Accessibility xavfi
- 5. Yashirishning besh yo'li
- 5.1 display: none — butunlay yo'q
- 5.2 hidden atributi va uning tuzog'i
- 5.3 visibility: hidden — joy qoladi
- 5.4 opacity: 0 — ko'rinmas, lekin bor
- 5.5 inert — ko'rinadi, lekin tegib bo'lmaydi
- 5.6 Hammasi bitta jadvalda
- 5.7 Qaysi birini qachon
- 6. Foydalanuvchi bilan "muloqot": pointer-events, cursor, user-select
- 6.1 pointer-events: none — bosishni o'tkazib yuborish
- 6.2 cursor — sichqoncha ko'rsatkichi
- 6.3 user-select — matnni belgilash
- 7. Ko'p uchraydigan xatolar
- 7.1 span ga width yoki margin-top
- 7.2 hidden ishlamayapti
- 7.3 Ko'rinmas tugma bosishlarni "yeydi"
- 7.4 pointer-events: none bilan "o'chirish"
- 7.5 Ma'noli elementga display: contents
- 7.6 display: none bilan "faqat ekran o'quvchi uchun" matn
- 8. Mashqlar
- 1-mashq (oson): Qaysi usul?
- 2-mashq (o'rta): Bron formasining yorliqlari
- 3-mashq (qiyin): Uch sir
- 4-mashq: Portfolio qadami — aloqa formasi tartibga keladi
- 9. Real ishda
- Xulosa
- Manbalar
CSS display: block, inline va elementni yashirish yo'llari
Qisqacha:
displayelement sahifada qanday turishini belgilaydi.block— yangi qatordan boshlanadi va butun enni oladi;inline— matn ichida turadi, ungawidth,heightva vertikal margin ishlamaydi;inline-block— matn ichida turib, o'lcham oladi. Yashirish yo'llari turlicha:display: nonevahiddenelementni butunlay olib tashlaydi,visibility: hiddenjoyini qoldiradi,opacity: 0faqat ko'zdan yashiradi (element bosiladi va o'qiladi),inertesa ko'rinib turgan qismni faolsizlantiradi.
Bu darsda
block,inlinevainline-blockfarqini box model orqali tushuntirasiz.- Ikki qiymatli
displayyozuvini o'qiysiz va eski bitta so'zli qiymatlarni unga o'girasiz. flow-root,contentsvanonenima qilishini,contentsning accessibility xavfini bilasiz.- Yashirishning besh yo'lini solishtirasiz va
hiddenatributi tuzog'ini tuzatasiz. pointer-events,cursorvauser-selectni o'z o'rnida ishlatasiz.
Oldin bilishingiz kerak: Box model, Margin sirlari, div va span, Kontent modeli, Global atributlar.
1. Nega bu kerak?
Oxirgi darslarda bir xil savol to'rt marta chiqdi:
- DevTools'da CSS darsida narx
spanigawidth: 120pxberdik. DevTools uni xira qilib, "The display: inline property prevents width from having an effect" deb yozdi. - Box model darsida
spangamargin-topberdik — hech narsa o'zgarmadi. Havolaning tepa-past padding'i esa qo'shni qatorlarni surmadi. - Margin sirlari darsida
margin-inline: autospanni markazlamadi. - O'sha darsda
display: flow-rootni "keyingi darsda" deb qoldirgan edik.
Hammasining ildizi bitta — display xususiyati. div va span darsida "block" va "inline" elementlarni ko'rib, "buni CSS'dagi display boshqaradi" degan edik. Endi uni ochamiz.
Ikkinchi mavzu — yashirish. Global atributlar darsida bir intervyu savolini keyinga qoldirgan edik — hidden, display: none va visibility: hidden ning farqi. Bu dars oxirida unga to'liq javob berasiz va yana ikkita usulni qo'shasiz.
2. Tashqi tur: block va inline
2.1 Ikki xil qo'shni
display — element qutisi qanday turini belgilaydigan xususiyat. Uning eng eski ikki qiymati:
block— yangi qatordan boshlanadi, otasining butun enini oladi, keyingi element ham yangi qatordan boshlanadi.div,p,h1,article,section— brauzer uslublaridablock.inline— matn ichida, so'zlar qatorida turadi. Qator tugasa, keyingi qatorga "oqib" o'tadi.span,a,strong,em—inline.
Choyxona dasturxonini tasavvur qiling. Lagan — block: u dasturxonda o'z joyini egallaydi, yoniga boshqa lagan qo'yilmaydi. Non bo'laklari — inline: ular qator bo'lib teriladi, qator to'lsa, keyingisiga o'tadi.
2.2 Box model satr ichida qanday ishlaydi
Endi DevTools darsidagi sirni ochamiz. span ga box model'ning hamma qatlamini beramiz:
<style>
:root {
--rang-asosiy: #2f6b3a;
}
p {
width: 22rem;
}
.narx {
width: 120px;
height: 60px;
padding: 8px 12px;
margin: 30px 16px;
border: 2px solid var(--rang-asosiy);
background-color: #d8ecd9;
}
</style>
<p>Rustam aka bugun ham katta qozonda osh damladi. Bir lagan
osh <span class="narx">35 000 so'm</span> turadi. Marhamat,
choyxonamizda sizni kutamiz: har kuni 7:00 dan 23:00 gacha.</p>Nimaga qarang:
widthvaheightishlamadi. Narx 120 piksel emas, o'z matni enida. Satr ichidagi element o'lchamini mazmunidan oladi.- Chap va o'ngdagi padding, border va margin ishladi. Narx atrofidagi so'zlar chetga surildi.
- Tepa va pastki padding bilan border chizildi, lekin qatorlarni surmadi. Yashil ramka yuqoridagi va pastdagi so'zlar ustiga chiqib turibdi. Chrome'da o'lchadik: paragraf bo'yi
spanni bezashdan oldin ham, keyin ham 72 piksel — to'rt qator, har biri 18. Narxning eni esa 120 emas, taxminan 106 piksel: matn, padding va border yig'indisi. - Tepa va pastki margin umuman ta'sir qilmadi.
Satr ichidagi element — matnning bir bo'lagi. Qatorlar orasidagi masofani brauzer shrift va qator balandligiga qarab o'zi hisoblaydi (Qator balandligi darsida). Element o'zining vertikal o'lchami bilan unga aralasha olmaydi. Uzun span esa qatordan qatorga bo'linib ham ketishi mumkin — unda "bitta to'rtburchak" ham qolmaydi.
img ham satr ichidagi element, lekin istisno: unga width va height ishlaydi. Rasm "almashtiriladigan" element — uning mazmuni tashqi fayldan keladi. Rasm tagidagi kichik bo'shliq kabi tuzoqlarini Rasm va media darsida ko'ramiz.
2.3 display: block — satr ichidagini blokka aylantirish
Narxga display: block bersak, u yangi qatordan boshlanadi va width: 120px ishlaydi — DevTools'dagi ogohlantirish yo'qoladi. Vertikal margin va padding ham to'liq ishlaydi.
Bitta muhim chegara: display faqat ko'rinishni o'zgartiradi. Kontent modeli darsidagi qoida o'z joyida: display: block berilgan span ichiga ham div qo'yib bo'lmaydi. HTML ma'nosi va ichma-ichlik qoidalari CSS'ga bo'ysunmaydi.
2.4 inline-block — ikki dunyoning yaxshisi
Ba'zan element matn qatorida qolishi kerak, lekin o'lcham va vertikal padding bilan. Masalan, «Bahor»ning "Stolni band qilish" havolasi — bron-havola. Box model darsida uning tepa-past padding'i qatorlarni surmasligini ko'rgan edik:
<style>
:root {
--rang-asosiy: #2f6b3a;
--rang-fon: #fffaf0;
}
p {
width: 22rem;
}
.bron-havola {
padding: 0.5em 1em;
background-color: var(--rang-asosiy);
color: var(--rang-fon);
}
p + p .bron-havola {
display: inline-block;
}
</style>
<p>Oilaviy bazm uchun joy kerakmi? Oldindan
<a class="bron-havola" href="bron/">Stolni band qilish</a>
tugmasini bosing — biz qo'ng'iroq qilamiz.</p>
<p>Oilaviy bazm uchun joy kerakmi? Oldindan
<a class="bron-havola" href="bron/">Stolni band qilish</a>
tugmasini bosing — biz qo'ng'iroq qilamiz.</p>Nimaga qarang: birinchi paragrafda yashil fon qo'shni qatorlar ustiga chiqib turibdi, havola esa ikki qatorga bo'linib ketgan. Ikkinchisida havola inline-block — atrofidagi qatorlar surilib, unga joy berdi. Havola hamon matn ichida, lekin endi u yaxlit to'rtburchak: qatorga bo'linmaydi, width va vertikal margin ham unga ishlaydi.
Bitta xususiyat: HTML'dagi yangi qator yoki bo'sh joy inline-block lar orasida ham bitta bo'sh joy bo'lib ko'rinadi — ular harf kabi yoziladi. Bir necha inline-block ni yonma-yon terganda bu kutilmagan 4 piksellik bo'shliq beradi. Yonma-yon joylashtirishning to'g'ri vositasi — Flexbox.
| Qiymat | Yangi qatordan | width, height |
Vertikal margin |
|---|---|---|---|
block |
Ha | Ishlaydi | Ishlaydi |
inline |
Yo'q | E'tiborsiz | E'tiborsiz |
inline-block |
Yo'q | Ishlaydi | Ishlaydi |
Tekshirib ko'ring: Menyudagi har narx
span6rem enida bo'lsin, lekin taom nomi bilan bir qatorda qolsin. Qaysidisplayqiymati kerak?
Javob
inline-block. inline da width ishlamaydi. block da narx yangi qatorga tushadi. inline-block esa qatorda qoladi va 6rem enni oladi — narxlar ustun bo'lib tekislanadi.
3. Ikki qiymatli yozuv: tashqi va ichki tur
3.1 Har quti ikki savolga javob beradi
Ko'chadagi avtobusni tasavvur qiling. U boshqa mashinalar orasida yo'l qoidasi bo'yicha yuradi — bu uning tashqi xulqi. Ichida esa o'rindiqlar o'z tartibida terilgan — bu ichki tuzilishi. Ikkalasi bir-biriga bog'liq emas: bir xil avtobus ichida o'rindiqlar har xil terilishi mumkin.
CSS qutisi ham ikki savolga javob beradi:
- Tashqi tur (outer) — qo'shnilar orasida qanday turaman?
blockyokiinline. - Ichki tur (inner) — bolalarimni qanday teraman?
flow(oddiy oqim),flow-root,flex,grid,table.
Bugun ikkalasini bitta display da yozish mumkin:
| Eski yozuv | Ikki qiymatli yozuv | Ma'nosi |
|---|---|---|
block |
block flow |
Blok, ichi oddiy oqim |
inline |
inline flow |
Satr ichida, ichi oddiy oqim |
inline-block |
inline flow-root |
Satr ichida, ichi alohida "xona" |
flex |
block flex |
Blok, ichi flex |
inline-flex |
inline flex |
Satr ichida, ichi flex |
Endi inline-block nomining ma'nosi ochildi: tashqaridan inline, ichkaridan — o'z qoidalari bilan yashaydigan "blok". flex va grid — bolalarni terishning boshqa usullari. Ularni Flexbox'ga kirish va Grid'ga kirish darslarida o'rganamiz, hozir bilish shart emas.
flowchart LR
D["display: inline flow-root"] --> T["Tashqi tur: inline<br/>qo'shnilar orasida<br/>matn kabi turadi"]
D --> I["Ichki tur: flow-root<br/>bolalarini alohida<br/>xonada teradi"]Nimaga qarang: bitta display ikki savolga javob beradi. Birinchi so'z — tashqarisi, ikkinchisi — ichi.
Baseline ma'lumotlariga ko'ra, ikki qiymatli yozuv 2023-yil iyulidan beri to'rt asosiy brauzerning hammasida ishlaydi, 2026-yil yanvaridan esa "keng tarqalgan" (Widely available). Lekin kodlarda ko'proq eski bitta so'zli yozuvni uchratasiz, kursda ham ko'proq u. Ikki qiymatli yozuv display qanday o'ylanganini tushunish uchun kerak.
3.2 flow-root — margin'larni ichida ushlaydigan blok
Margin sirlari darsidagi muammo: kartaning birinchi bolasining margin'i kartadan tashqariga chiqib ketardi. Yechimlardan biri — kartaga display: flow-root:
<style>
:root {
--rang-fon: #fffaf0;
}
body {
background-color: #fde2c4;
}
.taom-karta {
background-color: var(--rang-fon);
margin-bottom: 1rem;
}
.taom-karta h3 {
margin-top: 32px;
}
.taom-karta + .taom-karta {
display: flow-root;
}
</style>
<article class="taom-karta">
<h3 class="taom-nomi">Osh — oddiy blok</h3>
</article>
<article class="taom-karta">
<h3 class="taom-nomi">Manti — flow-root</h3>
</article>Nimaga qarang: birinchi kartada qaymoq fon sarlavhaning tepasidan boshlanadi — margin tashqariga chiqqan. Ikkinchisida sarlavha ustida 32 piksellik qaymoq joy bor — margin karta ichida qoldi. Padding ham, border ham qo'shilmadi.
flow-root — "tashqaridan oddiy blok, ichkaridan alohida xona". Bunday "xona" ichidagi margin'lar tashqariga chiqmaydi. Rasmni matn o'rab turadigan eski float ni ham u o'z ichida ushlaydi. "Xona"ning rasmiy nomi — block formatting context. Uni Normal oqim va formatting context darsida chuqur o'rganamiz.
4. display: contents — o'rovchini olib tashlash
4.1 Nima qiladi
display: contents elementning o'z qutisini yo'q qiladi, bolalari esa qoladi. Go'yo o'rovchi teg HTML'da yo'qdek: bolalar to'g'ridan-to'g'ri bobosining bolasi bo'lib ko'rinadi. Elementning o'z padding'i, border'i va foni ham yo'qoladi:
<style>
:root {
--rang-asosiy: #2f6b3a;
--rang-urgu: #b4461a;
}
section {
border: 2px solid var(--rang-asosiy);
padding: 0.5em;
margin-bottom: 1rem;
}
div {
border: 2px dashed var(--rang-urgu);
padding: 0.5em;
}
section + section div {
display: contents;
}
</style>
<section>
<div><p>Osh</p><p>Manti</p></div>
</section>
<section>
<div><p>Osh</p><p>Manti</p></div>
</section>Nimaga qarang: ikkinchi section da qizg'ish punktir ramka yo'q — div ning qutisi yo'qoldi. Paragraflar esa joyida. Amalda bu grid va flex'da kerak bo'ladi: ichma-ich o'rovchi div bolalarni layout'dan "yashiradi", contents esa ularni qaytaradi.
4.2 Accessibility xavfi
Brauzer har element uchun accessibility daraxtini quradi (Accessibility daraxti). MDN hozir ham ogohlantiradi: ba'zi brauzerlarda display: contents berilgan element shu daraxtdan yo'qoladi. Ekran o'quvchi uning rolini — "ro'yxat", "tugma", "jadval" — aytmay qo'yadi. Bu brauzer xatosi, lekin u hali bor.
Chrome'da tekshirdik: ul, sarlavha va havola display: contents bilan ham rolini saqlab qoldi. Lekin tugma boshqa muammo ko'rsatdi: Tab uni butunlay chetlab o'tdi. Faqat klaviatura bilan ishlaydigan Bobur bunday tugmani bosa olmaydi.
Qoida oddiy: display: contents ni faqat ma'nosiz o'rovchiga — div yoki span ga — bering. Tugma, havola, ro'yxat, jadval, sarlavha va landmark'larga (nav, main) — hech qachon.
5. Yashirishning besh yo'li
5.1 display: none — butunlay yo'q
display: none elementni sahifadan olib tashlaydi: u joy egallamaydi, ko'rinmaydi, Tab bilan unga borib bo'lmaydi, ekran o'quvchi uni o'qimaydi. HTML'da u bor, lekin brauzer uni chizmaydi.
Ikki muhim xususiyat:
- Bolalar ham birga yo'qoladi. Bolaga
display: blockbersangiz ham, u ko'rinmaydi — Chrome'da tekshirdik. Yopiq qutidagi narsani ochiq qilib bo'lmaydi. - Siz uni allaqachon ishlatgansiz. SVG va ikonkalar darsidagi
style="display: none"sprite'ni aynan shunday yashirgan edi.symbollar ko'rinmaydi, lekinuseularni baribir chaqira oladi.
5.2 hidden atributi va uning tuzog'i
hidden atributi (Global atributlar) ichkarida xuddi shu display: none bilan ishlaydi — uni brauzer uslublari beradi. Mana shu yerda tuzoq bor. Brauzer uslubi eng kuchsiz manba. Sizning har qanday display qoidangiz uni yengadi (Kaskad):
<style>
:root {
--rang-asosiy: #2f6b3a;
}
.taom-karta {
display: block;
border: 2px solid var(--rang-asosiy);
padding: 0 1em;
}
</style>
<article class="taom-karta">
<h3 class="taom-nomi">Osh</h3>
</article>
<article class="taom-karta" hidden>
<h3 class="taom-nomi">Manti — bugun tugadi</h3>
</article>Nimaga qarang: "Manti — bugun tugadi" kartasi ko'rinib turibdi, garchi HTML'da hidden bo'lsa ham. .taom-karta { display: block; } brauzerning display: none qoidasini yengdi. Global atributlar darsida "hidden ishlamayotgandek tuyulsa — CSS'ni tekshiring" degan edik. Mana sababi.
Tuzatish — butun loyiha uchun bitta qoida:
/* hidden atributi har doim yutsin */
[hidden]:not([hidden="until-found"]) {
display: none !important;
}Kaskad darsida !important dan qochishni aytgan edik. Bu — kamdan-kam to'g'ri istisnolardan biri. hidden ning ma'nosi "hozir bu yo'q", u hech qanday bezakdan yutqazmasligi kerak.
:not([hidden="until-found"]) qismi nega kerak? hidden="until-found" boshqacha ishlaydi. Chrome'da tekshirdik: bunday elementning display i none emas, u yopiq, lekin Ctrl + F topganda ochiladi. Bizning qoidamiz unga ham none bersa, qidiruv uni hech qachon ocha olmasdi.
5.3 visibility: hidden — joy qoladi
visibility: hidden elementni ko'rinmas qiladi, lekin uning joyi qoladi. Bo'sh joy xuddi element turgandek. U bosilmaydi, Tab uni chetlab o'tadi, ekran o'quvchi o'qimaydi.
display: none dan yana bir farqi — bola o'zini "ochib" qo'yishi mumkin. Otaga visibility: hidden, bolaga visibility: visible bersangiz, bola ko'rinadi. Chrome'da tekshirdik.
5.4 opacity: 0 — ko'rinmas, lekin bor
Ranglar 1 darsida opacity: 0 elementni ko'rinmas qilishini, lekin joyida qoldirishini ko'rgan edik. Endi aniqroq:
- joy qoladi;
- element bosiladi — Chrome'da tekshirdik: ko'rinmas tugma o'z joyidagi bosishlarni ushlab qoldi;
Tabunga boradi — fokus ko'rinmas tugmaga tushadi;- ekran o'quvchi uni o'qiydi.
Ya'ni opacity: 0 — yashirish emas, "shaffof qilish". U animatsiyada qulay: element sekin paydo bo'ladi (Transition). Lekin animatsiyadan keyin ham opacity: 0 da qolgan tugma — sahifadagi ko'rinmas tuzoq.
5.5 inert — ko'rinadi, lekin tegib bo'lmaydi
inert atributini Global atributlar darsida ko'rgan edik. Element ko'rinib turadi, lekin uni bosib ham, Tab bilan unga borib ham bo'lmaydi, ekran o'quvchi o'qimaydi. O'shanda "inert qism ko'rinishidan ham faol emasligini bildirsin: masalan, xiraroq bo'lsin — buni CSS bilan qilamiz" degan edik:
<style>
:root {
--rang-ikkinchi: #5b6660;
}
[inert] {
opacity: 0.5;
}
[role="status"] {
color: var(--rang-ikkinchi);
}
</style>
<form action="https://example.com/bron" method="post" inert>
<p>
<label for="ism">Ismingiz</label>
<input id="ism" name="ism" type="text" value="Malika">
</p>
<button type="submit">Stolni band qilish</button>
</form>
<p role="status">Yuborilmoqda, biroz kuting…</p>Nimaga qarang: forma xiralashgan — mehmon uning hozir ishlamasligini ko'radi. Maydonni bosib yoki Tab ni bosib ko'ring: fokus formaga tushmaydi. Ostidagi xabar sababini aytadi. Faol bo'lmagan qism uchun WCAG kontrast talab qilmaydi (Ranglar 1), lekin sabab matni — to'liq kontrastda. Uni role="status" atributi (Jonli hududlar) orqali tanladik.
5.6 Hammasi bitta jadvalda
| Usul | Joy qoladimi | Ko'rinadi / bosiladi | Ekran o'quvchi |
|---|---|---|---|
display: none |
Yo'q | Yo'q / Yo'q | O'qimaydi |
hidden atributi |
Yo'q | Yo'q / Yo'q | O'qimaydi |
visibility: hidden |
Ha | Yo'q / Yo'q | O'qimaydi |
opacity: 0 |
Ha | Yo'q / Ha | O'qiydi |
inert |
Ha | Ha / Yo'q | O'qimaydi |
Uchtasini bitta natijada ko'ring:
<style>
li:nth-child(2) {
visibility: hidden;
}
li:nth-child(3) {
display: none;
}
li:nth-child(4) {
opacity: 0;
}
</style>
<ol>
<li>Osh — ko'rinadi</li>
<li>Lag'mon — visibility: hidden</li>
<li>Manti — display: none</li>
<li>Ko'k choy — opacity: 0</li>
<li>Non — ko'rinadi</li>
</ol>Nimaga qarang: "Osh" va "Non" orasida ikki bo'sh qator bor — visibility va opacity joyni saqlab qoldi. "Manti" esa izsiz yo'qoldi. Raqamlarga qarang: "Non" — 4-o'rinda. Ko'rinmas "Lag'mon" va "Ko'k choy" sanaldi, joyi ham yo'q "Manti" — yo'q.
Yana bir yo'l bor: elementni ko'zdan yashirish, lekin ekran o'quvchiga qoldirish — masalan, "Batafsil" havolasining "Batafsil: osh" degan to'liq nomi. Buning uchun beshala usul ham to'g'ri kelmaydi. Maxsus korinmas texnikasi kerak — uni position darsida yozamiz.
5.7 Qaysi birini qachon
- Holat ("hozir bu yo'q": tugagan taom, yopiq panel) —
hiddenatributi. Keyinroq JavaScript uni qo'yadi va olib tashlaydi. - Ekran eniga qarab yashirish (telefonda boshqa menyu) — CSS'da
display: none(Media queries). - Joy saqlansin, element ko'rinmasin —
visibility: hidden. - Silliq paydo bo'lish —
opacity, lekin oxirida yashirish kerak bo'lsa,visibilityyokihiddenbilan birga. - "Band" yoki "kuting" holati —
inertva xiralashtirish.
Tekshirib ko'ring: Telefonda "Aksiya" banneri
opacity: 0bilan yashirildi. BoburTabni bosib yurib, ko'rinmas havolaga tushib qoldi va nima bo'layotganini tushunmadi. Qaysi usul to'g'ri edi va nega?
Javob
Banner umuman kerak bo'lmasa — display: none yoki hidden: fokus ham, ekran o'quvchi ham unga tushmaydi. Joyi saqlanishi kerak bo'lsa — visibility: hidden: u ham fokusni o'tkazib yuboradi. opacity: 0 elementni faqat ko'zdan yashiradi — klaviatura va ekran o'quvchi uchun u hali ham sahifada.
6. Foydalanuvchi bilan "muloqot": pointer-events, cursor, user-select
6.1 pointer-events: none — bosishni o'tkazib yuborish
pointer-events: none element ustidagi sichqoncha va barmoq bosishlarini uning ostidagiga o'tkazadi. Element go'yo shisha bo'lib qoladi. Bu bezak qatlami uchun kerak: masalan, karta ustiga ::before bilan chizilgan soya bosishlarni to'smasin (Pseudo-elementlar).
Diqqat:
pointer-events: nonehavola yoki tugmani o'chirmaydi. Chrome'da tekshirdik: bunday havolani sichqoncha bilan bosib bo'lmadi, lekinTabunga bordi vaEnteruni ochadi. Tugmani o'chirish kerak bo'lsa —disabledatributi, butun qismni —inert.
6.2 cursor — sichqoncha ko'rsatkichi
cursor sichqoncha element ustida qanday ko'rinishini belgilaydi. Eng ko'p ishlatiladiganlari:
pointer— qo'l belgisi; havolalarda brauzer uni o'zi qo'yadi;text— matn tanlash belgisi;not-allowed— "mumkin emas" belgisi;default— oddiy strelka.
button:disabled {
cursor: not-allowed;
}Faol bo'lmagan tugma ustida sichqoncha "taqiq" belgisini ko'rsatadi — foydalanuvchi nega bosilmayotganini tushunadi.
Baseline ma'lumotlari not-allowed kabi qiymatlarni "Baseline emas" deb belgilaydi. Sababi: telefondagi Safari'da sichqoncha kursori yo'q. Kompyuterdagi to'rt asosiy brauzerning hammasida ular ishlaydi, telefonda esa qator shunchaki e'tiborsiz qoladi — zaxira kerak emas. Xulosa: cursor faqat qo'shimcha ishora bo'lsin. Telefondagi mehmon uni hech qachon ko'rmaydi.
6.3 user-select — matnni belgilash
user-select: none matnni sichqoncha bilan belgilashni taqiqlaydi. Ehtiyot bo'ling: mehmon narxni, manzilni yoki telefon raqamini nusxalamoqchi bo'ladi. Matnni belgilashni taqiqlash — uni jazolash. Faqat interfeys bo'laklarida kerak: masalan, tez-tez bosiladigan tugma yozuvi belgilanib ketmasin.
Baseline ma'lumotlariga ko'ra user-select — Baseline emas: Safari faqat -webkit- old qo'shimchali nomini tushunadi. Shuning uchun ikkala qator yoziladi:
button {
-webkit-user-select: none;
user-select: none;
}Birinchi qator — Safari uchun zaxira. Boshqa brauzerlar tushunmagan qatorni tashlab ketadi (CSS nima darsidagi qoida), keyin standart nomni o'qiydi. Bunday old qo'shimchalarni avtomatik qo'shadigan vositani PostCSS va Autoprefixer darsida ko'rasiz.
7. Ko'p uchraydigan xatolar
7.1 span ga width yoki margin-top
Hech narsa o'zgarmaydi, DevTools deklaratsiyani xira qiladi. Tuzatish: display: inline-block yoki display: block.
7.2 hidden ishlamayapti
Elementda hidden bor, u baribir ko'rinadi. Sabab — muallif CSS'idagi display qoidasi. Tuzatish: [hidden]:not([hidden="until-found"]) { display: none !important; }.
7.3 Ko'rinmas tugma bosishlarni "yeydi"
opacity: 0 bilan yashirilgan element joyida qoladi va ostidagi tugmani to'sadi. Tuzatish: visibility: hidden yoki hidden.
7.4 pointer-events: none bilan "o'chirish"
Sichqoncha ishlamaydi, klaviatura — ishlaydi. Tuzatish: disabled yoki inert.
7.5 Ma'noli elementga display: contents
Ro'yxat, tugma yoki jadval rolini yo'qotishi yoki fokusdan chiqib qolishi mumkin. Tuzatish: o'rniga ichki ma'nosiz div ga bering yoki layout'ni boshqacha quring.
7.6 display: none bilan "faqat ekran o'quvchi uchun" matn
display: none ekran o'quvchidan ham yashiradi. Tuzatish: korinmas texnikasi (position).
8. Mashqlar
Mashqlarni kurs/mashqlar/05/ papkasida bajaring.
1-mashq (oson): Qaysi usul?
Har vaziyat uchun usul tanlang: display: none, hidden, visibility: hidden, opacity: 0, inert.
- Taom tugadi — kartasi sahifadan butunlay yo'qolsin (holat) —
- Forma yuborilayotganda uni bosib bo'lmasin, lekin ko'rinib tursin —
- Jadval kataklaridagi ikonka yo'q qatorda o'rni bo'sh tursin, ustunlar siljimasin —
- Telefonda katta ekran uchun mo'ljallangan rasm ko'rinmasin (CSS'da) —
Ishora: "Qaysi birini qachon" ro'yxati.
Yechim
hidden— bu HTML ma'nosi: "hozir bu yo'q". CSS bezagi emas.inert— ko'rinadi, lekin tegib bo'lmaydi. Yoniga sabab matnini yozing.visibility: hidden— joy saqlanadi, qatorlar tekis qoladi.display: none— ekran eniga bog'liq shartni CSS'dagi media query'da yozasiz (Media queries).
opacity: 0 hech biriga to'g'ri kelmadi. U — animatsiya vositasi, yashirish emas.
2-mashq (o'rta): Bron formasining yorliqlari
«Bahor» bron formasida har maydon o'z div ida: label, keyin yordam matni (span, id si -yordam bilan tugaydi), keyin maydon:
<div>
<label for="telefon">Telefon raqamingiz</label>
<span id="telefon-yordam">Masalan: +998 90 000 00 00.</span>
<input id="telefon" name="telefon" type="tel"
autocomplete="tel" required
aria-describedby="telefon-yordam">
</div>asosiy.css ga yozing:
- Yorliq — o'z qatorida, qalin.
- Yordam matni — o'z qatorida, kichikroq (
0.875rem) va ikkinchi darajali rangda. - Har maydon guruhi (
div) keyingisidan1remuzoqda — oraliqni layout beradi.
Ishora: 1–2-bandlar — display: block. Yordam matnini tanlash — Atribut selektorlari darsidagi "shu bilan tugaydi" ($=). 3-band — Margin sirlari dagi * + *.
Yechim
<style>
:root {
--rang-ikkinchi: #5b6660;
}
form label {
display: block;
font-weight: bold;
}
span[id$="-yordam"] {
display: block;
font-size: 0.875rem;
color: var(--rang-ikkinchi);
}
form > * + * {
margin-top: 1rem;
}
</style>
<form action="https://example.com/bron" method="post">
<div>
<label for="ism">Ismingiz</label>
<input id="ism" name="ism" type="text" autocomplete="name">
</div>
<div>
<label for="telefon">Telefon raqamingiz</label>
<span id="telefon-yordam">Masalan: +998 90 000 00 00.</span>
<input id="telefon" name="telefon" type="tel"
autocomplete="tel" required
aria-describedby="telefon-yordam">
</div>
</form>labelvaspan— satr ichidagi elementlar.display: blockularning har birini o'z qatoriga qo'ydi. Maydon ham shu sabab alohida qatorga tushdi.span[id$="-yordam"]—idsi-yordambilan tugaydiganspan. Formaga yangi maydon qo'shilsa, uning yordam matni ham o'zi bezaladi.form > * + *— ikkinchi va keyingi guruhlar tepadan 1rem oladi.- HTML'ga tegmadik:
labelvaforbog'lanishi o'z joyida, ekran o'quvchi uchun hech narsa o'zgarmadi.
3-mashq (qiyin): Uch sir
Stajyorning sahifasida uch muammo:
.aksiya {
display: block;
}
nav ul {
display: contents;
}
/* bron bugun yopiq */
.bron-havola {
pointer-events: none;
}<p class="aksiya" hidden>Aksiya tugadi</p>
<nav aria-label="Asosiy menyu">
<ul>
<li><a href="menyu/">Menyu</a></li>
<li><a href="bron/">Bron</a></li>
</ul>
</nav>
<a class="bron-havola" href="bron/">Stolni band qilish</a>- Tugagan aksiya ko'rinib turibdi. Nega? Tuzating.
nav uldagi qoida qanday xavf tug'diradi?- Bron bugun yopiq. Havola sichqoncha bilan bosilmaydi, lekin Bobur baribir bron sahifasiga o'tib ketdi. Qanday? To'g'ri yechim qanday bo'ladi?
Ishora: "hidden atributi va uning tuzog'i", "Accessibility xavfi" va "pointer-events: none" bo'limlari. 3-band uchun o'ylang: havola bosilmaydigan bo'lishi kerakmi yoki umuman yo'q bo'lishi kerakmi?
Yechim
.aksiya { display: block; }brauzerning[hidden]qoidasini yengdi. Tuzatish — loyihaga umumiy qoida:
[hidden]:not([hidden="until-found"]) {
display: none !important;
}ulgadisplay: contents— ba'zi brauzer va ekran o'quvchi juftligida ro'yxat roli yo'qolishi mumkin: "ro'yxat, 2 ta element" degan e'lon aytilmaydi. Ro'yxat — ma'noli element, ungacontentsbermaymiz. Menyuni yonma-yon terish kerak bo'lsa, buniulning o'zida flex bilan qilamiz (Flexbox'ga kirish).pointer-events: nonefaqat sichqonchani to'xtatadi. BoburTabbilan havolaga borib,Enterni bosdi — havola ishladi. Yopiq bron uchun havola kerak emas. HTML'da uning o'rniga matn yozing: "Bron bugun yopiq, ertaga 9:00 dan ochiladi". Havola faqat bron ochiq bo'lganda turadi. Havoladadisabledatributi yo'q — havolani "o'chirib" bo'lmaydi, uni olib tashlash kerak (Tugma yoki havola). Holat HTML'ning o'zida ifodalanadi, CSS'da "yopiq" degan yamoq qolmaydi.
4-mashq: Portfolio qadami — aloqa formasi tartibga keladi
box-sizing darsida maydonlar butun enni oldi va yorliqlar tasodifan ularning ustiga tushdi. Endi buni ataylab qilamiz:
- Matn maydonlarining yorliqlari — o'z qatorida. Radio tugmalarining yorliqlari esa tugma yonida qolsin.
- Email ostidagi yordam matni (
email-yordam) — o'z qatorida,0.875remva ikkinchi darajali rangda. - Loyihaga
[hidden]himoya qoidasini qo'shing — hozir portfolio'dahiddenyo'q, lekin 09-qismda JavaScript uni ishlatadi. - DevTools'da yorliqni tanlang va Computed'da
displayqiymatini tekshiring.
Ishora: portfolio formasida har maydon p ichida. Matn maydonida label — p ning birinchi bolasi, radio'da esa birinchi bola — input. :first-child (Tuzilma pseudo-klasslari).
Yechim
"Umumiy" bo'limga:
/* hidden atributi har doim yutsin */
[hidden]:not([hidden="until-found"]) {
display: none !important;
}"Sahifa qismlari" bo'limiga:
/* Aloqa formasi: matn maydoni yorlig'i o'z qatorida */
p > label:first-child {
display: block;
}
/* Maydon ostidagi yordam matni */
span[id$="-yordam"] {
display: block;
font-size: 0.875rem;
color: var(--rang-ikkinchi);
}Aloqa formasi taxminan shunday ko'rinadi:
<style>
:root {
--rang-matn: #1f2a24;
--rang-fon: #f7faf8;
--rang-ikkinchi: #5b6660;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
font-family: system-ui, sans-serif;
color: var(--rang-matn);
background-color: var(--rang-fon);
}
button,
input,
textarea {
font: inherit;
}
input:not([type="radio"]),
textarea {
width: 100%;
padding: 0.5em;
}
p > label:first-child {
display: block;
}
span[id$="-yordam"] {
display: block;
font-size: 0.875rem;
color: var(--rang-ikkinchi);
}
</style>
<form action="https://example.com/aloqa" method="post">
<p>
<label for="email">Email</label>
<input id="email" name="email" type="email"
autocomplete="email" required
aria-describedby="email-yordam">
<span id="email-yordam">Javobni shu manzilga yozaman.</span>
</p>
<fieldset>
<legend>Qaysi mavzuda?</legend>
<p>
<input id="mavzu-ish" name="mavzu" type="radio"
value="ish" required>
<label for="mavzu-ish">Ish taklifi</label>
</p>
</fieldset>
<button type="submit">Yuborish</button>
</form>p > label:first-child—pning birinchi bolasi bo'lganlabel. Radio yorlig'i ikkinchi bola — u tanlanmadi va tugma yonida qoldi.- Yordam matni endi maydon ostida alohida qatorda. Uning
idsiaria-describedbybilan bog'langan — ekran o'quvchi uchun hech narsa o'zgarmadi. #5b6660portfolio fonida 5.7:1 (Ranglar 1 portfolio qadami) — kichik matn uchun ham yetarli.- 4-band:
label—display: block, yordamspani hamblock. Radio yorlig'i —inline.
9. Real ishda
display— layout'ning eshigi. Flex va grid hamdisplayqiymatlari. Keyingi o'nlab darslar aslidadisplayning ichki turlarini o'rganadi.- Komponent kutubxonalari
hiddenvadisplay: noneni holat uchun keng ishlatadi. Ko'p loyihalarning reset'ida[hidden]himoya qoidasi bor — endi uning sababini bilasiz. - Accessibility auditi "ko'rinmas, lekin fokus oladigan" elementlarni alohida qidiradi — ko'pincha ular
opacity: 0bilan yashirilgan bo'ladi. - Intervyuda so'raladi: "
display: none,visibility: hiddenvaopacity: 0farqi?", "inlinevainline-blockfarqi?", "display: contentsnima va uning qanday xavfi bor?".
Xulosa
block— yangi qator, butun en;inline— matn ichida,width,heightva vertikal margin ishlamaydi;inline-block— matn ichida, o'lcham oladi.display= tashqi tur + ichki tur:inline-block—inline flow-root,inline-flex—inline flex.flow-rootmargin'larni ichida ushlaydi;contentso'rovchini yo'q qiladi — faqat ma'nosizdivga.display: nonevahidden— joy ham, o'qish ham yo'q;visibility: hidden— joy qoladi;opacity: 0— bosiladi va o'qiladi;inert— ko'rinadi, tegib bo'lmaydi.[hidden]ni muallifdisplayi yengadi — himoya qoidasini qo'shing.pointer-events: noneklaviaturani to'xtatmaydi;user-select: none— faqat interfeys bo'laklarida,-webkit-bilan.
Keyingi dars: O'lchamlar — width va height, min- va max- chegaralar, min-content, fit-content, aspect-ratio va barmoq bilan bosiladigan joyning eng kichik o'lchami.
Manbalar
- MDN: "display", "Using the multi-keyword syntax with CSS display", "visibility", "pointer-events", "user-select", "inert" — developer.mozilla.org
- W3C: "CSS Display Module Level 3" — w3.org/TR/css-display-3
- web-features (Baseline ma'lumotlari): "two-value-display", "display-contents", "user-select" — github.com/web-platform-dx/web-features
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!