Flex Item — flex-grow, flex-shrink, flex-basis, order, align-self
Muammodan boshlaylik
Uch vazifa:
- Qidiruv paneli: input qolgan barcha joyni egallasin, yonidagi tugma esa o'z o'lchamida qolsin
- Sahifa: chap menyu 250px, asosiy qism — qolgan hammasi
- Kartochkalar: hammasi teng kenglikda, nechta bo'lishidan qat'i nazar
14–15-darslarda konteynerni boshqardik. Endi — elementlarning o'zini: har biri qancha joy olishi, o'sishi va qisqarishi.
Bo'sh joy qanday taqsimlanadi
Brauzer har bir flex qatorni shunday hisoblaydi:
1. Har bir elementning boshlang'ich o'lchami → flex-basis
2. Konteyner − barcha boshlang'ich o'lchamlar → bo'sh joy (musbat yoki manfiy)
3. Musbat bo'lsa → elementlar O'SADI → flex-grow nisbatida
4. Manfiy bo'lsa → elementlar QISQARADI → flex-shrink nisbatida
Uchta xususiyat — uchta qadam.
flex-grow — o'sish
Bo'sh joyning qancha ulushini olishi. Standart — 0 (o'smaydi).
.search-input {
flex-grow: 1; /* barcha bo'sh joyni oladi */
}
<form class="search">
<input class="search-input" type="search" placeholder="Qidirish...">
<button>Qidirish</button>
</form>
│[input ............................................][Qidirish]│
1-vazifa hal: tugma o'z o'lchamida, input — qolgan hammasi.
Nisbatlar
.a { flex-grow: 1; }
.b { flex-grow: 2; }
Bo'sh joy 300px bo'lsa: .a +100px, .b +200px (1:2 nisbatda). Diqqat: bu bo'sh joyni bo'lish, butun kenglikni emas — elementlarning o'zi baribir turlicha bo'lishi mumkin.
flex-shrink — qisqarish
Joy yetmaganda qanchalik qisqarishi. Standart — 1 (hammasi teng nisbatda qisqaradi).
.logo {
flex-shrink: 0; /* hech qachon qisqarmasin */
}
Tipik muammo: tor ekranda ikonka yoki avatar "siqilib", tuxum shakliga kiradi:
.avatar {
width: 40px;
height: 40px;
flex-shrink: 0; /* yumaloq avatar doim 40×40 */
}
Qisqarishi mumkin bo'lmagan har qanday narsa (ikonka, logo, avatar, belgilangan o'lchamli tugma) — flex-shrink: 0.
[!INFO] Flex elementlar odatda kontentidan kichikroq bo'lmaydi: standart
min-width: auto— eng uzun so'z yoki rasm kengligi. Shuning uchun uzun matnli element qisqarmay, konteynerdan chiqib ketishi mumkin. Yechim: shu elementgamin-width: 0(keyintext-overflow: ellipsisham ishlaydi — 10-dars).
flex-basis — boshlang'ich o'lcham
O'sish va qisqarishdan oldingi o'lcham. Standart — auto (elementning width i yoki kontent o'lchami).
.sidebar {
flex-basis: 250px;
flex-shrink: 0;
}
.main {
flex-grow: 1;
flex-basis: 0;
}
2-vazifa hal: menyu 250px va qisqarmaydi, asosiy qism qolgan hammasini oladi.
flex-basis va width: flex element ichida flex-basis ustun turadi (auto bo'lmasa). row da u kenglikni, column da — balandlikni belgilaydi.
flex-basis: 0 va auto — farqi
flex-basis: auto — avval kontent o'lchami, keyin BO'SH JOY bo'linadi:
│[ Qisqa ....... ][ Juda uzun matnli element ....... ]│ turli kenglikda
flex-basis: 0 — avval hammasi 0, keyin BUTUN JOY bo'linadi:
│[ Qisqa ..................][ Juda uzun matnli ........]│ teng kenglikda
flex — qisqa yozuv (amalda shu ishlatiladi)
flex: <grow> <shrink> <basis>;
| Yozuv | Ma'nosi | Qachon |
|---|---|---|
flex: 1 |
1 1 0% |
Teng ustunlar; qolgan joyni egallash |
flex: auto |
1 1 auto |
Kontentga qarab, lekin o'sadi |
flex: none |
0 0 auto |
Qat'iy — o'smaydi, qisqarmaydi |
flex: 0 0 250px |
Aniq 250px | Belgilangan sidebar |
flex: 2 |
2 1 0% |
Boshqalardan 2 baravar keng |
3-vazifa hal:
.cards {
display: flex;
gap: 24px;
}
.card {
flex: 1; /* 2 ta bo'lsa — yarmi, 5 ta bo'lsa — beshdan biri */
}
[!TIP] Alohida
flex-grow/flex-shrink/flex-basiso'rniga qisqaflexni ishlating. U standart qiymatlarni to'g'ri qo'yadi — masalan,flex: 1flex-basisni0%qiladi, bu esa teng ustunlar uchun aynan kerak. Faqatflex-grow: 1yozsangiz,basisautoqolib, ustunlar teng bo'lmaydi.
order — vizual tartib
.item-a { order: 2; }
.item-b { order: 1; } /* birinchi bo'lib ko'rinadi */
Standart — 0. Kichik qiymat — oldinroq; manfiy ham mumkin (order: -1 — eng boshiga).
@media (max-width: 768px) {
.sidebar {
order: 2; /* telefonda sidebar asosiy kontentdan keyin */
}
}
[!WARNING]
reversekabi (14-dars),orderfaqat ko'rinishni o'zgartiradi. Tab tugmasi va ekran o'quvchilar HTML tartibida yuradi — foydalanuvchi uchun fokus ekranda "sakrab" yuradi. Mazmun tartibi muhim bo'lsa — HTML ni to'g'ri tartibda yozing.
align-self — bitta elementning tekislanishi
15-darsdagi align-items ni bitta element uchun bekor qiladi:
.container {
display: flex;
align-items: flex-start;
}
.special {
align-self: center; /* faqat shu element o'rtada */
}
Qiymatlari: auto (konteyner qiymati), flex-start, center, flex-end, stretch, baseline.
Amaliy misol: chat xabari
<div class="message">
<img class="avatar" src="otabek.jpg" alt="">
<div class="body">
<div class="meta">
<strong class="name">Abdurahmonbekov Muhammadali</strong>
<time>14:23</time>
</div>
<p>Salom! Flexbox darsini o'qib chiqdim...</p>
</div>
</div>
.message {
display: flex;
gap: 12px;
align-items: flex-start;
}
.avatar {
flex: none; /* qat'iy 40×40, siqilmaydi */
width: 40px;
height: 40px;
border-radius: 50%;
}
.body {
flex: 1; /* qolgan joy */
min-width: 0; /* uzun matn konteynerdan chiqib ketmasin */
}
.meta {
display: flex;
gap: 8px;
align-items: baseline;
}
.name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.meta time {
flex: none;
margin-left: auto; /* vaqt — o'ng chetda */
}
Bitta komponentda darsdagi deyarli hamma narsa: flex: none, flex: 1, min-width: 0, margin-left: auto, align-items.
Nima uchun shunday?
Nima uchun flex elementlar standartda qisqaradi (shrink: 1), lekin o'smaydi (grow: 0)?
Ikkalasi ham "zararsiz" standart: kontentni yo'qotmaslik va dizaynni kutilmaganda buzmaslik. O'smaslik — elementlar o'z tabiiy o'lchamida qoladi, siz ataylab so'ramaguningizcha bo'sh joyni egallamaydi (aks holda oddiy menyuning havolalari butun ekran bo'ylab cho'zilardi). Qisqarish esa — joy yetmaganda elementlar konteynerdan chiqib, sahifani buzish o'rniga moslashadi (masalan, tor telefon ekranida). Natija: display: flex ni qo'yishning o'zi xavfsiz va oldindan aytib bo'ladigan natija beradi, flex xususiyati esa nimani o'zgartirmoqchi ekaningizni aniq aytish uchun.
Xulosa
Eslab qoling:
- Taqsimlash:
flex-basis(boshlang'ich) → bo'sh joy →flex-growyokiflex-shrink flex-grow— bo'sh joy ulushi (standart 0);flex-shrink— qisqarish (standart 1)flex-shrink: 0— ikonka, logo, avatar siqilmasinmin-width: 0— uzun matnli element qisqara olsin- Qisqa yozuv:
flex: 1(teng ustunlar),flex: none(qat'iy),flex: 0 0 250px ordervaalign-self— bitta element uchun;orderfaqat vizualmargin-left: auto— elementni chetga surish
Keyingi dars
17-dars: Flexbox bilan amaliy layoutlar — nav, card, markazlash