CSS

Flexbox

Flexbox (Flexible Box Layout) โ€” elementlarni bir qator yoki bir ustunda oson va moslashuvchan joylashtirish uchun mo'ljallangan CSS moduli. Flexbox'gacha elementlarni yonma-yon terish, markazga qo'yish yoki teng taqsimlash juda qiyin edi (float va boshqa "hiyla"lar bilan). Flexbox bularning barchasini bir necha qatorda hal qiladi. Bu โ€” zamonaviy CSS'ning eng muhim vositalaridan biri.

Flexbox โ€” bir o'lchamli (one-dimensional) joylashuv tizimi: u elementlarni bir yo'nalishda โ€” yo qator (row) bo'ylab, yo ustun (column) bo'ylab tartibga soladi. Ikki o'lchamli (qator VA ustun birga) joylashuv uchun keyingi darsdagi CSS Grid ishlatiladi.

Asosiy tushuncha: konteyner va elementlar

Flexbox ikki qismdan iborat: flex-konteyner (ota element, unga display: flex beriladi) va uning ichidagi flex-elementlar (bevosita farzandlar). Konteynerga display: flex berishingiz bilan uning barcha bevosita farzandlari avtomatik yonma-yon (bir qatorga) tiziladi.

<!-- HTML -->
<div class="konteyner">
  <div>1</div>
  <div>2</div>
  <div>3</div>
</div>
/* CSS */
.konteyner {
  display: flex;
}

Faqat shu bitta qatordan keyin uchta div bir-birining yoniga chiziladi (odatiy holatda ular bir-birining ostida bo'lardi, chunki div โ€” block element).

Ikkita o'q: asosiy va ko'ndalang

Flexbox'ni tushunish uchun uning ikki o'qini bilish shart:

Bu ikkisini eslab qolish muhim, chunki justify-content โ€” asosiy o'q bo'yicha, align-items esa ko'ndalang o'q bo'yicha ishlaydi.

justify-content โ€” asosiy o'q bo'yicha tekislash

Elementlarni asosiy o'q (odatda gorizontal) bo'ylab qanday taqsimlashni belgilaydi:

.konteyner {
  display: flex;
  justify-content: center;
}

align-items โ€” ko'ndalang o'q bo'yicha tekislash

Elementlarni ko'ndalang o'q (odatda vertikal) bo'yicha qanday tekislashni belgilaydi:

.konteyner {
  display: flex;
  height: 300px;
  align-items: center;
}
Elementni to'liq markazga (ham gorizontal, ham vertikal) qo'yish โ€” Flexbox'ning eng mashhur "sehri". Faqat uch qator: display: flex; justify-content: center; align-items: center;. Bu klassik "markazga qo'yish" muammosini bir zumda hal qiladi.
.markaz {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

flex-direction โ€” yo'nalishni o'zgartirish

Asosiy o'qning yo'nalishini o'zgartiradi. Buni o'zgartirsangiz, justify-content va align-itemsning o'qlari ham almashadi (chunki ular o'qlarga bog'langan):

.ustun {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
flex-direction: column qo'ysangiz, asosiy o'q endi vertikal bo'ladi. Shuning uchun justify-content endi vertikal joylashuvni, align-items esa gorizontal joylashuvni boshqaradi โ€” ular "o'rin almashadi". Bu ko'p yangi dasturchini chalkashtiradi, shuni yodda tuting.

flex-wrap โ€” qatorga sig'masa o'tkazish

Standart holatda flex-elementlar bitta qatorga majburan siqiladi (sig'masa ham). flex-wrap: wrap ularga sig'magan elementlarni keyingi qatorga o'tishga ruxsat beradi:

.galereya {
  display: flex;
  flex-wrap: wrap;
  gap: 15px;
}
flex-wrap: wrap responsive (moslashuvchan) galereyalar uchun juda foydali: ekran torayganda kartalar avtomatik keyingi qatorga tushadi.

gap โ€” elementlar orasidagi bo'shliq

gap flex-elementlar orasiga bir tekis bo'shliq qo'shadi. Ilgari buning uchun har bir elementga margin berish kerak edi (va oxirgisini olib tashlash muammo edi). gap buni juda soddalashtirdi:

.konteyner {
  display: flex;
  gap: 20px;         /* barcha tomondan 20px */
}

/* Qator va ustun uchun alohida */
.panjara {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 30px;    /* qatorlar orasi 10px, ustunlar orasi 30px */
}

flex-grow, flex-shrink, flex-basis โ€” elementlarning egiluvchanligi

Bu uch xossa flex-elementlarning o'ziga (konteynerga emas) beriladi va ularning bo'sh joyni qanday egallashini boshqaradi:

Ko'pincha ular bitta qisqartirilgan flex xossasi orqali yoziladi: flex: grow shrink basis.

/* Element barcha bo'sh joyni egallasin */
.katta {
  flex: 1;          /* = flex: 1 1 0 */
}

/* To'liq yozuv */
.element {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 200px;
}
flex: 1 โ€” eng ko'p ishlatiladigan qiymat. Agar bir konteynerdagi barcha elementlarga flex: 1 bersangiz, ular mavjud joyni teng bo'lib egallaydi. Bu bir necha ustunni teng kenglikda qilishning eng oson usuli.

Amaliy misol: sayt navigatsiya paneli

Flexbox uchun eng keng tarqalgan amaliy holat โ€” sayt tepasidagi navigatsiya paneli: chapda logotip, o'ngda menyu havolalari.

<!-- HTML -->
<nav class="navbar">
  <div class="logo">MySite</div>
  <div class="menyu">
    <a>Bosh sahifa</a>
    <a>Xizmatlar</a>
    <a>Aloqa</a>
  </div>
</nav>
/* CSS */
.navbar {
  display: flex;
  justify-content: space-between;  /* logo chapda, menyu o'ngda */
  align-items: center;            /* vertikal markazda */
  padding: 15px 30px;
}

.menyu {
  display: flex;
  gap: 20px;                       /* havolalar orasi bo'shliq */
}

Xulosa