Flex Container — flex-direction, flex-wrap, gap
Muammodan boshlaylik
display: flex qo'ydingiz va 12 ta mahsulot kartochkasi bitta qatorga tizildi. Kompyuterda — juda tor kartochkalar, telefonda esa ekrandan tashqariga chiqib ketdi. Kerak edi: sig'masa — keyingi qatorga o'tsin.
Yana: mobil versiyada menyu havolalari yonma-yon emas, ustma-ust bo'lishi kerak. Va kartochkalar orasidagi bo'shliqni marginlar bilan qilsangiz, eng chetdagi kartochkalarda ortiqcha bo'shliq qoladi.
Bu uchta vazifa — flex konteynerning uchta xususiyati: flex-direction, flex-wrap va gap.
flex-direction — yo'nalish
.container {
display: flex;
flex-direction: row; /* standart */
}
| Qiymat | Asosiy o'q | Tartib |
|---|---|---|
row |
Gorizontal → | Chapdan o'ngga (standart) |
row-reverse |
Gorizontal ← | O'ngdan chapga |
column |
Vertikal ↓ | Tepadan pastga |
column-reverse |
Vertikal ↑ | Pastdan tepaga |
row: column:
┌───┬───┬───┐ ┌───┐
│ 1 │ 2 │ 3 │ │ 1 │
└───┴───┴───┘ ├───┤
│ 2 │
├───┤
│ 3 │
└───┘
column — o'qlar almashadi
13-darsdan: flex-direction: column da asosiy o'q vertikal bo'ladi. Natijada:
justify-content— endi vertikal tekislaydialign-items— endi gorizontal tekislaydi
.sidebar {
display: flex;
flex-direction: column;
justify-content: space-between; /* tepada menyu, pastda "Chiqish" tugmasi */
height: 100dvh;
}
Mobil menyu
.nav {
display: flex;
flex-direction: column; /* telefonda — ustma-ust */
gap: 8px;
}
@media (min-width: 768px) {
.nav {
flex-direction: row; /* keng ekranda — yonma-yon */
gap: 24px;
}
}
Media query lar — 26-dars.
[!WARNING]
row-reversevacolumn-reversefaqat vizual tartibni o'zgartiradi. Ekran o'quvchilar va klaviatura (Tab) navigatsiyasi HTML dagi tartibda qoladi. Ma'noli tartib muhim bo'lsa — HTML ni o'zgartiring,reverseni faqat bezak uchun ishlating.
flex-wrap — qatorga o'tish
Standart holatda flex elementlar bitta qatorga sig'ishga majburlanadi — kerak bo'lsa qisqaradi (16-dars), qisqara olmasa — konteynerdan chiqib ketadi.
.products {
display: flex;
flex-wrap: wrap;
}
.product-card {
width: 280px;
}
| Qiymat | Xatti-harakat |
|---|---|
nowrap |
Hammasi bitta qatorda (standart) |
wrap |
Sig'masa — keyingi qatorga |
wrap-reverse |
Sig'masa — oldingi (yuqoridagi) qatorga |
nowrap (konteyner 700px): wrap:
┌──────────────────────────┐ ┌──────────────────────────┐
│┌────┐┌────┐┌────┐┌────┐┌─┼──┐ │┌──────┐ ┌──────┐ │
││ 1 ││ 2 ││ 3 ││ 4 ││ 5│ │ ││ 1 │ │ 2 │ │
│└────┘└────┘└────┘└────┘└─┼──┘ │└──────┘ └──────┘ │
└──────────────────────────┘ │┌──────┐ ┌──────┐ │
elementlar qisqardi va ││ 3 │ │ 4 │ │
baribir chiqib ketdi │└──────┘ └──────┘ │
│┌──────┐ │
││ 5 │ │
│└──────┘ │
└──────────────────────────┘
Darsning boshidagi muammo hal: kartochkalar ekranga qarab 1, 2, 3 yoki 4 tadan qatorda.
[!INFO]
wrapbilan oxirgi qatordagi elementlar chapga yopishib qoladi (yuqoridagi 5-element). Ko'p hollarda bu normal. Lekin "hamma kartochka bir xil ustunlarda" kerak bo'lsa — bu Grid ning vazifasi (22-dars:auto-fill).
flex-flow — qisqa yozuv
.products {
flex-flow: row wrap; /* = flex-direction: row; flex-wrap: wrap; */
}
gap — elementlar orasidagi bo'shliq
.products {
display: flex;
flex-wrap: wrap;
gap: 24px; /* qatorlar va ustunlar orasida 24px */
}
gap — faqat elementlar orasida, chetlarda emas:
margin bilan (har bir kartochkaga margin: 12px):
┌──────────────────────────────────┐
│ ←12→┌──────┐←24→┌──────┐←12→ │ chetlarda ortiqcha bo'shliq,
│ │ 1 │ │ 2 │ │ konteyner kengligini hisoblash qiyin
│ └──────┘ └──────┘ │
└──────────────────────────────────┘
gap: 24px:
┌──────────────────────────────────┐
│┌──────┐←24→┌──────┐ │ faqat orasida —
││ 1 │ │ 2 │ │ chetlar toza
│└──────┘ └──────┘ │
└──────────────────────────────────┘
Alohida qiymatlar:
.grid {
gap: 32px 16px; /* qatorlar orasi 32px, ustunlar orasi 16px */
row-gap: 32px;
column-gap: 16px;
}
gap ning afzalliklari:
- Chetlarda ortiqcha bo'shliq yo'q — manfiy margin hiylalari kerak emas
- Margin collapse yo'q (9-dars)
wrapbilan qatorlar orasida ham avtomatik- Bitta joyda boshqariladi — har bir elementda emas
Bugun flex va grid konteynerlarda elementlar orasidagi bo'shliq uchun — har doim gap.
Amaliy misol: tugmalar guruhi
<div class="actions">
<button class="btn">Bekor qilish</button>
<button class="btn btn-primary">Saqlash</button>
</div>
.actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
@media (max-width: 480px) {
.actions {
flex-direction: column-reverse; /* telefonda: asosiy tugma tepada, to'liq kenglikda */
}
}
column da flex elementlar standartda butun kenglikka cho'ziladi (align-items: stretch) — telefonda katta, bosish oson tugmalar.
Nima uchun shunday?
Nima uchun flex-wrap standartda o'chirilgan — elementlar sig'masa avtomatik keyingi qatorga o'tishi tabiiyroq emasmi?
Chunki Flexbox ning asosiy maqsadi — bitta qator ichida bo'sh joyni taqsimlash: menyu, asboblar paneli, tugmalar qatori. Bunday komponentlarda elementlar keyingi qatorga o'tib ketishi kutilmagan va buzuvchi bo'lardi — masalan, menyu havolasi ikkinchi qatorga tushib, header balandligini ikki baravar oshirsa. Shuning uchun standart xatti-harakat — qatorda qolish va moslashish (qisqarish), wrap esa ongli tanlov. Bu Flexbox ning falsafasini ko'rsatadi: u "joylashuv to'ri" emas, "bir qator ichidagi moslashuvchanlik" vositasi; ko'p qatorli tartiblangan to'r uchun Grid bor.
Xulosa
Eslab qoling:
flex-direction:row(standart),column,row-reverse,column-reversecolumnda o'qlar almashadi:justify-content— vertikal,align-items— gorizontalreverse— faqat vizual; HTML tartibi (klaviatura, ekran o'quvchi) o'zgarmaydiflex-wrap: wrap— sig'masa keyingi qatorga; standart —nowrapflex-flow: row wrap— qisqa yozuvgap— faqat elementlar orasida; marginlar o'rniga har doimgaprow-gap,column-gap— alohida
Keyingi dars
15-dars: Flex Container — justify-content, align-items, align-content