Grid Container — template-columns, rows, gap, fr birlik
Muammodan boshlaylik
Sahifa uchun uch ustunli layout kerak: chap menyu 220px, o'ng panel 280px, o'rtadagi kontent — qolgan hammasi. Foizlar bilan urinasiz: 20% 55% 25% — lekin menyu 220px bo'lishi kerak edi, foizda u ekranga qarab o'zgaradi. calc(100% - 500px) yozasiz — keyin gap qo'shasiz va yana qayta hisoblaysiz.
Grid da bu bitta qator: grid-template-columns: 220px 1fr 280px. Sir — fr birligida.
grid-template-columns — ustunlar
Har bir qiymat — bitta ustun:
.grid {
display: grid;
grid-template-columns: 200px 200px 200px; /* uchta 200px ustun */
}
Istalgan birliklarni aralashtirish mumkin (11-dars):
grid-template-columns: 250px 1fr; /* sidebar + kontent */
grid-template-columns: 1fr 2fr 1fr; /* o'rtadagisi 2 baravar keng */
grid-template-columns: 220px 1fr 280px; /* uch ustunli sahifa */
grid-template-columns: auto 1fr auto; /* chetlar — kontentga qarab */
fr — bo'sh joy ulushi
fr (fraction — ulush) — konteynerdagi bo'sh joyning ulushi:
.layout {
display: grid;
grid-template-columns: 220px 1fr 280px;
gap: 24px;
}
Konteyner 1200px:
qat'iy ustunlar: 220 + 280 = 500
gap lar: 24 × 2 = 48
bo'sh joy: 1200 − 500 − 48 = 652 → 1fr = 652px
fr qolgan joyni gap lardan keyin hisoblaydi — calc() kerak emas. Bu % dan asosiy farqi: 33.33% × 3 + gap lar = 100% dan oshib ketadi, 1fr × 3 esa doim aniq sig'adi.
grid-template-columns: 1fr 1fr 1fr; /* uchta teng */
grid-template-columns: 2fr 1fr; /* 2/3 va 1/3 */
grid-template-columns: 1fr 3fr; /* 1/4 va 3/4 */
[!INFO]
1fraslidaminmax(auto, 1fr)— ustun o'z kontentidan (masalan, uzun so'z yoki keng rasm) toraya olmaydi. Shuning uchun "teng" ustunlardan biri ba'zan kengroq bo'lib qoladi. Haqiqatan teng va kontentdan mustaqil ustunlar uchun:minmax(0, 1fr)— Flexbox dagimin-width: 0ning Grid dagi ekvivalenti (16-dars).
repeat() — takrorlash
grid-template-columns: repeat(4, 1fr); /* = 1fr 1fr 1fr 1fr */
grid-template-columns: repeat(12, minmax(0, 1fr)); /* 12 ustunli to'r */
grid-template-columns: 200px repeat(3, 1fr) 200px; /* aralash */
grid-template-columns: repeat(2, 100px 1fr); /* naqsh: 100px 1fr 100px 1fr */
12 ustunli to'r — ko'p dizayn tizimlarining asosi (Bootstrap ham shunday): 12 ga 2, 3, 4 va 6 bo'linadi, shuning uchun istalgan nisbat qulay olinadi.
repeat() ning eng kuchli shakli — auto-fill va auto-fit bilan avtomatik ustunlar soni — 22-dars.
grid-template-rows — qatorlar
.page {
display: grid;
grid-template-rows: 64px 1fr 80px; /* header, kontent, footer */
min-height: 100dvh;
}
Ko'pincha qatorlarni belgilamaysiz — ular kontentga qarab avtomatik yaratiladi. Belgilash kerak bo'lganda:
- Sahifa tuzilishi (header —
auto, main —1fr, footer —auto) - Bir xil balandlikdagi qatorlar (galereya)
Yashirin (implicit) qatorlar
Elementlar belgilangan qatorlardan ko'p bo'lsa — Grid avtomatik yangi qatorlar yaratadi. Ularning o'lchamini boshqarish:
.gallery {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 200px; /* har bir avtomatik qator 200px */
}
.feed {
grid-auto-rows: minmax(120px, auto); /* kamida 120px, kontent ko'p bo'lsa — kattaroq */
}
grid-auto-flow: dense — bo'sh qolgan kataklarni keyingi kichik elementlar bilan to'ldiradi (masonry galereyalarga o'xshash). Tartib o'zgarishi mumkin — faqat tartib muhim bo'lmaganda ishlating.
minmax() — chegaralar
grid-template-columns: minmax(200px, 300px) 1fr;
Birinchi ustun — kamida 200px, ko'pi bilan 300px. Kontent ko'pmi yoki ekran kengmi — chegara ichida moslashadi.
grid-template-rows: auto minmax(400px, 1fr) auto;
minmax() — auto-fill bilan birga responsive to'rning asosi (22-dars).
gap — bo'shliq
14-darsdagi Flexbox gap bilan bir xil — faqat track lar orasida, chetlarda emas:
.grid {
gap: 24px; /* qatorlar va ustunlar orasida */
gap: 32px 16px; /* qatorlar orasi 32px, ustunlar orasi 16px */
row-gap: 32px;
column-gap: 16px;
}
Margin lar kerak emas, collapse yo'q, fr gap ni avtomatik hisobga oladi.
Tekislash: konteyner darajasida
Grid ham Flexbox kabi tekislash xususiyatlariga ega, lekin har ikki o'q aniq:
| Xususiyat | Nimani | Qaysi yo'nalishda |
|---|---|---|
justify-items |
Elementlarni kataklar ichida | Gorizontal (qator bo'ylab) |
align-items |
Elementlarni kataklar ichida | Vertikal (ustun bo'ylab) |
justify-content |
Butun to'rni konteyner ichida | Gorizontal |
align-content |
Butun to'rni konteyner ichida | Vertikal |
Standart — stretch: elementlar butun katakni egallaydi.
.icons {
display: grid;
grid-template-columns: repeat(4, 80px);
justify-items: center; /* har bir ikonka o'z katagining o'rtasida */
align-items: center;
justify-content: center; /* butun to'r konteyner o'rtasida */
}
Eng qisqa markazlash
.center {
display: grid;
place-items: center; /* align-items + justify-items */
min-height: 100dvh;
}
17-darsdagi Flexbox markazlashdan ham qisqaroq — ikki qator.
Amaliy misol: forma
<form class="form">
<label for="ism">Ism</label>
<input id="ism">
<label for="email">Elektron pochta</label>
<input id="email" type="email">
<label for="izoh">Izoh</label>
<textarea id="izoh"></textarea>
</form>
.form {
display: grid;
grid-template-columns: max-content 1fr;
gap: 12px 16px;
align-items: center;
}
Ism │ [..............................]
Elektron pochta│ [..............................]
Izoh │ [..............................]
max-content— birinchi ustun eng uzun label kengligida- Barcha input lar bitta vertikal chiziqda boshlanadi
Bu — "ikki yo'nalishda tekislash" ning klassik misoli: Flexbox bilan har bir qator mustaqil bo'lardi va input lar turli joydan boshlanardi.
Nima uchun shunday?
Nima uchun Grid uchun yangi birlik — fr — o'ylab topilgan, foizlar yetarli emasmi?
Chunki foiz — butun konteynerdan ulush, va real layoutda butun konteyner hech qachon to'liq taqsimlanmaydi: gap lar, qat'iy sidebar lar, kontentga qarab o'lchanadigan ustunlar bor. Foiz bilan bularni hisobga olish — calc() dan iborat zanjir, va har bir o'zgarishda qayta hisoblash. fr esa qolgan joyni bo'ladi: avval brauzer barcha qat'iy narsalarni (px, auto, gap) joylashtiradi, keyin nima qolsa — uni nisbatlarda taqsimlaydi. Siz nisbatni aytasiz, brauzer arifmetikani bajaradi. Bu Flexbox dagi flex-grow g'oyasi, lekin ustunlar darajasida va ancha qisqa yozuv bilan.
Xulosa
Eslab qoling:
grid-template-columns— har bir qiymat — ustun;px,%,auto,fraralashtiriladifr— gap va qat'iy ustunlardan keyin qolgan joyning ulushiminmax(0, 1fr)— kontentdan mustaqil haqiqatan teng ustunlarrepeat(4, 1fr),repeat(12, minmax(0, 1fr))grid-template-rows; avtomatik qatorlar —grid-auto-rowsminmax(min, max)— chegaralangan o'lchamgap— faqat track lar orasidajustify-items/align-items— kataklar ichida;place-items: center— eng qisqa markazlashmax-content 1fr— forma label va input larini tekislash
Keyingi dars
20-dars: Grid — template-areas, nomlangan zonalar