Grid — auto-fill, auto-fit, minmax
Muammodan boshlaylik
Mahsulotlar katalogi: telefonda 1 ustun, planshetda 2, noutbukda 3, katta monitorda 4–5. Odatiy yechim — media query lar:
.products { grid-template-columns: 1fr; }
@media (min-width: 600px) { .products { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 900px) { .products { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1200px) { .products { grid-template-columns: repeat(4, 1fr); } }
@media (min-width: 1500px) { .products { grid-template-columns: repeat(5, 1fr); } }
Ishlaydi, lekin: katalog sahifaning sidebar li qismida turgan bo'lsa-chi? Ekran 1200px, lekin katalogga faqat 800px tegadi — 4 ta ustun juda tor bo'ladi. Media query lar ekranga qaraydi, konteynerga emas.
Grid da bularning hammasini bitta qator almashtiradi — media query siz, va konteyner kengligiga qarab.
Sehrli qator
.products {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 24px;
}
Brauzer o'zi hisoblaydi: "konteynerga kamida 240px li nechta ustun sig'adi?" — va shuncha ustun yasaydi. Qolgan joy ustunlar orasida teng bo'linadi (1fr).
Konteyner 1300px → 5 ta ustun
Konteyner 1000px → 3 ta ustun (4 tasi gap lar bilan sig'maydi — pastda hisob)
Konteyner 600px → 2 ta ustun
Konteyner 320px → 1 ta ustun
Uch qismni ajratamiz.
minmax(240px, 1fr)
19-darsdan: minmax(min, max) — ustun kamida 240px, ko'pi bilan 1fr (bo'sh joyning teng ulushi).
- Ustunlar hech qachon 240px dan torayib ketmaydi — kartochka buzilmaydi
- Bo'sh joy qolsa — ustunlar kengayib, uni teng bo'lishadi
auto-fill — sig'ganicha ustun
repeat(auto-fill, ...) — aniq son o'rniga: "qancha sig'sa, shuncha ustun".
Konteyner 1000px, gap 24px, minimum 240px:
3 ustun: 3 × 240 + 2 × 24 = 768 ✓ sig'adi
4 ustun: 4 × 240 + 3 × 24 = 1032 ✗ sig'maydi
→ 3 ustun, har biri (1000 − 48) / 3 ≈ 317px
Konteyner o'lchami o'zgarganda — ustunlar soni o'zi o'zgaradi. Sidebar ichida bo'lsa — kamroq ustun, butun ekranda — ko'proq. Darsning boshidagi muammo hal: hisob konteynerga asoslangan.
auto-fill va auto-fit farqi
Ikkalasi ham "sig'ganicha ustun" yasaydi. Farq — elementlar kam bo'lganda (ustunlar soni elementlardan ko'p bo'lsa):
.a { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
.b { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
Konteyner 1000px, faqat 2 ta element:
auto-fill — bo'sh ustunlar SAQLANADI:
┌────────┬────────┬────────┬────────┬────────┬────────┐
│ 1 │ 2 │ (bo'sh)│ (bo'sh)│ (bo'sh)│ (bo'sh)│
└────────┴────────┴────────┴────────┴────────┴────────┘
auto-fit — bo'sh ustunlar YO'QOLADI, mavjudlari cho'ziladi:
┌──────────────────────────┬──────────────────────────┐
│ 1 │ 2 │
└──────────────────────────┴──────────────────────────┘
auto-fill |
auto-fit |
|
|---|---|---|
| Bo'sh ustunlar | Saqlanadi (ko'rinmas) | Siqib yo'qotiladi |
| Kam elementlar | Odatiy o'lchamda, chapda | Butun kenglikka cho'ziladi |
| Qachon | Katalog, galereya — kartochkalar bir xil o'lchamda qolsin | Elementlar har doim butun joyni egallasin (masalan, 2–4 ta xususiyat bloki) |
Ko'pchilik holatlarda — auto-fill: 1 ta mahsulot qolganda u butun ekran kengligidagi ulkan kartochkaga aylanmaydi.
[!INFO] Elementlar ustunlarni to'ldirish uchun yetarli bo'lsa —
auto-fillvaauto-fito'rtasida hech qanday farq yo'q. Farq faqat elementlar kam bo'lganda ko'rinadi.
Juda tor konteyner — min() bilan himoya
Konteyner 240px dan tor bo'lsa (masalan, 200px li telefon chetida), minmax(240px, 1fr) baribir 240px talab qiladi — kartochka konteynerdan chiqib ketadi va gorizontal scroll paydo bo'ladi (10-dars).
.products {
grid-template-columns: repeat(auto-fill, minmax(min(240px, 100%), 1fr));
}
min(240px, 100%) — "240px, lekin konteynerdan katta emas". Juda tor ekranda ustun konteyner kengligiga tushadi. Bu — responsive katalogning to'liq, "o'q o'tmas" versiyasi.
Galereya — bir xil kvadratlar
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(160px, 100%), 1fr));
gap: 8px;
}
.gallery img {
width: 100%;
aspect-ratio: 1; /* kvadrat */
object-fit: cover; /* rasm kesilib, kvadratni to'ldiradi */
border-radius: 6px;
}
Har qanday ekranda — bir xil kvadratlar, teng bo'shliqlar, oxirgi qator ham to'g'ri tekislangan (17-darsdagi Flexbox muammosi yo'q).
Flexbox wrap bilan taqqoslash
17-darsda Flexbox bilan shunga o'xshash natija oldik: flex: 1 1 240px + flex-wrap: wrap. Farqi:
Flexbox wrap |
Grid auto-fill |
|
|---|---|---|
| Oxirgi qatordagi elementlar | Cho'ziladi yoki chapda qoladi, ustunlarga tekislanmaydi | Yuqoridagi ustunlarga aniq tekislanadi |
| Har bir qator | Mustaqil | Hamma qatorlar bir xil ustunlarda |
| Qachon | Elementlar turli kenglikda bo'lishi mumkin (teglar) | Bir xil kartochkalar to'ri |
Nima uchun shunday?
Nima uchun bitta qator CSS o'nlab qator media query ni almashtira oladi — bu qanday mumkin?
Chunki u "qanday natija" ni tasvirlaydi, "qachon nima qilish" ni emas. Media query lar imperativ: "agar ekran 900px dan keng bo'lsa — 3 ustun". Siz har bir holatni oldindan o'ylab, chegaralarni qo'lda tanlaysiz — va har qanday kutilmagan kontekst (sidebar, modal, boshqa sahifadagi kichik konteyner) ularni buzadi. repeat(auto-fill, minmax(240px, 1fr)) esa deklarativ: "har bir kartochka kamida 240px bo'lsin, qolganini o'zing hal qil". Brauzer har qanday konteyner kengligi uchun natijani o'zi hisoblaydi — siz o'ylamagan o'lchamlar uchun ham. Bu "ichki responsive" (intrinsic) dizayn g'oyasi: komponent atrofga emas, o'ziga berilgan joyga moslashadi.
Xulosa
Eslab qoling:
repeat(auto-fill, minmax(240px, 1fr))— media query siz responsive to'rminmax(240px, 1fr)— kamida 240px, qolgan joyni teng bo'lishadi- Hisob konteyner kengligiga asoslangan, ekranga emas
auto-fill— bo'sh ustunlar saqlanadi (katalog, galereya — ko'pincha shu)auto-fit— bo'sh ustunlar yo'qoladi, elementlar cho'ziladiminmax(min(240px, 100%), 1fr)— juda tor konteynerdan chiqib ketmaslik- Galereya:
aspect-ratio: 1+object-fit: cover
Keyingi bo'lim
5-bo'lim: Pozitsiya va Responsive — position, z-index, Mobile First va media query lar.