Mundarija (23)
- Bu darsda
- 1. Nega bu kerak?
- 2. Kontent modeli nima?
- 3. Asosiy turkumlar
- 3.1 "Block" va "inline" — eski atamalar
- 4. Eng muhim qoidalar
- 5. Transparent — "shaffof" kontent modeli
- 6. Qoida buzilsa nima bo'ladi
- 6.1 Brauzer DOM'ni "tuzatadi"
- 6.2 React va "hydration" xatosi
- 7. MDN'da kontent modelini o'qish
- 8. Ko'p uchraydigan xatolar
- 8.1 p ichida blok
- 8.2 Ro'yxat ichida li dan boshqa narsa
- 8.3 Interaktiv ichida interaktiv
- 8.4 Inline ichida blok
- 9. Mashqlar
- 1-mashq (oson): Mumkinmi?
- 2-mashq (o'rta): DOM'ni oldindan ayting
- 3-mashq (qiyin): Yashirin xatolarni toping
- 10. Real ishda
- Xulosa
- Manbalar
HTML kontent modeli: qaysi element ichiga nima joylashadi
Qisqacha: Har bir HTML element faqat ma'lum turdagi bolalarni qabul qiladi — bu uning kontent modeli. Masalan,
pichida faqat matn darajasidagi elementlar (phrasing content) bo'ladi,ulichida — faqatli, havola ichida esa boshqa havola yoki tugma bo'lmaydi. Qoida buzilsa, brauzer DOM'ni o'zicha "tuzatadi" — sahifa siz yozgandan boshqacha bo'lib qoladi. React kabi freymvorklarda bu jiddiy xatolarga olib keladi.
Bu darsda
- Kontent modeli va element turkumlari nima ekanini tushunasiz.
- Flow, phrasing, interactive va sectioning turkumlarini ajratasiz.
- MDN'da elementning "Permitted content" bo'limini o'qiy olasiz.
- "Transparent" kontent modelini tushunasiz.
- Noto'g'ri ichma-ichlik DOM'ni qanday o'zgartirishini va React'da nimaga olib kelishini bilasiz.
Oldin bilishingiz kerak: article, section yoki div, Tugma yoki havola.
1. Nega bu kerak?
Bu qismda bir necha marta bir xil hodisani ko'rdik:
pichigah2qo'ydik — paragraf bo'linib, bo'shppaydo bo'ldi (Sarlavhalar).aichigaaqo'ydik — ikkita alohida havola bo'lib qoldi (Tugma yoki havola).ulichigapqo'ydik — validator xato berdi (Ro'yxatlar).
Har safar alohida qoida sifatida o'rgandik. Aslida ularning hammasi bitta tizimdan kelib chiqadi — kontent modeli. Bu darsda o'sha tizimni ko'ramiz. Shundan keyin istalgan element uchun "buni bu yerga qo'ysa bo'ladimi?" degan savolga o'zingiz javob topasiz.
2. Kontent modeli nima?
Har bir HTML elementning standartdagi ta'rifida ikki narsa yozilgan:
- Turkumlari (categories) — element qaysi "oila"larga kiradi.
- Kontent modeli (content model) — uning ichiga qaysi turkumdagi elementlar qo'yilishi mumkin.
Xuddi uy qurilishidagi qoidalar kabi: xonada mebel bo'ladi, mebel ichida — idishlar. Lekin idish ichida xona bo'lmaydi. Har bir "idish"ning nima sig'dirishi aniq.
Masalan, p:
- Turkumi: flow content, palpable content.
- Kontent modeli: phrasing content — faqat matn darajasidagi narsalar.
ul:
- Turkumi: flow content.
- Kontent modeli: nol yoki bir nechta
li(va skript bilan ishlaydigan ikki xizmat elementi).
3. Asosiy turkumlar
HTML standartida bir necha turkum bor. Kundalik ishda eng keraklilari:
| Turkum | Nima | Misollar |
|---|---|---|
| Flow content | body ichida bo'la oladigan deyarli hamma narsa |
p, div, ul, h2, section, a, img |
| Phrasing content | Matn va matn ichidagi elementlar | Matn, span, strong, em, a, img, code, button |
| Heading content | Sarlavhalar | h1–h6, hgroup |
| Sectioning content | Mundarija bo'limlari | article, section, nav, aside |
| Interactive content | Foydalanuvchi bilan ishlaydiganlar | a (href bilan), button, input, select, iframe |
| Metadata content | Sahifa haqida ma'lumot | title, meta, link, style, script |
Turkumlar kesishadi. a — bir vaqtda flow, phrasing va interactive. img — flow, phrasing va embedded (joylangan).
3.1 "Block" va "inline" — eski atamalar
div va span darsida "block" va "inline" elementlarni ko'rgan edik. Bu atamalar HTML 4 dan qolgan. Bugun ular ikki xil narsani chalkashtirib yuboradi:
- Ko'rinish — element yangi qatordan boshlanadimi. Buni CSS'dagi
displaybelgilaydi va CSS bilan istalgancha o'zgaradi. - Ichma-ichlik qoidasi — element ichiga nima qo'yish mumkin. Buni kontent modeli belgilaydi va CSS unga ta'sir qilmaydi.
Taxminan: eski "inline" ≈ phrasing content, eski "block" ≈ phrasing bo'lmagan flow content. Lekin yangi atamalar aniqroq. Masalan, CSS bilan span ni block ko'rinishida qilsangiz ham, uning ichiga div qo'yib bo'lmaydi — kontent modeli o'zgarmaydi.
Tekshirib ko'ring: CSS'da
display: blockberilganspanichigadivqo'yish mumkinmi?
Javob
Yo'q. CSS faqat ko'rinishni o'zgartiradi. span ning kontent modeli — phrasing content, div esa phrasing emas. Validator xato beradi: "Element “div” not allowed as child of element “span” in this context."
4. Eng muhim qoidalar
Qo'lda tekshirish uchun eng ko'p kerak bo'ladigan qoidalar:
| Element | Ichida bo'lishi mumkin | Ichida bo'lmaydi |
|---|---|---|
p |
Faqat phrasing content | div, ul, h2, p, table, section |
h1–h6 |
Faqat phrasing content | Sarlavha, p, div |
ul, ol |
Faqat li |
p, div, matn |
span, strong, em |
Faqat phrasing content | div, p, ul |
a (href bilan) |
"Shaffof" (5-bo'lim), lekin interaktivsiz | a, button, input |
button |
Phrasing content, interaktivsiz | a, button, input, div |
Oddiy eslab qolish usuli:
- Paragraf va sarlavha — faqat matn uchun. Ularning ichida bloklar bo'lmaydi.
- Ro'yxat — faqat bandlar uchun.
- Bosiladigan ichida bosiladigan yo'q.
Bo'sh joyni to'ldiring: ul ning bevosita bolasi bo'la oladigan yagona element (skript elementlaridan tashqari) —
5. Transparent — "shaffof" kontent modeli
Ba'zi elementlarning kontent modeli — transparent ("shaffof"). Bu degani: "mening ichimga — otam qabul qiladigan narsa qo'yiladi".
Eng muhim misol — a. Havola asoslari darsida butun kartochkani havolaga o'ragan edik:
<div>
<a href="taomlar/osh.html">
<h3>Toshkent oshi</h3>
<p>35 000 so'm</p>
</a>
</div>To'g'ri: a ning otasi div — u h3 va p ni qabul qiladi, demak a ham qabul qiladi.
Endi xuddi shu havolani paragraf ichiga qo'yamiz:
<p>
<a href="taomlar/osh.html">
<h3>Toshkent oshi</h3>
</a>
</p>Xato: a ning otasi — p, u faqat phrasing content qabul qiladi. h3 esa phrasing emas. a "shaffof" — u otasining qoidasini meros qilib oladi.
Boshqa shaffof elementlar: ins, del, map, shuningdek video va audio ning zaxira kontenti.
6. Qoida buzilsa nima bo'ladi
6.1 Brauzer DOM'ni "tuzatadi"
Brauzer xato bermaydi — u sahifani HTML standartidagi aniq qoidalar bo'yicha qayta quradi. Oldingi darslardagi misollar:
| Siz yozgan | Brauzer qurgan DOM |
|---|---|
<p>Matn <h2>Sarlavha</h2></p> |
<p>Matn </p><h2>Sarlavha</h2><p></p> |
<a href="a">A <a href="b">B</a></a> |
<a href="a">A </a><a href="b">B</a> |
<p>Birinchi<p>Ikkinchi |
<p>Birinchi</p><p>Ikkinchi</p> |
Hamma brauzer aynan bir xil "tuzatadi" — bu qoidalar standartda yozilgan. Lekin natija siz rejalashtirgandan boshqacha. CSS kutilgandek ishlamaydi, bo'sh elementlar paydo bo'ladi. Bu "tuzatish" mexanizmini keyingi darsda ichidan ko'ramiz.
6.2 React va "hydration" xatosi
Zamonaviy freymvorklarda muammo yanada jiddiy. React yoki Next.js (kursda o'rganamiz) sahifani avval serverda HTML qilib yasaydi. Keyin brauzerda JavaScript o'sha HTML ustiga "jon kiritadi" — bu jarayon hydration ("sug'orish") deyiladi.
Agar HTML'da noto'g'ri ichma-ichlik bo'lsa:
- Server
aichidaabo'lgan HTML yuboradi. - Brauzer uni o'zicha "tuzatib", ikkita alohida
aqiladi. - React esa bitta ichma-ich tuzilmani kutadi. Kutgani va DOM'dagi narsa mos kelmaydi.
- Natija — konsolda hydration xatosi, sahifaning bir qismi qayta chiziladi yoki ishlamay qoladi.
Bu nazariya emas. Hatto IlmHamroh saytining o'zida ham shunday xato bo'lgan: kirish sahifasida logotip havolasi ichida yana bitta havola bor edi. Xato React'ning hydration xatosi sifatida ko'rindi. Tuzatish — bitta ortiqcha a ni olib tashlash edi.
Xulosa: kontent modeli qoidalari — "validator uchun" emas. Ular real xatolarning oldini oladi.
7. MDN'da kontent modelini o'qish
Har bir element uchun qoidani yodlash shart emas. MDN'dagi element sahifasida (masalan, <p>) pastda Technical summary jadvali bor. Unda:
- Content categories — element qaysi turkumlarga kiradi.
- Permitted content — ichida nima bo'lishi mumkin.
- Permitted parents — u nimaning ichida bo'lishi mumkin.
Hujjat o'qish darsida MDN sahifasining tuzilishi bilan tanishgansiz. Shubha tug'ilganda — shu jadvalga qarang. Yoki kodni validatordan o'tkazing: kontent modeli xatolari aynan validator eng yaxshi topadigan xatolar.
8. Ko'p uchraydigan xatolar
Hammasi uchun eng yaxshi vosita — validator va linter. Ularning haqiqiy xabarlari:
8.1 p ichida blok
Error: No “p” element in scope but a “p” end tag seen.Tarjimasi: "Ochiq p yo'q, lekin p ning yopuvchi tegi uchradi." p ichidagi blok element paragrafni erta yopdi, oxiridagi </p> esa "yetim" qoldi. Tuzatish: blokni paragrafdan chiqaring yoki gap ichida span ishlating.
8.2 Ro'yxat ichida li dan boshqa narsa
Error: Element “p” not allowed as child of element “ul” in this context.Tuzatish: li ga o'rang yoki ro'yxatdan chiqaring.
8.3 Interaktiv ichida interaktiv
Error: The element “button” must not appear as a descendant of the “a” element.Tuzatish: elementlarni yonma-yon qo'ying (Tugma yoki havola darsidagi kartochka yechimi).
8.4 Inline ichida blok
Error: Element “div” not allowed as child of element “span” in this context.Tuzatish: tashqi elementni div ga almashtiring yoki ichkisini span ga.
9. Mashqlar
1-mashq (oson): Mumkinmi?
strongichidaa→h2ichidap→buttonichidaspan→
Yechim
- Ha — ikkalasi ham phrasing,
strongphrasing qabul qiladi. - Yo'q — sarlavha faqat phrasing qabul qiladi,
pesa phrasing emas. - Ha —
spanphrasing va interaktiv emas.
2-mashq (o'rta): DOM'ni oldindan ayting
Brauzer bu kodni qanday DOM'ga aylantiradi? Avval yozing, keyin Elements panelida tekshiring.
<p>Menyu:
<ul>
<li>Osh</li>
</ul>
</p>Yechim
<p>Menyu:
</p><ul>
<li>Osh</li>
</ul>
<p></p>ul — phrasing emas, shuning uchun brauzer paragrafni undan oldin yopadi. Oxiridagi </p> uchun ochiq paragraf yo'q — brauzer bo'sh p yaratadi. To'g'ri variant: <p>Menyu:</p> va undan keyin alohida ul.
3-mashq (qiyin): Yashirin xatolarni toping
Sahifangizning hamma fayllarini npx html-validate va Nu HTML Checker orqali tekshiring. Kontent modeli bilan bog'liq har bir xato uchun:
- Qaysi qoida buzilganini ayting (4-bo'limdagi jadval bo'yicha).
- Tuzating.
- Elements panelida tuzatishdan oldingi va keyingi DOM'ni solishtiring.
Yechim
Tipik topilmalar: p ichida div yoki ro'yxat, a ichida tugma, span ichida div, button ichida havola. Har birida DOM'da ortiqcha bo'sh elementlar yoki bo'lingan havolalar ko'rinadi. Tuzatilgandan keyin DOM kodingiz bilan bir xil bo'ladi — Elements va View Source deyarli farq qilmaydi.
10. Real ishda
- React va Next.js loyihalari — hydration xatolarining eng ko'p uchraydigan sababi noto'g'ri ichma-ichlik (
pichidadiv,aichidaa). React ogohlantirishida ko'pincha "cannot be a descendant of" ("... ning avlodi bo'la olmaydi") iborasi bo'ladi. - Kontent tizimlari. Muharrir foydalanuvchi matnini
pichiga o'raydi — foydalanuvchi esa jadval yoki ro'yxat qo'shadi. Natija — buzilgan DOM. Tajribali dasturchi buni birinchi tekshiradi. - Kod review'da kontent modeli xatolari validator va linterlar orqali avtomatik tutiladi.
- Intervyu savoli: "Nega
pichigadivqo'yib bo'lmaydi?" — javobingiz: "pning kontent modeli — phrasing content; brauzer paragrafni yopadi va DOM o'zgaradi".
Xulosa
- Kontent modeli — element ichiga qaysi turkumdagi elementlar qo'yilishi mumkinligi.
- Asosiy turkumlar: flow, phrasing, heading, sectioning, interactive, metadata.
- "Block/inline" — eski atamalar: ko'rinish — CSS ishi, ichma-ichlik — kontent modeli ishi.
pva sarlavhalar — faqat phrasing;ul/ol— faqatli; interaktiv ichida interaktiv yo'q.- Transparent (
a,ins,del) — otasining qoidasini oladi. - Qoida buzilsa, brauzer DOM'ni o'zgartiradi; React'da bu hydration xatosiga olib keladi.
Keyingi dars: Brauzer HTML'ni qanday tahlil qiladi — tokenizer, daraxt qurish va brauzer xatolarni qanday "tuzatishi".
Manbalar
- WHATWG HTML: "Content models" va "Kinds of content" — html.spec.whatwg.org
- MDN: "Content categories" — developer.mozilla.org
- React hujjatlari: "Hydration" xatolari (react.dev)
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!