09 β Selektorlar¶
β¬ οΈ Oldingi: 08 β CSS asoslari Β· π README Β· Keyingi: 10 β Cascade, specificity va inheritance β‘οΈ
Bu bobda: elementlarni aniq tanlash: tur, klass, id, kombinatorlar va psevdolar.
CSS yozishning yarmi β qoidalarni yozish (color: red), ikkinchi yarmi esa qaysi elementga shu qoidani qo'llashni aytish. Mana shu "qaysi elementga" degan savolga javob beradigan vosita selektor (selector β tanlovchi) deb ataladi.
Tasavvur qil: sen sinfdagi o'qituvchisan. "Birinchi qatordagilar turing", "ko'ylagi qizil bo'lganlar qo'l ko'taring", "Aliyevning yonidagi o'tirgan o'quvchi" β bularning har biri bir guruh odamni aniqlab beradi. Selektor ham xuddi shunday: sahifadagi minglab elementdan kerakligini ajratib oladi. Bu bob seni eng sodda selektordan (p) to expert darajadagi murakkab tanlovlargacha (li:not(:last-child)::after) bosqichma-bosqich olib boradi.
π‘ Selektorni yaxshi bilish β CSS'da eng kuchli ko'nikma. Ko'p odam CSS "ishlamayapti" deb shikoyat qiladi, aslida muammo qoidada emas, selektor noto'g'ri elementni tanlayotganida bo'ladi.
9.1 Selektor nima va u qanday ishlaydi¶
Har bir CSS qoidasi ikki qismdan iborat: selektor va deklaratsiya bloki.
Bu qoida shunday o'qiladi: "Sahifadagi har bir <p> elementini top va matn rangini ko'k qil."
Brauzer HTML'ni o'qiyotganda sahifani daraxt (DOM β Document Object Model) ko'rinishida tuzadi: <html> ildiz, ichida <body>, uning ichida boshqa elementlar va hokazo. Selektor β shu daraxtdan kerakli "shoxlar"ni terib oladigan filtr.
π Bitta element bir nechta selektorga mos kelishi mumkin (masalan, <p class="muhim"> ham p, ham .muhim, ham * selektoriga tushadi). Qaysi qoida g'olib chiqishi spesifiklik (specificity) qoidalariga bog'liq β buni keyingi bobda ko'ramiz. Hozircha selektorlarning o'zini puxta o'rganamiz.
9.2 Asosiy selektorlar: tur, klass, id¶
Bu uchtasi β CSS'ning kundalik noni. 95% holatda shulardan foydalanasan.
Tur selektori (element/type selector)¶
Element nomini shundoq yozasan β hech qanday belgi qo'ymasdan.
p { line-height: 1.6; } /* barcha <p> */
h1 { font-size: 32px; } /* barcha <h1> */
button { cursor: pointer; } /* barcha <button> */
Nega kerak? Sahifadagi bir TURDAGI barcha elementga umumiy ko'rinish berish uchun. Masalan, barcha paragraflarning satrlar orasini kengaytirish.
β οΈ Tur selektori juda keng. p { color: red } desang, sahifadagi tagidagi eng kichik paragrafga ham ta'sir qiladi. Aniqroq nishon kerak bo'lsa β klassdan foydalan.
Klass selektori (class selector)¶
HTML'da elementga class="..." atributini berasan, CSS'da esa nuqta . bilan murojaat qilasan.
Nega klass eng ko'p ishlatiladi?
- Bitta klassni istalgancha ko'p elementga berish mumkin (yuqorida <p> ham, <span> ham).
- Bitta elementga bir nechta klass berish mumkin: <div class="karta katta faol">.
- Element turidan mustaqil β bugun <p>, ertaga <div> bo'lsa ham klass o'sha-o'sha ishlaydi.
π‘ Amaliyotda CSS'ning aksariyati klasslar ustiga quriladi. Bu element turiga bog'lanib qolmaslik va qayta foydalanish imkonini beradi.
Id selektori (id selector)¶
id="..." atributiga panjara # bilan murojaat qilasan.
Muhim qoida: bitta id sahifada faqat bir marta ishlatilishi kerak β u noyob identifikator. class esa qayta-qayta ishlatiladi.
β οΈ Id selektorni stil berish uchun ishlatish tavsiya etilmaydi. Sababi: id juda "kuchli" (yuqori spesifiklik), keyinroq uni klass bilan qayta yozish qiyin bo'ladi. Id'lar ko'proq JavaScript va sahifa ichi havolalari (<a href="#bosh-qism">) uchun ishlatiladi. Stil uchun β klass.
Qiyoslash jadvali¶
| Selektor | Yozilishi | Necha marta | Asosiy maqsad |
|---|---|---|---|
| Tur | p |
cheksiz | bir turdagi barcha element |
| Klass | .box |
cheksiz | qayta ishlatiluvchi stil |
| Id | #main |
bir marta | noyob element, JS, havola |
9.3 Universal va guruhlash selektorlari¶
Universal selektor *¶
Yulduzcha hamma narsani tanlaydi β istisnosiz.
Nega kerak? Eng ko'p ishlatiladigan joyi β yuqoridagi kabi "reset": brauzer har bir elementga beradigan standart bo'shliqlarni nolga tushirish va box-sizing ni hamma joyda bir xil qilish.
β οΈ * ni keng qo'llashdan ehtiyot bo'l. U har bir elementga tegadi, shuning uchun unga og'ir qoidalar (masalan transition: all) yozsang, sahifa sekinlashishi mumkin. Reset uchun yaxshi, qolgan hollarda aniqroq selektor afzal.
Guruhlash (vergul bilan)¶
Bir nechta selektorga bir xil qoida berish kerak bo'lsa, ularni vergul bilan sanaysan.
Bu β quyidagining qisqa shakli:
h1 { font-family: "Segoe UI", sans-serif; color: #1e293b; }
h2 { font-family: "Segoe UI", sans-serif; color: #1e293b; }
h3 { font-family: "Segoe UI", sans-serif; color: #1e293b; }
Nega vergul muhim? Vergulni unutsang, ma'no butunlay o'zgaradi:
h1 h2 { ... } /* h1 ICHIDAGI h2 (kombinator!) β odatda mavjud emas */
h1, h2 { ... } /* h1 VA h2 (guruhlash) */
β οΈ Bu juda tez-tez uchraydigan xato: vergulni tushirib qoldirsang, brauzer xato bermaydi β shunchaki butunlay boshqa narsani tanlaydi va sen nima uchun "stil ishlamayapti" deb hayron bo'lasan.
π‘ Bitta umumiy maslahat: agar vergulli ro'yxatdagi bironta selektor noto'g'ri (brauzer tushunmaydigan) bo'lsa, eski brauzerlarda butun qoida e'tiborsiz qoldirilishi mumkin. Yangi xususiyatlarni alohida yozish xavfsizroq.
9.4 Kombinatorlar: elementlarni munosabati bo'yicha tanlash¶
Hozirgacha alohida elementlarni tanladik. Kombinatorlar esa elementlarni bir-biriga nisbatan joylashuvi bo'yicha tanlash imkonini beradi: "shu element ICHIDAGI", "to'g'ridan-to'g'ri farzandi", "darhol keyingisi" va hokazo.
Quyidagi diagramma to'rt kombinatorni bitta DOM daraxtida ko'rsatadi β har biri qaysi elementni tanlashini rang bilan ajratdik.
Endi har birini alohida ko'ramiz. Misollar uchun shu HTML'dan foydalanamiz:
<div class="box">
<p>Birinchi <span>matn</span></p>
<ul>
<li class="bir">Bir</li>
<li class="ikki">Ikki</li>
<li class="uch">Uch</li>
</ul>
</div>
Avlod kombinatori β bo'shliq a b¶
Ikki selektor orasiga bo'shliq qo'ysang, bu "birinchisi ICHIDAGI ikkinchisi" degani β qanchalik chuqurda bo'lishidan qat'i nazar.
<span> <p> ning ichida, <p> esa .box ning ichida. Span to'g'ridan-to'g'ri .box ning farzandi bo'lmasa ham β baribir tanlanadi, chunki u .box ning avlodi (nabira, evara β farqi yo'q).
Bevosita farzand kombinatori β >¶
> belgisi faqat to'g'ridan-to'g'ri farzandni tanlaydi (bir pog'ona pastda).
<p> to'g'ridan-to'g'ri .box ichida β tanlanadi. Ammo .box > span hech narsani tanlamaydi, chunki <span> .box ning bevosita farzandi emas (u <p> ichida).
Nega ikkalasi kerak? Bo'shliq β "chuqurligi muhim emas, ichida bo'lsa bas". > β "aniq bitta pog'ona pastda". Murakkab tuzilmalarda > xatolardan saqlaydi: masalan, faqat yuqori darajadagi menyu bandlarini tanlab, ichki ostmenyularga tegmaslik uchun.
Qo'shni birodar kombinatori β +¶
+ belgisi darhol keyingi bitta birodarni tanlaydi (bir ota-ona ostida, ketma-ket turgan).
Bu li.ikki ni tanlaydi (chunki u li.bir dan darhol keyin keladi). li.uch tanlanmaydi β u keyingi emas, undan keyingisi.
Umumiy birodar kombinatori β ~¶
~ belgisi keyingi BARCHA birodarlarni tanlaydi (faqat darhol keyingisini emas).
Bu li.ikki va li.uch ni tanlaydi.
β οΈ Ham +, ham ~ faqat keyinga qaraydi. Oldinga (yuqoriga) qaragan kombinator yo'q: li.uch + li yoki li.uch ~ li hech narsani tanlamaydi, chunki li.uch dan keyin birodar yo'q. CSS daraxtni yuqoridan pastga o'qiydi.
Qisqa jadval¶
| Kombinator | O'qilishi | Misol | Tanlaydi |
|---|---|---|---|
| (bo'shliq) | ichidagi (avlod) | div p |
div ichidagi barcha p |
> |
bevosita farzand | div > p |
faqat to'g'ridan-to'g'ri p |
+ |
qo'shni birodar | h2 + p |
h2 dan keyingi bitta p |
~ |
umumiy birodar | h2 ~ p |
h2 dan keyingi barcha p |
9.5 Atribut selektorlari¶
Elementlarni ularning atributi yoki uning qiymati bo'yicha tanlash mumkin. Bu kvadrat qavslar [ ] orqali yoziladi.
Atribut mavjudligi bo'yicha¶
[disabled] { opacity: 0.5; } /* disabled atributi BOR har qanday element */
[required] { border-color: orange; }
input[type] { ... } /* type atributi bor input */
Aniq qiymat bo'yicha [atr=qiymat]¶
input[type="text"] { border: 1px solid #94a3b8; }
input[type="password"] { letter-spacing: 2px; }
a[target="_blank"] { color: #2563eb; }
Bu β formalar bilan ishlashda juda qadrli, chunki barcha <input> bir xil teg, lekin type ularni farqlaydi.
Qism bo'yicha moslash (kuchli operatorlar)¶
Mana bu yerda atribut selektorlari haqiqatan kuchli bo'ladi. Qiymatning bir qismini ham qidirish mumkin:
| Operator | Ma'nosi | Misol | Mos keladi |
|---|---|---|---|
^= |
bilan boshlanadi | [href^="https"] |
https://... |
$= |
bilan tugaydi | [href$=".pdf"] |
hujjat.pdf |
*= |
ichida bor | [class*="btn"] |
btn-katta, mening-btn |
~= |
bo'sh joy bilan ajralgan so'z | [class~="faol"] |
karta faol katta |
\|= |
qiymat yoki qiymat-... |
[lang\|="uz"] |
uz, uz-UZ |
Amaliy misollar:
/* Tashqi havolalarni ajratish */
a[href^="https://"] { color: #2563eb; }
/* Fayl turini ikonka bilan belgilash */
a[href$=".pdf"]::after { content: " (PDF)"; }
/* Nomida "btn" bo'lgan har qanday klass */
[class*="btn"] { cursor: pointer; }
/* Elektron pochta havolalari */
a[href^="mailto:"] { color: #16a34a; }
π‘ ^= (boshi) va $= (oxiri) ni eslab qolish uchun: regular expression (matn shabloni) sintaksisida ham ^ "boshi", $ "oxiri" degani. Bir xil mantiq.
β οΈ Atribut qiymatlarini qo'shtirnoq ichiga olish odat tusiga aylansin: [type="text"]. Oddiy so'zlar uchun tirnoqsiz ham ishlaydi, lekin qiymatda nuqta, bo'sh joy yoki maxsus belgi bo'lsa, tirnoqsiz buziladi. Doim tirnoq qo'yish β xavfsiz odat.
π Katta-kichik harf: atribut selektorlari odatda qiymatga sezgir ([type="Text"] ishlamasligi mumkin). HTML atributlari uchun katta-kichikni e'tiborsiz qoldirishni istasang, yopuvchi qavsdan oldin i qo'shasan: [type="text" i].
9.6 Psevdo-klasslar: holatga qarab tanlash¶
Psevdo-klass (pseudo-class) β elementning HTML'da ko'rinmaydigan holati yoki o'rni bo'yicha tanlash. Bitta ikki nuqta : bilan yoziladi. "Psevdo" β "go'yo, soxta" degani: bu HTML'da yozilmagan, lekin go'yoki mavjud klass.
Foydalanuvchi harakati holatlari¶
Bular foydalanuvchining sichqoncha/klaviatura bilan qilayotgan ishiga javob beradi:
a:hover { color: #2563eb; } /* sichqoncha ustida */
a:focus { outline: 2px solid #2563eb; } /* fokusda (Tab bilan) */
a:active { color: #dc2626; } /* bosilayotgan paytda */
Nega :focus muhim? Klaviatura bilan saytda yuradigan odamlar (sichqonchasiz, yoki maxsus imkoniyatli foydalanuvchilar) qaerda turganini ko'rishi shart. :focus stilini olib tashlama β bu qulaylik (accessibility) masalasi.
π Tartib muhim: havolalar uchun an'anaviy ketma-ketlik :link, :visited, :hover, :active (inglizcha "LoVe HAte" deb eslanadi). Aks holda :hover :active ni "bosib qo'yishi" mumkin.
Tuzilma (o'rin) bo'yicha psevdo-klasslar¶
Bular elementning ota-onasi ichidagi o'rni bo'yicha tanlaydi:
li:first-child { font-weight: bold; } /* ro'yxatdagi BIRINCHI li */
li:last-child { border: none; } /* OXIRGI li */
li:nth-child(2) { color: red; } /* aniq 2-li */
:nth-child() β eng kuchlisi. Ichiga formula yoki kalit so'z yozasan:
li:nth-child(odd) { background: #f8fafc; } /* toq: 1,3,5 */
li:nth-child(even) { background: #e2e8f0; } /* juft: 2,4,6 */
li:nth-child(2n) { ... } /* even bilan bir xil */
li:nth-child(3n) { ... } /* har 3-: 3,6,9 */
li:nth-child(3n+1) { ... } /* 1,4,7,10 */
Quyidagi diagramma formulani vizual tushuntiradi:
Formulani qanday o'qish kerak? an+b da n ketma-ket 0, 1, 2, 3... qiymat oladi:
- 2n β 2Β·0=0 (yo'q), 2Β·1=2, 2Β·2=4, 2Β·3=6 β 2, 4, 6
- 3n+1 β 3Β·0+1=1, 3Β·1+1=4, 3Β·2+1=7 β 1, 4, 7
π‘ Eng mashhur amaliy ishi β jadval qatorlarini almashlab bo'yash ("zebra"): tr:nth-child(even) { background: #f1f5f9; }. Ko'z toliqmaydi, qatorlar adashmaydi.
:first-of-type va o'rin psevdolari farqi¶
:first-child "ota-ona ichidagi birinchi farzand bo'lsa" deydi β agar u o'sha turdagi bo'lsa. :first-of-type esa "o'z TURI bo'yicha birinchi" deydi.
p:first-child { ... } /* HECH NARSA β birinchi farzand h2, p emas */
p:first-of-type { ... } /* "Birinchi paragraf" β p'lar orasida birinchi */
β οΈ Bu eng ko'p chalkashtiriladigan joy. p:first-child "birinchi farzand HAM p bo'lishi shart" demakdir. Agar birinchi farzand boshqa element bo'lsa β hech nima tanlanmaydi. Aralash bolalarda ko'pincha senga :first-of-type kerak bo'ladi.
Inkor: :not()¶
:not() β "shunday BO'LMAGAN" elementlarni tanlaydi. Ichiga selektor yozasan.
li:not(.faol) { opacity: 0.6; } /* .faol BO'LMAGAN li */
input:not([type="submit"]) { width: 100%; } /* submit BO'LMAGAN input */
button:not(:last-child) { margin-right: 8px; }
Nega kerak? "Oxirgisidan tashqari hammasiga" kabi qoidalarni juda ixcham yozadi. Yuqoridagi oxirgi misol: oxirgi tugmadan boshqa hamma tugmaga o'ng tomondan bo'shliq beradi β natijada tugmalar orasida bo'shliq bo'lib, oxirida ortiqcha bo'shliq qolmaydi.
Forma holatlari¶
input:checked { ... } /* belgilangan checkbox/radio */
input:disabled { background: #e2e8f0; } /* o'chirilgan */
input:enabled { ... } /* yoqilgan */
input:required { ... } /* majburiy */
input:valid { border-color: #16a34a; } /* to'g'ri to'ldirilgan */
input:invalid { border-color: #dc2626; } /* xato to'ldirilgan */
π‘ :checked JavaScript'siz juda ko'p narsa qilishga imkon beradi: ochiladigan menyular, tab'lar, akkordeonlar β barchasi yashirin checkbox + :checked + birodar kombinatori bilan quriladi.
9.7 Psevdo-elementlar: yangi "soxta" elementlar yaratish¶
Psevdo-klass mavjud elementni tanlardi. Psevdo-element esa elementning bir QISMINI tanlaydi yoki butunlay yangi (HTML'da yo'q) mazmun qo'shadi. U ikkita ikki nuqta :: bilan yoziladi β shu bilan psevdo-klassdan farqlanadi.
π Tarixiy sabab: eski CSS'da bitta : ishlatilardi (:before). Hozir ikkitasi (::before) standart. Brauzerlar ikkalasini ham tushunadi, lekin yangi kodda doim :: yoz.
::before va ::after β kontent qo'shish¶
Bular element ichiga, mazmunining boshiga (::before) yoki oxiriga (::after) yangi mazmun qo'shadi. Ular ishlashi uchun content xususiyati shart (bo'sh bo'lsa ham: content: "").
.tashqi-havola::after {
content: " β";
color: #2563eb;
}
.muhim::before {
content: "β
";
color: #f59e0b;
}
Quyidagi diagramma ::before va ::after element ichida aniq qayerga qo'shilishini ko'rsatadi:
Nega content shart? ::before/::after aslida "bo'sh joy" β sen unga nima qo'yishni content orqali aytasan. content yo'q bo'lsa, psevdo-element umuman paydo bo'lmaydi.
Amaliy qo'llanishlar:
- Ikonkalar va belgilar qo'shish (yulduzcha, o'q, tirnoq belgilari).
- Dekorativ chiziqlar va shakllar (content: "" + width/height/background).
- Majburiy maydonlarga * qo'shish: label.majburiy::after { content: " *"; color: #dc2626; }.
β οΈ Muhim qoida: ::before/::after ga qo'shilgan mazmun dekorativ. Ekran o'quvchilari (screen reader) uni har doim ham o'qimaydi va u nusxalashda olinmasligi mumkin. Shuning uchun muhim ma'lumotni (masalan, asosiy matnni yoki tugma yorlig'ini) bu yerga yozma β faqat bezak uchun ishlat.
Matn qismlarini tanlash: ::first-line, ::first-letter¶
p::first-letter { /* birinchi HARF */
font-size: 3em;
float: left;
color: #2563eb;
}
p::first-line { /* birinchi SATR */
font-weight: bold;
}
::first-letter β gazeta/kitoblardagi katta bosh harf (drop cap) effekti uchun klassik. ::first-line esa birinchi satrni ajratadi β diqqat: "satr" oyna kengligiga qarab o'zgaradi, shuning uchun bu dinamik.
::selection β belgilangan matn¶
Foydalanuvchi sichqoncha bilan ajratib (tanlab) olgan matn ko'rinishini o'zgartiradi:
π‘ Brend ranglaringizga mos tanlov rangi β sayt pishiqligini ko'rsatadigan kichik, lekin yoqimli detal.
::placeholder β input ichidagi ko'rsatma matn¶
<input placeholder="Ismingiz"> ichidagi xira ko'rsatma matnning ko'rinishini boshqaradi.
β οΈ Placeholder rangini juda xira qilma β o'qib bo'lmaydigan ko'rsatma yo'q bo'lgani bilan barobar. Va placeholder yorliq (label) o'rnini bosa olmaydi: har bir maydonga haqiqiy <label> ber.
Bir nuqta yoki ikki nuqta?¶
| Tur | Belgi | Misol | Nimani |
|---|---|---|---|
| Psevdo-klass | : (bitta) |
:hover, :nth-child() |
mavjud elementni holat/o'rin bo'yicha |
| Psevdo-element | :: (ikki) |
::before, ::first-letter |
element qismi yoki yangi mazmun |
9.8 Murakkab selektorlarni zanjirlash¶
Haqiqiy loyihalarda selektorlarni birlashtirib ishlatasan. Birlashtirishning ikki turi bor: biriktirish (bo'shliqsiz) va kombinator (bo'shliq yoki belgi bilan).
Bo'shliqsiz biriktirish β "VA" mantiqi¶
Selektorlarni bo'shliqsiz yozsang, ularning hammasi bir elementga tegishi shart:
p.muhim { ... } /* p VA klassi muhim */
input[type="text"]:focus { ... } /* input VA type=text VA fokusda */
button.asosiy:hover { ... } /* button VA klassi asosiy VA hover */
li.faol:first-child { ... } /* li VA faol VA birinchi farzand */
p.muhim β bu <p class="muhim"> ni tanlaydi, lekin <div class="muhim"> ni emas (u p emas).
β οΈ Bo'shliq bor-yo'qligi MA'NONI butunlay o'zgartiradi:
- p.muhim (bo'shliqsiz) = "muhim klassli p".
- p .muhim (bo'shliq bilan) = "p ichidagi muhim klassli element". Bu butunlay boshqa narsa!
Bu farqni tushunish β boshlovchilarning eng katta sakrashlaridan biri.
Kombinator bilan birlashtirish¶
nav ul li a { ... } /* nav>ul>li ichidagi a */
.menyu > li:hover { ... } /* .menyu bevosita farzandi li, hover holatda */
form input:not(:disabled){ ... } /* form ichidagi, o'chirilmagan input */
.karta:hover .tugma { ... } /* karta hover bo'lganda ICHIDAGI tugma */
Oxirgisi juda kuchli usul: .karta:hover .tugma β kartaga sichqoncha kelganda uning ichidagi tugma ko'rinishini o'zgartiradi. Hover bir elementda, ta'sir esa boshqasida.
9.9 Selektorni o'qish strategiyasi: o'ngdan chapga¶
Endi expert sirini ochamiz. Brauzer selektorni o'ngdan chapga o'qiydi β sen yozgan tartibda emas, teskari.
nav ul li a.faol selektorini olaylik. Sen uni chapdan o'ngga "nav, ichida ul, ichida li, ichida faol a" deb o'qiysan. Brauzer esa teskari ishlaydi:
- Eng o'ngdagi qismdan boshlaydi β
a.faol. Bu "kalit selektor" (key selector). Brauzer avval sahifadagi barcha.faolklassli<a>ni topadi. - Keyin har biri uchun chapga qarab tekshiradi: "ota-onasi
limi? Uning ota-onasiulmi? Uningnikinavmi?" - Agar zanjir uzilsa β o'sha element rad etiladi.
Nega bu seni qiziqtirishi kerak? Ikki sabab:
1) O'qish va tuzatish (debugging) oson bo'ladi. Murakkab selektorni ko'rganda, avval eng o'ngdagi qismga qara β asosan shu element stillanadi, qolgani esa shartlar. div.sidebar ul.menu li a β "bu a ga tegadi, qolgan hammasi β a qayerda turishi kerakligining sharti".
2) Unumdorlik (performance). Kalit selektor qanchalik aniq bo'lsa, brauzer shuncha kam elementni tekshiradi. * + * kabi keng kalit yomon; .faol kabi aniq kalit yaxshi. Kichik saytlarda farqi sezilmaydi, ammo katta sahifalarda muhim.
π‘ Amaliy maslahat: selektorni iloji boricha qisqa va aniq tut. body div.wrapper main section.content article p o'rniga ko'pincha .content p yoki shunchaki bitta klass yetarli. Uzun zanjir nafaqat sekin, balki mo'rt β HTML tuzilishi biroz o'zgarsa, darhol buziladi.
9.10 Tez-tez uchraydigan xatolar va maslahatlar¶
π Bobni yakunlashdan oldin, eng ko'p uchraydigan tuzoqlarni bir joyga to'playmiz:
- β οΈ Bo'shliqni unutish/qo'shib yuborish.
.a.b(ikkala klass bir elementda) va.a .b(b, a ichida) β butunlay boshqa. Bu eng ko'p uchraydigan xato. - β οΈ Vergulni tushirib qoldirish.
h1 h2(h1 ichidagi h2) vah1, h2(ikkalasi). Vergulsiz qoida "ishlamaydi" deb ko'rinadi. - β οΈ
:first-childva:first-of-typeni aralashtirish. Aralash bolalar orasida ko'pincha-of-typekerak. - β οΈ
contentni unutish.::before/::aftercontentsiz umuman ko'rinmaydi. - β οΈ Id'ga stil berish. Ishlaydi, lekin spesifiklik baland bo'lib, keyin uni qayta yozish azobga aylanadi. Stil uchun klass ishlat.
- π‘
:focusni o'chirmagin. Klaviatura foydalanuvchilari uchun zarur. Standartoutlinexunuk ko'rinsa, uni o'chirma β chiroyliroq qilib qayta chiz. - π‘ Selektorni qisqa tut. Uzun zanjir sekin va mo'rt. Ko'p hollarda bitta yaxshi nomlangan klass yetarli.
- π‘ Atribut qiymatlarini tirnoqqa ol.
[type="text"]β har doim xavfsiz odat.
Mashqlar¶
Quyidagi mashqlarni daftarda yoki brauzerda sinab ko'r. Har biri bobning bir bo'limini mustahkamlaydi. Avval o'zing yozib ko'r, keyin yechimni och.
1-mashq. Quyidagi HTML uchun: barcha <p> matnini kulrang qil, lekin class="muhim" bo'lganlarini qora va qalin qil.
Yechim
p.muhim β bo'shliqsiz, ya'ni "p VA muhim klassli". .muhim qoidasi p dan keyin kelgani uchun (va aniqroq bo'lgani uchun) g'olib chiqadi.
2-mashq. Bir <ul> ichidagi <li> larni "zebra" qilib bo'yang: toq qatorlar oq, juft qatorlar och-kulrang (#f1f5f9).
Yechim
even (yoki 2n) β 2, 4, 6-qatorlarni tanlaydi. Toq qatorlarga tegmaganimiz uchun ular standart (oq) fonda qoladi.
3-mashq. Faqat https:// bilan boshlanadigan havolalardan keyin " β" belgisini chiqaring.
Yechim
[href^="https://"] β qiymati https:// bilan boshlanadigan href. ::after + content β havoladan keyin belgi qo'shadi.
4-mashq. Tugmalar qatorida har bir tugmaga o'ngdan 8px bo'shliq bering, lekin oxirgi tugmaga bermang (oxirida ortiqcha bo'shliq qolmasin).
Yechim
:not(:last-child) β oxirgisidan boshqa barcha tugma. Shu bilan oxirgisida margin qolmaydi. (Zamonaviy yechim β ota-onaga gap berish, lekin :not() mashqi sifatida bu ajoyib.)
5-mashq. Quyidagi tuzilmada faqat .menyu ning bevosita farzandi bo'lgan <li> larga qalin shrift bering; ichki ostmenyu <li> lariga tegmang.
<ul class="menyu">
<li>Bosh sahifa</li>
<li>Mahsulotlar
<ul>
<li>Telefonlar</li>
<li>Noutbuklar</li>
</ul>
</li>
</ul>
Yechim
> bevosita farzandni tanlaydi. Ichki <ul> dagi <li> lar .menyu ning bevosita farzandi emas (ular ichki ul ning farzandi), shuning uchun tegilmaydi. Agar bo'shliq (.menyu li) ishlatilsa, ularga ham qalin shrift tushardi.
6-mashq. Barcha matnli input maydonlariga fokus tushganda ko'k chegara bering, lekin o'chirilgan (disabled) maydonlarga tegmang.
Yechim
Uchta shart zanjirlangan: input[type="text"] (matn maydoni) VA :focus (fokusda) VA :not(:disabled) (o'chirilmagan). Eslatma: :disabled element odatda fokus ham ololmaydi, shuning uchun :not(:disabled) ko'pincha ortiqcha β lekin niyatni aniq ko'rsatgani uchun foydali mashq.
7-mashq (qiyinroq). Maqola ichidagi birinchi paragrafning birinchi harfini katta "drop cap" qilib bering (3em, ko'k, chapga oqsin). Faqat birinchi paragrafga ta'sir qilsin.
<article>
<h2>Sarlavha</h2>
<p>Birinchi paragraf shu yerdan boshlanadi...</p>
<p>Ikkinchi paragraf.</p>
</article>
Yechim
article p:first-of-type::first-letter {
font-size: 3em;
float: left;
color: #2563eb;
margin-right: 4px;
}
p:first-of-type β <article> ichidagi p'lar orasidan birinchisi (bu yerda :first-child ishlamasdi, chunki birinchi farzand <h2>). ::first-letter β uning birinchi harfi. Ikki tushuncha bir zanjirda.
8-mashq (debugging). Quyidagi CSS mo'ljallangandek ishlamayapti. Maqsad: .karta ichidagi .sarlavha klassli elementni ko'k qilish. Xatoni top va tuzat.
Yechim
Xato β bo'shliqning yo'qligi. .karta.sarlavha (bo'shliqsiz) = "ham karta, ham sarlavha klassiga ega BITTA element". Bizga esa ".karta ICHIDAGI .sarlavha" kerak edi:
Yagona bo'shliq butun ma'noni o'zgartiradi β bu bobning eng muhim saboqlaridan biri.
β¬ οΈ Oldingi: 08 β CSS asoslari Β· π README Β· Keyingi: 10 β Cascade, specificity va inheritance β‘οΈ