Grid — template-areas, nomlangan zonalar
Muammodan boshlaylik
Blog sahifasi. Kompyuterda:
┌───────────────────────────────────┐
│ header │
├────────────────────────┬──────────┤
│ │ │
│ maqola │ sidebar │
│ │ │
├────────────────────────┴──────────┤
│ footer │
└───────────────────────────────────┘
Telefonda esa hammasi ustma-ust, sidebar — maqoladan keyin:
┌──────────┐
│ header │
├──────────┤
│ maqola │
├──────────┤
│ sidebar │
├──────────┤
│ footer │
└──────────┘
21-darsda ko'radigan chiziq raqamlari bilan (grid-column: 1 / 3) buni yozish mumkin, lekin raqamlar hech narsa aytmaydi: kodni ochganda "grid-row: 2 / 3 — bu nima edi?" deb o'ylaysiz. Grid da bundan ancha ko'rgazmali usul bor — layoutni so'zlar bilan chizish.
Zonalarni chizish
.page {
display: grid;
grid-template-columns: 1fr 300px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"maqola sidebar"
"footer footer";
gap: 24px;
min-height: 100dvh;
}
- Har bir qo'shtirnoqli satr — to'rning bitta qatori
- Satr ichidagi har bir so'z — bitta ustun (bo'shliq bilan ajratiladi)
- Bir xil nom bir nechta katakda — shu zona ularning hammasini egallaydi
"header header" — header ikkala ustunni egallaydi. CSS kodning o'zi layoutning chizmasiga o'xshaydi.
Elementlarni zonalarga joylash
.page > header { grid-area: header; }
.page > article { grid-area: maqola; }
.page > aside { grid-area: sidebar; }
.page > footer { grid-area: footer; }
<div class="page">
<header>...</header>
<article>...</article>
<aside>...</aside>
<footer>...</footer>
</div>
grid-area qiymati — grid-template-areas dagi nom (qo'shtirnoqsiz). Elementlarning HTML dagi tartibi endi muhim emas — har biri o'z zonasiga boradi.
Responsive — faqat xaritani almashtirish
Darsning boshidagi muammo:
.page {
display: grid;
grid-template-columns: 1fr;
grid-template-areas:
"header"
"maqola"
"sidebar"
"footer";
gap: 16px;
}
@media (min-width: 900px) {
.page {
grid-template-columns: 1fr 300px;
grid-template-areas:
"header header"
"maqola sidebar"
"footer footer";
}
}
Elementlarning CSS iga (grid-area) tegilmadi — faqat konteynerning "xaritasi" o'zgardi. Mobile First (25-dars): avval telefon uchun, keyin keng ekran uchun.
Yana bitta o'lcham:
@media (min-width: 1280px) {
.page {
grid-template-columns: 240px 1fr 300px;
grid-template-areas:
"header header header"
"nav maqola sidebar"
"footer footer footer";
}
}
Bo'sh kataklar — nuqta
Katak bo'sh qolishi kerak bo'lsa — nuqta .:
.dashboard {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-areas:
"stats stats chart"
"orders . chart"
"orders users users";
}
Bir nechta nuqta (...) ham bitta bo'sh katak hisoblanadi — ustunlarni tekislab yozish uchun qulay.
Qoidalar
[!WARNING] Zona to'rtburchak bo'lishi kerak. "L" shaklidagi yoki uzilgan zona — xato, va brauzer butun
grid-template-areasni e'tiborsiz qoldiradi (layout to'liq buziladi, xabarsiz).
/* ❌ "a" — L shaklida */
grid-template-areas:
"a a"
"a b";
/* ❌ "a" — ikki joyda, uzilgan */
grid-template-areas:
"a b a";
/* ✅ */
grid-template-areas:
"a a"
"b c";
Boshqa qoidalar:
- Har bir satrda ustunlar soni bir xil bo'lishi kerak
- Nomlar — harflar, raqamlar, chiziqcha; raqam bilan boshlanmasin
grid-template — qisqa yozuv
Zonalar, qator balandliklari va ustun kengliklarini bitta xususiyatda:
.page {
display: grid;
grid-template:
"header header" 64px
"maqola sidebar" 1fr
"footer footer" auto
/ 1fr 300px;
}
Har bir satr oxirida — shu qatorning balandligi, / dan keyin — ustunlar kengligi. Ixcham, lekin yangi boshlovchilar uchun alohida xususiyatlar o'qishga osonroq.
Nomlangan zonalar va chiziqlar
Zona yaratilganda Grid avtomatik nomlangan chiziqlar ham yaratadi: maqola-start va maqola-end. Ularni 21-darsdagi grid-column da ishlatish mumkin:
.banner {
grid-column: maqola-start / sidebar-end; /* maqoladan sidebar oxirigacha */
}
Amaliy misol: mahsulot kartochkasi
Zonalar faqat sahifa uchun emas — komponent ichida ham qulay:
<article class="product">
<img class="product-img" src="noutbuk.jpg" alt="">
<h3 class="product-title">Noutbuk Pro 14</h3>
<p class="product-desc">Yengil va kuchli...</p>
<span class="product-price">12 500 000 so'm</span>
<button class="product-btn">Savatga</button>
</article>
.product {
display: grid;
grid-template-columns: 120px 1fr auto;
grid-template-areas:
"img title price"
"img desc desc"
"img . btn";
gap: 8px 16px;
}
.product-img { grid-area: img; }
.product-title { grid-area: title; }
.product-desc { grid-area: desc; }
.product-price { grid-area: price; }
.product-btn { grid-area: btn; }
Bir qarashda kartochkaning tuzilishi ko'rinadi — chizma va kod bir xil.
Nima uchun shunday?
Nima uchun CSS da "ASCII-rasm" kabi g'alati sintaksis — bu jiddiy dasturlash tiliga xos emas-ku?
Chunki layout — vizual tushuncha, va uni vizual yozish eng tushunarli. Raqamli koordinatalar (grid-row: 2 / 4; grid-column: 1 / 3) mashina uchun aniq, lekin odam ularni o'qiganda boshida to'rni tasavvur qilib, chiziqlarni sanashi kerak. grid-template-areas esa kodni o'qish paytida layoutni ko'rish imkonini beradi — va eng muhimi, uni o'zgartirish ham vizual: sidebar ni chapga o'tkazish — ikki so'zning joyini almashtirish. Dizayner chizgan maketni deyarli to'g'ridan-to'g'ri kodga ko'chirish mumkin. Bu — CSS ning kam uchraydigan, lekin juda muvaffaqiyatli "o'qiladigan kod" namunasi.
Xulosa
Eslab qoling:
grid-template-areas— layoutni nomlar bilan chizish; har bir satr — qator, har bir so'z — ustungrid-area: nom— elementni zonaga joylash; HTML tartibi muhim emas- Responsive — faqat konteyner xaritasini media query da almashtirish
.— bo'sh katak- Zona faqat to'rtburchak; har satrda ustunlar soni bir xil — aks holda butun xarita bekor
grid-template— zonalar, qatorlar va ustunlar bitta qisqa yozuvda- Avtomatik chiziq nomlari:
nom-start,nom-end
Keyingi dars
21-dars: Grid Item — grid-column, grid-row, span