Mundarija (42)
- Bu darsda
- 1. Nega bu kerak?
- 2. Birinchi, oxirgi va yagona
- 2.1 :first-child va :last-child
- 2.2 Tuzoq: "otaning birinchi bolasi", "birinchi article" emas
- 2.3 :only-child — yagona bola
- 3. :nth-child() va An+B formulasi
- 3.1 Aniq raqam
- 3.2 Formula: An+B
- 3.3 Jasur akaning uchinchi istagi
- 3.4 Oraliq: ikki shart birga
- 3.5 Yozish qoidalari
- 4. Oxirdan sanash va teg bo'yicha sanash
- 4.1 :nth-last-child() — oxiridan
- 4.2 :nth-of-type() oilasi
- 4.3 Tuzoq: -of-type class'ni bilmaydi
- 5. of S: faqat keraklilarini sanash
- 5.1 "Ikkinchi achchiq taom"
- 5.2 Brauzerlarda
- 6. :empty va :root
- 6.1 :empty — butunlay bo'sh element
- 6.2 :root — hujjatning ildizi
- 7. Miqdor so'rovi: nechta element bor?
- 7.1 Muammo
- 7.2 "5 ta va undan ko'p"
- 7.3 "Aynan 3 ta" va "bitta"
- 8. Zebra jadvallar — qisqacha
- 9. Ko'p uchraydigan xatolar
- 9.1 :first-child ni "shu tegning birinchisi" deb o'qish
- 9.2 -of-type class'ni sanaydi deb o'ylash
- 9.3 Pseudo-klassni otaga yozish
- 9.4 0 dan sanash
- 9.5 Formulada bo'sh joy
- 9.6 "Bo'sh ko'rinadi, lekin :empty emas"
- 10. Mashqlar
- 1-mashq (oson): Qaysi qatorlar?
- 2-mashq (o'rta): Kun taomlari
- 3-mashq (qiyin): Achchiq kartalar va stajyor
- 4-mashq: Portfolio qadami — o'rin bo'yicha bezash
- 11. Real ishda
- Xulosa
- Manbalar
CSS nth-child: tuzilma pseudo-klasslari va An+B formulasi
Qisqacha: Tuzilma pseudo-klasslari elementni ota ichidagi o'rni bo'yicha tanlaydi:
li:first-child— birinchi,li:last-child— oxirgi. Formula:nth-child(An+B)istalgan qolipni beradi:2n+1(yokiodd) — toq o'rindagilar,3n— har uchinchisi,-n+3— birinchi uchtasi.:nth-childhamma qo'shnilarni sanaydi,:nth-of-type— faqat shu tegdagilarni,:nth-child(2 of .achchiq)esa faqat selektorga mos kelganlarini. Sanash 1 dan boshlanadi.
Bu darsda
- Birinchi, oxirgi va yagona elementni class qo'shmasdan tanlaysiz.
- An+B formulasini hisoblab, istalgan qolipni yozasiz: toq, juft, har uchinchi, birinchi N ta, oraliq.
:nth-childva:nth-of-typefarqini tushuntirasiz vaof Sbilan sanashni bilasiz.:emptyva:rootnima ekanini bilasiz.- Elementlar soniga qarab bezaydigan "miqdor so'rovi"ni yozasiz.
Oldin bilishingiz kerak: Holat pseudo-klasslari, Asosiy selektorlar va kombinatorlar, Ro'yxatlar.
1. Nega bu kerak?
Jasur aka menyu haqida uchta istak aytdi:
- "Ro'yxatdagi birinchi taom — kun taomi. U qalin bo'lsin."
- "Taomlar orasida chiziq bo'lsin, lekin oxirgisining tagida kerak emas."
- "Har uchinchi qator och fonda bo'lsin — ko'z adashmasin."
Har li ga class qo'yib chiqsa bo'ladi: birinchi, oxirgi, uchinchi. Lekin ertaga Rustam aka menyuga yangi taom qo'shadi — va hamma class'larni qaytadan ko'chirish kerak bo'ladi. Aslida bu yerda elementning nomi emas, o'rni muhim.
Maktabdagi jismoniy tarbiya darsini eslang. O'qituvchi "Birinchi-ikkinchiga sanang!" deydi. Keyin "Ikkinchilar — bir qadam oldinga!" O'qituvchi bolalarning ismini bilishi shart emas. Kimning qayerda turgani yetarli. CSS ham shunday sanay oladi. Buning uchun tuzilma pseudo-klasslari (tree-structural pseudo-classes) bor.
2. Birinchi, oxirgi va yagona
2.1 :first-child va :last-child
:first-child— otasining birinchi bolasi.:last-child— otasining oxirgi bolasi.
Jasur akaning dastlabki ikki istagi:
<style>
li {
border-bottom: 1px solid #5b6660;
padding: 4px 0;
}
li:first-child {
font-weight: bold;
color: #2f6b3a;
}
li:last-child {
border-bottom: 0;
}
</style>
<ul>
<li>Osh — 35 000 so'm (kun taomi)</li>
<li>Lag'mon — 28 000 so'm</li>
<li>Manti — 30 000 so'm</li>
<li>Ko'k choy — 5 000 so'm</li>
</ul>Nimaga qarang: osh qalin va yashil — u birinchi. Chiziqlar taomlar orasida bor, ko'k choyning tagida esa yo'q: border-bottom: 0 oxirgi qatordagi chiziqni olib tashladi. Endi yangi taomni ro'yxat oxiriga qo'shsangiz, chiziq o'zi joyini topadi.
Asosiy selektorlar darsida xuddi shu natijani boshqa yo'l bilan olgan edik: li + li — oldida li bor har bir qator. Ikkala yo'l ham to'g'ri. Qaysi biri o'qishga tushunarliroq bo'lsa, o'shani tanlang.
2.2 Tuzoq: "otaning birinchi bolasi", "birinchi article" emas
«Bahor» menyusining bo'limi: avval sarlavha, keyin kartalar.
<section>
<h2>Issiq taomlar</h2>
<article class="taom-karta">...</article>
<article class="taom-karta">...</article>
</section>article:first-child birinchi kartani tanlaydimi? Yo'q. Chrome'da tekshirdik — hech narsa topilmadi. Selektorni o'ngdan chapga o'qing: "article, va u otasining birinchi bolasi". section ning birinchi bolasi — h2, article emas. Ikki shart birga bajarilmadi.
Bu eng ko'p uchraydigan tushunmovchilik. :first-child "shu tegdagilarning birinchisi" degani emas. Bunday tanlov uchun :first-of-type bor — uni pastroqda, "teg bo'yicha sanash" bo'limida ko'ramiz.
2.3 :only-child — yagona bola
:only-child — otasida boshqa bola yo'q element. Bu :first-child:last-child bilan bir xil: ham birinchi, ham oxirgi.
Bir narsaga e'tibor bering: faqat elementlar sanaladi, oddiy matn emas. Chrome'da tekshirdik: <p>Narxi <b>35 000</b> so'm</p> dagi b — :only-child. Uning atrofidagi matn bola hisoblanmaydi.
Tekshirib ko'ring:
<ul><li>Osh</li></ul>— bitta qatorli ro'yxat. Buliga nechta pseudo-klass mos keladi::first-child,:last-child,:only-child?
Javob
Uchalasi ham. Yagona bola bir vaqtda birinchi ham, oxirgi ham. Shuning uchun birinchi misoldagi ro'yxatda bitta taom qolsa, u qalin bo'lardi va tagida chiziq ham bo'lmasdi. Bu to'g'ri: yagona qatorning tagida ajratuvchi chiziq kerak emas.
3. :nth-child() va An+B formulasi
3.1 Aniq raqam
li:nth-child(3) — otasining uchinchi bolasi bo'lgan li. Sanash 1 dan boshlanadi: birinchi bola — 1, ikkinchisi — 2. Keyinroq JavaScript'da massiv elementlari 0 dan sanalishini ko'rasiz (Massiv) — CSS'da esa odamlar sanaganidek.
3.2 Formula: An+B
Qavs ichiga raqam emas, formula ham yozish mumkin: An+B. Bu yerda:
n— sanoq: brauzer uning o'rniga ketma-ket 0, 1, 2, 3... qo'yadi;A— qadam: har nechtadan biri;B— qayerdan boshlash.
Brauzer har n uchun natijani hisoblaydi. 1 va undan katta natijalar — tanlangan elementlarning raqamlari. 0 va manfiy natijalar tashlab yuboriladi.
3n+1 ni birga hisoblaymiz:
- n = 0 → 3·0 + 1 = 1
- n = 1 → 3·1 + 1 = 4
- n = 2 → 3·2 + 1 = 7
- n = 3 → 3·3 + 1 = 10
Demak, li:nth-child(3n+1) — 1-, 4-, 7-, 10-qatorlar. Birinchidan boshlab, har uchinchisi.
| Formula | Hisob (n = 0, 1, 2, 3...) | Tanlanadi |
|---|---|---|
2n |
0, 2, 4, 6... | juftlar: 2, 4, 6... |
2n+1 |
1, 3, 5, 7... | toqlar: 1, 3, 5... |
3n |
0, 3, 6, 9... | har uchinchisi: 3, 6, 9... |
n+8 |
8, 9, 10... | 8-dan boshlab hammasi |
-n+3 |
3, 2, 1, 0, -1... | birinchi uchtasi: 1, 2, 3 |
-2n+5 |
5, 3, 1, -1... | 1, 3, 5 |
Hamma qatorni o'nta li li ro'yxatda Chrome'da tekshirdik — natijalar jadval bilan bir xil chiqdi.
Ikki formula shunchalik ko'p ishlatiladiki, ularning so'z bilan yozilgan nomi bor: odd ("toq") = 2n+1, even ("juft") = 2n.
3.3 Jasur akaning uchinchi istagi
<style>
li:nth-child(3n) {
background-color: #fffaf0;
font-weight: bold;
}
</style>
<ol>
<li>Osh</li>
<li>Lag'mon</li>
<li>Manti</li>
<li>Sho'rva</li>
<li>Somsa</li>
<li>Qozon kabob</li>
<li>Norin</li>
<li>Chuchvara</li>
<li>Ko'k choy</li>
</ol>Nimaga qarang: 3-, 6- va 9-qatorlar qaymoq fonli va qalin. "Tahrirlab ko'rish" tugmasini bosing va 3n o'rniga odd, -n+3, n+7 yozib ko'ring — har safar boshqa qatorlar yonadi.
3.4 Oraliq: ikki shart birga
"3-dan 6-gacha" kabi oraliq uchun ikki pseudo-klassni yopishtiramiz:
li:nth-child(n+3):nth-child(-n+6) {
font-weight: bold;
}Birinchi shart — "3-dan boshlab", ikkinchisi — "6-gacha". Element ikkalasiga mos bo'lishi kerak, xuddi .taom-karta.mashhur dagi ikki class kabi. Chrome'da tekshirdik: 3, 4, 5 va 6-qatorlar tanlandi.
3.5 Yozish qoidalari
+va-atrofida bo'sh joy mumkin:2n + 1ishlaydi.2vanorasida esa bo'sh joy bo'lmaydi:2 n+1— noto'g'ri selektor, brauzer butun qoidani tashlaydi. Chrome'da tekshirdik.:nth-child(0)hech narsani tanlamaydi — 0-o'rin yo'q.:nth-child(n)— hammasi: n = 0 da 0, keyin 1, 2, 3...- Formulani har doim
nqatnashgan qism birinchi bo'ladigan qilib yozing:2n+1,1+2nemas.
Tekshirib ko'ring: 12 qatorli ro'yxatda
li:nth-child(4n)nechta qatorni tanlaydi?
Javob
Uchta: 4, 8 va 12-qatorlar. Hisob: n = 1 → 4, n = 2 → 8, n = 3 → 12, n = 4 → 16 — bunday qator yo'q. n = 0 dagi 0 esa tashlab yuboriladi.
4. Oxirdan sanash va teg bo'yicha sanash
4.1 :nth-last-child() — oxiridan
:nth-last-child() xuddi :nth-child() kabi, faqat sanashni oxiridan boshlaydi. li:nth-last-child(1) — oxirgi qator, ya'ni :last-child. li:nth-last-child(-n+2) — oxirgi ikkitasi. Chrome'da o'nta qatorda tekshirdik: 9 va 10-qatorlar tanlandi.
Bu "oxirgi ikkita yangilik" yoki "ro'yxat oxiridagi eslatmalar" uchun qulay. Ro'yxat uzunligi o'zgarsa ham, qoida baribir oxirgi ikkitasini topadi.
4.2 :nth-of-type() oilasi
:nth-child otaning hamma bolalarini sanaydi: sarlavhani ham, paragrafni ham, kartani ham. Ba'zan esa faqat bir turdagi teglarni sanash kerak. Buning uchun -of-type oilasi bor:
-child |
-of-type |
Farqi |
|---|---|---|
:first-child |
:first-of-type |
shu tegdagilarning birinchisi |
:last-child |
:last-of-type |
shu tegdagilarning oxirgisi |
:only-child |
:only-of-type |
shu tegdan yagona |
:nth-child() |
:nth-of-type() |
faqat shu tegdagilar sanaladi |
:nth-last-child() |
:nth-last-of-type() |
oxiridan, faqat shu teg |
Farqni «Bahor» menyusining bo'limida ko'ramiz:
<style>
article {
border: 1px solid #5b6660;
padding: 0 12px;
margin: 4px 0;
}
article:nth-child(2) {
background-color: #fffaf0;
}
article:nth-of-type(2) {
border: 3px solid #b4461a;
}
</style>
<section>
<h2>Issiq taomlar</h2>
<article class="taom-karta"><p>Osh</p></article>
<article class="taom-karta"><p>Lag'mon</p></article>
<article class="taom-karta"><p>Manti</p></article>
</section>Nimaga qarang: qaymoq fon osh kartasida — u section ning ikkinchi bolasi (birinchisi — h2). Qalin qizg'ish ramka esa lag'mon kartasida — u ikkinchi article. Bitta "2" raqami ikki xil elementni topdi.
margin — elementning tashqi bo'sh joyi, kartalar bir-biriga yopishmasin deb qo'ydik (Box model darsida to'liq).
4.3 Tuzoq: -of-type class'ni bilmaydi
"Type" — bu teg. :nth-of-type class'ga umuman qaramaydi. Ko'p dasturchi .achchiq:nth-of-type(2) ni "ikkinchi achchiq taom" deb o'ylaydi. Aslida u "ikkinchi article, agar u achchiq bo'lsa" degani.
Chrome'da tekshirdik: beshta kartadan 2, 3 va 5-si achchiq bo'lganda .achchiq:nth-of-type(2) ikkinchi kartani topdi — u tasodifan achchiq edi. Achchiq kartalar orasida sanash uchun boshqa vosita kerak.
Tekshirib ko'ring:
sectionichidah2,p,article,articleturibdi.article:first-of-typevaarticle:first-childnimani tanlaydi?
Javob
article:first-of-type — birinchi article: u article lar orasida birinchi. article:first-child — hech narsa: section ning birinchi bolasi h2. Bo'limning birinchi kartasini bezash uchun :first-of-type to'g'ri tanlov.
5. of S: faqat keraklilarini sanash
5.1 "Ikkinchi achchiq taom"
:nth-child() qavsi ichiga formuladan keyin of so'zi va selektor yozish mumkin. Shunda brauzer faqat shu selektorga mos qo'shnilarni sanaydi. "S" — selektor so'zining bosh harfi:
<style>
article {
border: 1px solid #5b6660;
padding: 0 12px;
margin: 4px 0;
}
:nth-child(1 of .achchiq) {
border: 3px solid #b4461a;
}
</style>
<section>
<h2>Menyu</h2>
<article class="taom-karta"><p>Osh</p></article>
<article class="taom-karta achchiq"><p>Lag'mon</p></article>
<p>Achchiq taomlar qalampir bilan tayyorlanadi.</p>
<article class="taom-karta achchiq"><p>Chuchvara</p></article>
<article class="taom-karta"><p>Manti</p></article>
</section>Nimaga qarang: qalin qizg'ish ramka lag'monda — u achchiq kartalarning birinchisi. Oshni, sarlavhani va paragrafni brauzer sanamadi, chunki ularda achchiq class'i yo'q. 1 ni 2 ga almashtirib ko'ring — ramka chuchvaraga ko'chadi.
Chrome'da boshqa variantlarni ham tekshirdik: :nth-last-child(1 of .achchiq) — oxirgi achchiq taom, :nth-child(odd of .taom-karta) — kartalar orasida toqlari. Oradagi paragraf va sarlavha sanoqni buzmaydi.
5.2 Brauzerlarda
of S sintaksisi 2023-yil mayidan hamma asosiy brauzerlarda ishlaydi, 2025-yil noyabridan esa Baseline "widely available" (Veb standartlari). Bemalol ishlatsa bo'ladi. Faqat bitta tafsilot: of faqat :nth-child va :nth-last-child da bor. :nth-of-type da yo'q — u baribir teg bo'yicha sanaydi.
6. :empty va :root
6.1 :empty — butunlay bo'sh element
:empty — ichida hech narsa yo'q element: na teg, na matn. «Bahor»ning porsiyalar jadvalida ma'lumot kelmagan katakni ajratamiz:
<style>
td:empty {
border: 2px dashed #b4461a;
}
td, th {
padding: 4px 12px;
}
</style>
<table>
<caption>Bugungi porsiyalar</caption>
<tbody>
<tr><th scope="row">Osh</th><td>12</td></tr>
<tr><th scope="row">Lag'mon</th><td></td></tr>
<tr><th scope="row">Manti</th><td>0</td></tr>
</tbody>
</table>Nimaga qarang: faqat lag'mon katagi qizg'ish punktir ramkada — u butunlay bo'sh. Mantidagi 0 — bu ham matn, shuning uchun katak bo'sh emas.
Tuzoq — bo'sh joy. Chrome'da tekshirdik: <td> </td> (ichida bitta probel) yoki ichida yangi qator qolgan element :empty hisoblanmaydi. Faqat HTML izohi (<!-- -->) turgan element esa :empty hisoblanadi. Shuning uchun bo'sh katakni yopishtirib yozing: <td></td>.
6.2 :root — hujjatning ildizi
:root — hujjatning eng tepadagi elementi. HTML sahifada bu doim html. Nega html deb yozmaymiz? Ikkalasi ham ishlaydi. Lekin :root pseudo-klass bo'lgani uchun og'irroq (Specificity), va u butun kursda bitta maqsadda ishlatiladi: butun saytga umumiy qiymatlarni — ranglar, o'lchamlar — e'lon qilish. Buni CSS o'zgaruvchilari darsida ko'rasiz. Hozircha shuni bilish yetadi: :root { ... } — "butun sahifa uchun".
7. Miqdor so'rovi: nechta element bor?
7.1 Muammo
«Bahor»ning "Ichimliklar" bo'limida ba'zan 3 ta, ba'zan 8 ta ichimlik bo'ladi. Uch qatorli ro'yxat katta harflarda chiroyli. Sakkiz qatorlisi esa ekranga sig'maydi — uni ixchamroq qilish kerak. CSS "bu ro'yxatda nechta element bor?" deb so'ray oladimi?
To'g'ridan-to'g'ri — yo'q. Lekin tuzilma pseudo-klasslarini birlashtirib, shunday savolni yozish mumkin. Bu usul miqdor so'rovi (quantity query) deb ataladi.
7.2 "5 ta va undan ko'p"
<style>
li:nth-last-child(n+5),
li:nth-last-child(n+5) ~ li {
font-size: 14px;
color: #5b6660;
}
</style>
<ul>
<li>Ko'k choy</li>
<li>Qora choy</li>
<li>Ayron</li>
</ul>
<ul>
<li>Ko'k choy</li>
<li>Qora choy</li>
<li>Ayron</li>
<li>Kompot</li>
<li>Limonli choy</li>
<li>Mineral suv</li>
</ul>Nimaga qarang: birinchi ro'yxat (3 ta) o'zgarmadi. Ikkinchisining (6 ta) hamma qatori kichik va kulrang.
Qoidani bo'lib o'qiymiz:
li:nth-last-child(n+5)— oxiridan sanaganda 5-o'rinda yoki undan uzoqroqda turganli. Bunday qator faqat ro'yxatda kamida 5 ta element bo'lsa mavjud. Olti qatorli ro'yxatda bu — 1 va 2-qatorlar.li:nth-last-child(n+5) ~ li— ulardan keyingi hammali(Asosiy selektorlar darsidagi~).
Olti qatorli ro'yxatda sanab ko'ramiz:
| Qator | Oxiridan o'rni | Qaysi qism tanladi |
|---|---|---|
| 1 (Ko'k choy) | 6 | nth-last-child(n+5) |
| 2 (Qora choy) | 5 | nth-last-child(n+5) |
| 3–6 | 4, 3, 2, 1 | ~ li — 1- va 2-qatordan keyingilar |
Ikkalasi vergul bilan birlashib, ro'yxatning hamma qatorini qamraydi. Uch qatorli ro'yxatda esa birinchi shartga mos qator yo'q — demak, ikkinchisiga ham yo'q. Chrome'da tekshirdik: beshdan kam ro'yxatlarga qoida tushmadi.
7.3 "Aynan 3 ta" va "bitta"
- Aynan 3 ta:
li:first-child:nth-last-child(3)— ham birinchi, ham oxiridan uchinchi. Bu faqat 3 qatorli ro'yxatda bo'ladi. Qolgan qatorlarni~ libilan qo'shasiz. Chrome'da tekshirdik. - Bitta:
li:only-child.
Bu usul 2010-yillardan beri bor va hamma brauzerda ishlaydi. Keyingi darsda xuddi shu savolni ancha qisqa yozadigan :has() bilan tanishasiz (Mantiqiy pseudo-klasslar).
8. Zebra jadvallar — qisqacha
Tuzilma pseudo-klasslarining eng mashhur ishi — "zebra": jadval qatorlarini navbat bilan bo'yash. Qoidasi bitta qator: tbody tr:nth-child(even). Ko'z uzun qatorda adashmaydi. Lekin chiroyli jadval uchun ramkalar, kataklar orasidagi masofa va sarlavha ham kerak — bularning hammasini Jadvallar stili darsida birga quramiz.
Bir narsani hozir eslab qoling: tr lar tbody ichida sanaladi. thead dagi sarlavha qatori boshqa otaning bolasi — u sanoqqa qo'shilmaydi (Asosiy selektorlar darsidagi tbody tuzog'ini eslang).
9. Ko'p uchraydigan xatolar
9.1 :first-child ni "shu tegning birinchisi" deb o'qish
article:first-child — oldida h2 tursa, hech narsa topmaydi. Tuzatish: article:first-of-type.
9.2 -of-type class'ni sanaydi deb o'ylash
.achchiq:nth-of-type(2) — "ikkinchi article, agar u achchiq bo'lsa". Tuzatish: :nth-child(2 of .achchiq).
9.3 Pseudo-klassni otaga yozish
ul:nth-child(odd) — ro'yxat qatorlarini emas, ul ning o'zini tanlaydi: u otasining toq bolasimi? Tuzatish: pseudo-klass sanaladigan elementga yoziladi — li:nth-child(odd).
9.4 0 dan sanash
li:nth-child(0) — hech narsa, li:nth-child(1) — birinchi. Tuzatish: CSS'da sanash 1 dan boshlanadi.
9.5 Formulada bo'sh joy
:nth-child(2 n+1) — butun qoida tashlanadi. Tuzatish: 2n+1 — son va n yopishib tursin.
9.6 "Bo'sh ko'rinadi, lekin :empty emas"
<td> </td> — ichida probel bor. Tuzatish: bo'sh elementni <td></td> shaklida yozing.
10. Mashqlar
1-mashq (oson): Qaysi qatorlar?
O'nta qatorli ro'yxat berilgan. Har selektor nechta qatorni tanlaydi? Qaysilarini — yechimda tekshiring.
li:nth-child(4n)—li:nth-child(3n+2)—li:nth-child(-n+4)—li:nth-child(n+7)—li:nth-last-child(2)—
Yechim
4n— n = 1, 2 → 4, 8. n = 3 da 12 — bunday qator yo'q.3n+2— n = 0, 1, 2 → 2, 5, 8. n = 3 da 11 — yo'q.-n+4— n = 0, 1, 2, 3 → 4, 3, 2, 1. Birinchi to'rttasi.n+7— 7, 8, 9, 10. Yettinchidan boshlab hammasi.nth-last-child(2)— oxiridan ikkinchi: o'nta qatorda bu 9-qator.
Ishonch hosil qilish uchun "Jasur akaning uchinchi istagi" natijasini tahrirlab, har formulani sinab ko'ring.
2-mashq (o'rta): Kun taomlari
«Bahor» menyusida to'qqizta taom bor (3n misolidagi ro'yxat). CSS yozing:
- Birinchi uchta taom — qalin: ular eng ko'p sotiladi.
- Juft qatorlar —
#fffaf0fonda. - Oxirgi qator — kulrang (
#5b6660): u ichimlik.
Ishora: 1-band — -n+3, 2-band — so'z bilan yoziladigan formula, 3-band — "oxirgi bola" pseudo-klassi.
Yechim
<style>
li:nth-child(-n+3) {
font-weight: bold;
}
li:nth-child(even) {
background-color: #fffaf0;
}
li:last-child {
color: #5b6660;
}
</style>
<ol>
<li>Osh</li>
<li>Lag'mon</li>
<li>Manti</li>
<li>Sho'rva</li>
<li>Somsa</li>
<li>Qozon kabob</li>
<li>Norin</li>
<li>Chuchvara</li>
<li>Ko'k choy</li>
</ol>2-qator — lag'mon — ikki qoidaga birdan tushdi: u ham birinchi uchtalikda, ham juft. Ikkala qoida turli xususiyatlarni o'zgartiradi, shuning uchun to'qnashuv yo'q — ikkalasi ham ishlaydi. Menyuga o'ninchi taom qo'shilsa, CSS'ga tegmaysiz: "oxirgi" belgisi o'zi yangi qatorga ko'chadi.
3-mashq (qiyin): Achchiq kartalar va stajyor
Menyu bo'limida sarlavha, keyin beshta karta: osh, lag'mon (achchiq), chuchvara (achchiq), manti, jiz (achchiq). Stajyor yozdi:
article:first-child { font-weight: bold; }
.achchiq:nth-of-type(2) { border: 3px solid #b4461a; }
section:nth-child(odd) { background-color: #fffaf0; }Jasur aka xohlagani: birinchi karta qalin; ikkinchi achchiq taomning ramkasi qalin; toq kartalar qaymoq fonda.
- Har qator nimani tanlayapti va nega kutilgan natija chiqmadi?
- To'g'ri qoidalarni yozing.
- Bonus: agar bo'limda kamida 4 ta karta bo'lsa, hamma kartalar
14pxshriftga o'tsin.
Ishora: har selektorni o'ngdan chapga ovoz chiqarib o'qing. Bonus uchun miqdor so'rovidagi "5 ta va undan ko'p" qoidasini qarang — faqat li o'rniga article va "5" o'rniga "4".
Yechim
- Tahlil:
article:first-child— hech narsa: bo'limning birinchi bolasih2..achchiq:nth-of-type(2)— ikkinchiarticle(lag'mon), u tasodifan achchiq. Ikkinchi achchiq taom esa chuchvara.section:nth-child(odd)— kartalarni emas,sectionning o'zini tekshiradi: u otasining toq bolasimi.
- Tuzatilgani:
<style>
article {
border: 1px solid #5b6660;
padding: 0 12px;
margin: 4px 0;
}
article:first-of-type {
font-weight: bold;
}
:nth-child(2 of .achchiq) {
border: 3px solid #b4461a;
}
article:nth-of-type(odd) {
background-color: #fffaf0;
}
article:nth-last-of-type(n+4),
article:nth-last-of-type(n+4) ~ article {
font-size: 14px;
}
</style>
<section>
<h2>Menyu</h2>
<article class="taom-karta"><p>Osh</p></article>
<article class="taom-karta achchiq"><p>Lag'mon</p></article>
<article class="taom-karta achchiq"><p>Chuchvara</p></article>
<article class="taom-karta"><p>Manti</p></article>
<article class="taom-karta achchiq"><p>Jiz</p></article>
</section>- Toq kartalar uchun
article:nth-of-type(odd)— sarlavha sanoqqa qo'shilmaydi.:nth-child(odd of .taom-karta)ham to'g'ri. - Bonusda
-of-typeishlatdik:h2hamsectionning bolasi,:nth-last-childuni ham sanardi. Bu yerda farq qilmaydi, chunkih2boshida turibdi. Lekin kartalardan keyin paragraf qo'shilsa,-of-typebaribir to'g'ri sanaydi. - Kartalardan birini o'chirib ko'ring: to'rtta qolsa ham shrift kichik, uchta qolsa — kattalashadi.
4-mashq: Portfolio qadami — o'rin bo'yicha bezash
Portfolio HTML'iga tegmaymiz. asosiy.css ga qo'shing:
- Loyihalar sahifasi: birinchi loyiha kartasi — eng yangisi —
#e8f1ecfonda. O'tgan darslardagih1 ~ articleqoidasini eslang: loyiha sahifasidagi kattaarticlebunga tushmasin. - Men haqimda sahifasi: o'qish rejasi jadvalida oxirgi qator — hozirgi oy — qalin.
- Hamma sahifalar: footer'dagi oxirgi paragraf — mualliflik qatori —
14px.
Ishora: 1-band — h1 ~ article ga -of-type pseudo-klassini yopishtiring. 2-band — tbody tr va "oxirgi bola" pseudo-klassi. 3-band uchun bosh sahifa footer'ini qarang: unda ikkita paragraf bor, boshqa sahifalarda bitta.
Yechim
asosiy.css ning oxiriga:
/* Eng yangi loyiha — ro'yxat boshida */
h1 ~ article:first-of-type {
background-color: #e8f1ec;
}
/* O'qish rejasi: hozirgi oy */
tbody tr:last-child {
font-weight: bold;
}
/* Mualliflik qatori */
footer p:last-child {
font-size: 14px;
}"Men haqimda" sahifasining jadvali va footer'i:
<style>
body {
font-family: system-ui, sans-serif;
color: #1f2a24;
background-color: #f7faf8;
}
h2 { color: #1f6f4a; }
tbody tr:last-child { font-weight: bold; }
footer { color: #5b6660; }
footer p:last-child { font-size: 14px; }
</style>
<section>
<h2>O'qish rejam</h2>
<table>
<caption>2026-yilgi o'qish rejasi</caption>
<thead>
<tr>
<th scope="col">Oy</th>
<th scope="col">Mavzu</th>
<th scope="col">Holat</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Sentabr</th><td>HTML</td><td>Tugadi</td>
</tr>
<tr>
<th scope="row">Oktabr</th><td>CSS</td><td>Boshlandi</td>
</tr>
</tbody>
</table>
</section>
<footer>
<p><small>© 2026 Aziz Karimov.</small></p>
</footer>Nozik joylar:
h1 ~ article:first-of-type— ikki shart: "h1dan keyingi qo'shni" va "articlelar orasida birinchi". Loyiha sahifasidah1articlening ichida — birinchi shart bajarilmaydi.tbody tr:last-child—theaddagi sarlavha qatori boshqa otada, u "oxirgi" bo'lolmaydi. Oyiga bir qator qo'shsangiz, qalinlik o'zi yangi oyga ko'chadi.- Footer'da bitta paragraf bo'lsa, u ham oxirgi — qoida hamma sahifada ishlaydi. Bosh sahifada esa faqat ikkinchi paragraf kichrayadi, email va Telegram havolalari o'z o'lchamida qoladi.
11. Real ishda
- Jadvallar va ro'yxatlar — zebra qatorlar, oxirgi qatordagi chiziqni olib tashlash, birinchi elementni ajratish. Bu har bir admin panelda bor.
- Kontentni o'zingiz yozmaganda — masalan, blog platformasi yoki CMS (sayt matnini boshqarish tizimi, WordPress kabi) HTML'ni o'zi yaratadi va class qo'shib bo'lmaydi. Tuzilma pseudo-klasslari shunday joyda yagona yo'l bo'ladi.
- Tailwind (kursda alohida o'rganamiz)
first:,last:,odd:,even:yozuvlariga ega — ularning ortida shu darsdagi pseudo-klasslar turadi. - JavaScript ham xuddi shu selektorlar bilan qidiradi:
document.querySelector("li:last-child")(Elementlarni tanlash). - Intervyuda so'raladi: "
:nth-childva:nth-of-typefarqi nima?", "Birinchi uchta elementni qanday tanlaysiz?", "2n+1vaoddfarqi bormi?" (farqi yo'q).
Xulosa
- Tuzilma pseudo-klasslari elementni otasi ichidagi o'rni bo'yicha tanlaydi; sanash 1 dan boshlanadi.
:first-child,:last-child,:only-child— "otaning birinchi, oxirgi, yagona bolasi", "shu tegning birinchisi" emas.An+B: n = 0, 1, 2... qo'yib hisoblanadi.odd=2n+1,even=2n,-n+3— birinchi uchtasi,n+3— uchinchidan boshlab.-of-typefaqat shu tegdagilarni sanaydi va class'ga qaramaydi. Selektor bo'yicha sanash —:nth-child(2 of .achchiq).:empty— butunlay bo'sh (probel ham kontent);:root—html, butun sahifa uchun.- Miqdor so'rovi:
li:nth-last-child(n+5), li:nth-last-child(n+5) ~ li— "kamida 5 ta bo'lsa".
Keyingi dars: Mantiqiy pseudo-klasslar — :is, :where, :not va "ichida X bor" deb so'raydigan :has() bilan selektorlarni birlashtiramiz.
Manbalar
- MDN: ":nth-child()", ":nth-of-type()", ":first-child", ":only-child", ":empty", ":root" — developer.mozilla.org
- W3C: "Selectors Level 4" — tuzilma pseudo-klasslari va An+B — w3.org/TR/selectors-4
- W3C: "CSS Syntax Module Level 3" — An+B yozuvi — w3.org/TR/css-syntax-3
- web-features (Baseline ma'lumotlari): "nth-child-of" — github.com/web-platform-dx/web-features
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!