CSS Flexbox'ning ichki o'lcham berish algoritmini tushunib, uning kuchini oching. Ushbu to'liq qo'llanma global dasturchilar uchun kontentga asoslangan o'lcham, flex-basis, grow, shrink va keng tarqalgan maket muammolarini tushuntiradi.
Flexbox O'lchamini Aniqlash Algoritmi Sirini Ochish: Kontentga Asoslangan Maketlarga Chuqur Tahlil
Bir xil o'lchamdagi ustunlarga ega bo'lishni kutib, bir nechta elementga flex: 1
qo'llagan, ammo ularning o'lchamlari baribir har xil bo'lib chiqqan holatlar bo'lganmi? Yoki dizayningizni buzib, xunuk toshib ketishga sabab bo'lgan, qisqarishni istamaydigan flex element bilan kurashganmisiz? Bu kabi keng tarqalgan muammolar ko'pincha dasturchilarni taxmin qilish va tasodifiy xususiyatlarni o'zgartirishga majbur qiladi. Biroq, yechim sehrda emas, balki mantiqda.
Bu jumboqlarning javobi CSS spetsifikatsiyasining tubida, ya'ni Flexbox Ichki O'lcham Berish Algoritmi deb nomlanuvchi jarayonda yotadi. Bu Flexbox'ni harakatga keltiruvchi kuchli, kontentdan xabardor mexanizmdir, ammo uning ichki mantig'i ko'pincha tushunarsizdek tuyulishi mumkin. Ushbu algoritmni tushunish — Flexbox'ni o'zlashtirish va haqiqatan ham bashorat qilinadigan, barqaror foydalanuvchi interfeyslarini yaratishning kalitidir.
Ushbu qo'llanma butun dunyodagi dasturchilar uchun Flexbox bilan "sinov va xato" usulidan "ongli dizayn"ga o'tishni istaganlar uchun mo'ljallangan. Biz ushbu kuchli algoritmni qadamma-qadam tahlil qilib, chalkashlikni aniqlikka aylantiramiz va sizga har qanday tildagi, har qanday kontent uchun ishlaydigan yanada mustahkam va global miqyosda moslashuvchan maketlar yaratish imkonini beramiz.
Qat'iy Piksellardan Tashqari: Ichki va Tashqi O'lcham Berishni Tushunish
Algoritmning o'ziga sho'ng'ishdan oldin, CSS maketidagi fundamental tushunchani — ichki va tashqi o'lcham berish o'rtasidagi farqni tushunish juda muhim.
- Tashqi O'lcham Berish: Bu siz, ya'ni dasturchi, elementning o'lchamini aniq belgilaganingizda sodir bo'ladi.
width: 500px
,height: 50%
yokiwidth: 30rem
kabi xususiyatlar tashqi o'lcham berishga misoldir. O'lcham element kontentidan tashqaridagi omillar bilan belgilanadi. - Ichki O'lcham Berish: Bu brauzer elementning o'lchamini uning tarkibidagi kontentga qarab hisoblaganda sodir bo'ladi. Uzunroq matn yorlig'ini sig'dirish uchun tabiiy ravishda kengayadigan tugma ichki o'lcham berishdan foydalanadi. O'lcham elementning ichidagi omillar bilan belgilanadi.
Flexbox ichki, kontentga asoslangan o'lcham berishning ustasidir. Siz qoidalarni (flex xususiyatlarini) taqdim etganingizda, brauzer yakuniy o'lcham qarorlarini flex elementlarining kontentiga va konteynerdagi mavjud bo'sh joyga qarab qabul qiladi. Aynan shu narsa uni suyuq, moslashuvchan dizaynlarni yaratish uchun juda kuchli qiladi.
Moslashuvchanlikning Uch Ustuni: `flex-basis`, `flex-grow` va `flex-shrink` haqida eslatma
Flexbox algoritmining qarorlari asosan uchta xususiyat bilan boshqariladi, ular ko'pincha flex
qisqartmasi yordamida birgalikda o'rnatiladi. Keyingi qadamlarni tushunish uchun ularni puxta bilish shart.
1. `flex-basis`: Boshlang'ich Chiziq
flex-basis
'ni flex elementning kengayishi yoki qisqarishidan oldin asosiy o'q bo'ylab ideal yoki "gipotetik" boshlang'ich o'lchami deb o'ylang. Bu boshqa barcha hisob-kitoblar amalga oshiriladigan asosiy chiziqdir.
- U uzunlik (masalan,
100px
,10rem
) yoki foiz (25%
) bo'lishi mumkin. - Standart qiymati
auto
.auto
ga o'rnatilganda, brauzer avval elementning asosiy o'lcham xususiyatiga (gorizontal flex konteyner uchunwidth
, vertikal uchunheight
) qaraydi. - Mana muhim bog'liqlik: Agar asosiy o'lcham xususiyati ham
auto
bo'lsa,flex-basis
elementning ichki, kontentga asoslangan o'lchamiga teng bo'ladi. Aynan shu yo'l bilan kontentning o'zi boshidanoq o'lcham berish jarayonida ishtirok etadi. content
qiymati ham mavjud bo'lib, u brauzerga aniq ichki o'lchamdan foydalanishni buyuradi.
2. `flex-grow`: Ijobiy Bo'sh Joyni Egallash
flex-grow
xususiyati — bu flex konteynerdagi ijobiy bo'sh joyning qancha qismini element o'z qo'shnilariga nisbatan egallashi kerakligini ko'rsatuvchi birliksiz sondir. Ijobiy bo'sh joy flex konteyner barcha elementlarining `flex-basis` qiymatlari yig'indisidan kattaroq bo'lganda mavjud bo'ladi.
- Standart qiymati
0
bo'lib, bu elementlarning sukut bo'yicha kengaymasligini anglatadi. - Agar barcha elementlarda
flex-grow: 1
bo'lsa, qolgan bo'sh joy ular o'rtasida teng taqsimlanadi. - Agar bitta elementda
flex-grow: 2
va boshqalaridaflex-grow: 1
bo'lsa, birinchi element mavjud bo'sh joyning boshqalarga qaraganda ikki baravar ko'p qismini oladi.
3. `flex-shrink`: Salbiy Bo'sh Joyni Bo'shatish
flex-shrink
xususiyati flex-grow
'ning teskarisidir. Bu konteyner barcha elementlarning `flex-basis`'ini sig'dira olmaydigan darajada kichik bo'lganda, element qanday qilib joy bo'shatishini boshqaradigan birliksiz sondir. Bu ko'pincha uchlikning eng noto'g'ri tushuniladigan qismidir.
- Standart qiymati
1
bo'lib, bu elementlarga kerak bo'lganda sukut bo'yicha qisqarishga ruxsat berilishini anglatadi. - Keng tarqalgan noto'g'ri tushuncha shundaki,
flex-shrink: 2
elementni oddiy ma'noda "ikki baravar tezroq" qisqartiradi. Bu murakkabroq: elementning qisqarish miqdori uning `flex-shrink` omilining `flex-basis`'iga ko'paytmasiga mutanosibdir. Bu muhim tafsilotni keyinroq amaliy misol bilan o'rganamiz.
Flexbox O'lchamini Aniqlash Algoritmi: Qadamma-qadam Tahlil
Endi keling, pardani chetga surib, brauzerning fikrlash jarayonini ko'rib chiqaylik. Garchi rasmiy W3C spetsifikatsiyasi juda texnik va aniq bo'lsa-da, biz asosiy mantiqni bitta flex qatori uchun yanada sodda, ketma-ket modelga soddalashtirishimiz mumkin.
1-qadam: Flex Baza O'lchamlarini va Gipotetik Asosiy O'lchamlarni Aniqlash
Birinchidan, brauzerga har bir element uchun boshlang'ich nuqta kerak. U konteynerdagi har bir element uchun flex baza o'lchamini hisoblaydi. Bu asosan flex-basis
xususiyatining hal qilingan qiymati bilan belgilanadi. Bu flex baza o'lchami keyingi qadamlar uchun elementning "gipotetik asosiy o'lchami"ga aylanadi. Bu elementning o'z qo'shnilari bilan har qanday kelishuvdan oldin ega bo'lishni istagan o'lchamidir.
2-qadam: Flex Konteynerining Asosiy O'lchamini Aniqlash
Keyinchalik, brauzer flex konteynerining o'zining asosiy o'qi bo'ylab o'lchamini aniqlaydi. Bu sizning CSS-dan olingan qat'iy kenglik, ota-onasining foizi yoki o'z kontenti tomonidan ichki o'lchamlangan bo'lishi mumkin. Bu yakuniy, aniq o'lcham flex elementlari ishlashi kerak bo'lgan joy "byudjeti"dir.
3-qadam: Flex Elementlarini Flex Qatorlariga Yig'ish
Shundan so'ng, brauzer elementlarni qanday guruhlashni aniqlaydi. Agar flex-wrap: nowrap
(standart) o'rnatilgan bo'lsa, barcha elementlar bitta qatorning bir qismi hisoblanadi. Agar flex-wrap: wrap
yoki wrap-reverse
faol bo'lsa, brauzer elementlarni bir yoki bir nechta qatorlarga taqsimlaydi. Algoritmning qolgan qismi har bir elementlar qatoriga mustaqil ravishda qo'llaniladi.
4-qadam: Moslashuvchan Uzunliklarni Hal Qilish (Asosiy Mantiq)
Bu algoritmning yuragi bo'lib, haqiqiy o'lcham berish va taqsimlash shu yerda sodir bo'ladi. Bu ikki qismli jarayon.
4a-qism: Bo'sh Joyni Hisoblash
Brauzer flex qatori ichidagi umumiy mavjud bo'sh joyni hisoblaydi. U buni konteynerning asosiy o'lchamidan (2-qadam) barcha elementlarning flex baza o'lchamlari yig'indisini (1-qadam) ayirish orqali amalga oshiradi.
Bo'sh Joy = Konteynerning Asosiy O'lchami - Barcha Elementlarning Flex Baza O'lchamlari Yig'indisi
Bu natija quyidagicha bo'lishi mumkin:
- Ijobiy: Konteynerda elementlarga kerak bo'lganidan ko'proq joy bor. Bu qo'shimcha joy
flex-grow
yordamida taqsimlanadi. - Salbiy: Elementlar birgalikda konteynerdan kattaroq. Bu joy yetishmasligi (toshqin) elementlar o'zlarining
flex-shrink
qiymatlariga muvofiq qisqarishi kerakligini anglatadi. - Nol: Elementlar mukammal mos tushadi. Kengayish yoki qisqarish kerak emas.
4b-qism: Bo'sh Joyni Taqsimlash
Endi brauzer hisoblangan bo'sh joyni taqsimlaydi. Bu takrorlanadigan jarayon, ammo biz mantiqni quyidagicha umumlashtirishimiz mumkin:
- Agar bo'sh joy ijobiy bo'lsa (Kengayish):
- Brauzer qatordagi elementlarning barcha
flex-grow
omillarini yig'adi. - Keyin u ijobiy bo'sh joyni har bir elementga mutanosib ravishda taqsimlaydi. Element oladigan joy miqdori:
(Elementning flex-grow / Barcha flex-grow omillari yig'indisi) * Ijobiy Bo'sh Joy
. - Elementning yakuniy o'lchami uning
flex-basis
va taqsimlangan joydagi ulushining yig'indisiga teng bo'ladi. Bu o'sish elementningmax-width
yokimax-height
xususiyati bilan cheklangan.
- Brauzer qatordagi elementlarning barcha
- Agar bo'sh joy salbiy bo'lsa (Qisqarish):
- Bu murakkabroq qism. Har bir element uchun brauzer uning flex baza o'lchamini
flex-shrink
qiymatiga ko'paytirib, vaznli qisqarish omilini hisoblaydi:Vaznli Qisqarish Omili = Flex Baza O'lchami * flex-shrink
. - Keyin u barcha bu vaznli qisqarish omillarini yig'adi.
- Salbiy joy (toshqin miqdori) har bir elementga ushbu vaznli omilga asoslanib mutanosib ravishda taqsimlanadi. Elementning qisqarish miqdori:
(Elementning Vaznli Qisqarish Omili / Barcha Vaznli Qisqarish Omillari Yig'indisi) * Salbiy Bo'sh Joy
. - Elementning yakuniy o'lchami uning
flex-basis
va taqsimlangan salbiy joydagi ulushining ayirmasiga teng bo'ladi. Bu qisqarish elementningmin-width
yokimin-height
xususiyati bilan cheklangan, bu esa muhim jihatdan sukut bo'yichaauto
ga teng.
- Bu murakkabroq qism. Har bir element uchun brauzer uning flex baza o'lchamini
5-qadam: Asosiy O'q Bo'yicha Tekislash
Barcha elementlarning yakuniy o'lchamlari aniqlangandan so'ng, brauzer elementlarni konteyner ichida asosiy o'q bo'ylab tekislash uchun justify-content
xususiyatidan foydalanadi. Bu barcha o'lcham hisob-kitoblari tugagandan keyin sodir bo'ladi.
Amaliy Stsenariylar: Nazariyadan Haqiqatga
Nazariyani tushunish bir narsa; uni amalda ko'rish esa bilimlarni mustahkamlaydi. Keling, algoritm haqidagi tushunchamiz bilan endi osonlikcha tushuntiriladigan ba'zi keng tarqalgan stsenariylarni ko'rib chiqaylik.
1-stsenariy: Haqiqiy Teng Ustunlar va `flex: 1` Qisqartmasi
Muammo: Siz barcha elementlarga flex-grow: 1
qo'llaysiz, lekin ular teng kenglikka ega bo'lmaydi.
Tushuntirish: Bu siz flex: auto
(bu flex: 1 1 auto
ga kengayadi) kabi qisqartmadan foydalanganingizda yoki shunchaki flex-grow: 1
ni o'rnatib, flex-basis
ni standart auto
holatida qoldirganingizda sodir bo'ladi. Algoritmga ko'ra, flex-basis: auto
elementning kontent o'lchamiga teng bo'ladi. Shunday qilib, ko'proq kontentga ega element kattaroq flex baza o'lchami bilan boshlanadi. Qolgan bo'sh joy teng taqsimlangan bo'lsa-da, elementlarning yakuniy o'lchamlari har xil bo'ladi, chunki ularning boshlang'ich nuqtalari turlicha edi.
Yechim: flex: 1
qisqartmasidan foydalaning. Bu flex: 1 1 0%
ga kengayadi. Asosiy narsa flex-basis: 0%
. Bu har bir elementni gipotetik 0 baza o'lchami bilan boshlashga majbur qiladi. Konteynerning butun kengligi "ijobiy bo'sh joy"ga aylanadi. Barcha elementlar flex-grow: 1
ga ega bo'lgani uchun, bu butun bo'sh joy ular o'rtasida teng taqsimlanadi, natijada kontentidan qat'i nazar, haqiqatan ham teng kenglikdagi ustunlar hosil bo'ladi.
2-stsenariy: `flex-shrink` Mutanosiblik Jumboqlari
Muammo: Sizda ikkita element bor, ikkalasi ham flex-shrink: 1
ga ega, ammo konteyner qisqarganda, bir element boshqasiga qaraganda ancha ko'proq kenglik yo'qotadi.
Tushuntirish: Bu salbiy bo'sh joy uchun 4b-qadamning mukammal namunasidir. Qisqarish faqat flex-shrink
omiliga asoslanmaydi; u elementning flex-basis
qiymati bilan vaznga olinadi. Kattaroq elementning "beradigan" narsasi ko'proq.
500px hajmdagi konteynerni ikkita element bilan ko'rib chiqing:
- A element:
flex: 0 1 400px;
(400px baza o'lchami) - B element:
flex: 0 1 200px;
(200px baza o'lchami)
Umumiy baza o'lchami 600px, bu konteyner uchun 100px ga katta (100px salbiy bo'sh joy).
- A elementning vaznli qisqarish omili:
400px * 1 = 400
- B elementning vaznli qisqarish omili:
200px * 1 = 200
- Umumiy vaznli omillar:
400 + 200 = 600
Endi 100px salbiy bo'sh joyni taqsimlaymiz:
- A element qisqaradi:
(400 / 600) * 100px = ~66.67px
- B element qisqaradi:
(200 / 600) * 100px = ~33.33px
Ikkalasida ham flex-shrink: 1
bo'lishiga qaramay, kattaroq element ikki baravar ko'p kenglik yo'qotdi, chunki uning baza o'lchami ikki baravar katta edi. Algoritm aynan rejalashtirilganidek ishladi.
3-stsenariy: Qisqarmaydigan Element va `min-width: 0` Yechimi
Muammo: Sizda uzun matn (URL kabi) yoki katta rasmga ega element bor va u ma'lum bir o'lchamdan pastga qisqarishni istamaydi, bu esa uning konteynerdan toshib ketishiga sabab bo'ladi.
Tushuntirish: Esda tutingki, qisqarish jarayoni elementning minimal o'lchami bilan cheklangan. Sukut bo'yicha, flex elementlari min-width: auto
ga ega. Matn yoki rasmlarni o'z ichiga olgan element uchun bu auto
qiymati uning ichki minimal o'lchamiga teng bo'ladi. Matn uchun bu ko'pincha eng uzun bo'linmas so'z yoki satrning kengligidir. Flex algoritmi elementni qisqartiradi, ammo u hisoblangan minimal kenglikka yetganda to'xtaydi, agar hali ham yetarli joy bo'lmasa, bu toshib ketishga olib keladi.
Yechim: Elementning o'zining ichki kontent o'lchamidan kichikroq qisqarishiga ruxsat berish uchun siz bu standart xatti-harakatni bekor qilishingiz kerak. Eng keng tarqalgan yechim flex elementga min-width: 0
qo'llashdir. Bu brauzerga: "Agar kerak bo'lsa, bu elementni nol kenglikkacha qisqartirishga ruxsat beraman", deb aytadi va shu bilan toshib ketishning oldini oladi.
Ichki O'lcham Berishning Asosi: `min-content` va `max-content`
Kontentga asoslangan o'lcham berishni to'liq tushunish uchun biz ikkita bog'liq kalit so'zni tezda aniqlab olishimiz kerak:
max-content
: Elementning ichki afzal ko'rilgan kengligi. Matn uchun bu matn cheksiz joyga ega bo'lganda va hech qachon qatorga o'tishi kerak bo'lmaganda egallaydigan kenglikdir.min-content
: Elementning ichki minimal kengligi. Matn uchun bu uning eng uzun bo'linmas satrining (masalan, bitta uzun so'z) kengligidir. Bu uning o'z kontenti toshib ketmasdan erisha oladigan eng kichik o'lchamidir.
flex-basis
auto
bo'lganda va elementning width
qiymati ham auto
bo'lganda, brauzer asosan elementning boshlang'ich flex baza o'lchami sifatida max-content
o'lchamidan foydalanadi. Shuning uchun ko'proq kontentga ega elementlar flex algoritmi bo'sh joyni taqsimlashni boshlashidan oldin ham kattaroq boshlanadi.
Global Oqibatlar va Samaradorlik
Bu kontentga asoslangan yondashuv global auditoriya va samaradorlik uchun muhim bo'lgan ilovalar uchun muhim ahamiyatga ega.
Xalqarolashtirish (i18n) Muhim
Kontentga asoslangan o'lcham berish xalqaro veb-saytlar uchun ikki qirrali qilichdir. Bir tomondan, bu tugma yorliqlari va sarlavhalar uzunligi keskin farq qilishi mumkin bo'lgan turli tillarga maketlarning moslashishiga imkon bergani uchun ajoyib. Boshqa tomondan, bu kutilmagan maket buzilishlariga olib kelishi mumkin.
Masalan, uzun qo'shma so'zlari bilan mashhur nemis tilini olaylik. "Donaudampfschifffahrtsgesellschaftskapitän" kabi so'z elementning min-content
o'lchamini sezilarli darajada oshiradi. Agar bu element flex elementi bo'lsa, u siz maketni qisqaroq inglizcha matn bilan loyihalashtirganingizda kutmagan usullarda qisqarishga qarshilik ko'rsatishi mumkin. Shunga o'xshab, yapon yoki xitoy kabi ba'zi tillarda so'zlar orasida bo'sh joy bo'lmasligi mumkin, bu esa qatorga o'tish va o'lcham berish qanday hisoblanishiga ta'sir qiladi. Bu, hamma uchun, hamma joyda ishlaydigan mustahkam maketlarni yaratish uchun nima uchun ichki algoritmni tushunish juda muhim ekanligining ajoyib namunasidir.
Samaradorlik bo'yicha Eslatmalar
Brauzer flex elementlarining ichki o'lchamlarini hisoblash uchun ularning kontentini o'lchashi kerakligi sababli, hisoblash xarajati mavjud. Aksariyat veb-saytlar va ilovalar uchun bu xarajat ahamiyatsiz va tashvishlanishga arzimaydi. Biroq, minglab elementlarga ega bo'lgan juda murakkab, chuqur joylashtirilgan UI'larda bu maket hisob-kitoblari samaradorlikda to'siq bo'lishi mumkin. Bunday murakkab hollarda, dasturchilar renderlash samaradorligini optimallashtirish uchun contain: layout
yoki content-visibility
kabi CSS xususiyatlarini o'rganishlari mumkin, ammo bu boshqa kunning mavzusi.
Amaliy Maslahatlar: Sizning Flexbox O'lcham Berish bo'yicha Shpargalkangiz
Xulosa qilib aytganda, mana darhol qo'llashingiz mumkin bo'lgan asosiy xulosalar:
- Haqiqatan ham teng kenglikdagi ustunlar uchun: Har doim
flex: 1
(buflex: 1 1 0%
ning qisqartmasi) dan foydalaning. Nolga tengflex-basis
kalit hisoblanadi. - Agar element qisqarmasa: Eng ehtimoliy sabab uning yashirin
min-width: auto
xususiyatidir. Uning kontent o'lchamidan kichikroq qisqarishiga ruxsat berish uchun flex elementgamin-width: 0
qo'llang. - `flex-shrink` vaznga olinganligini unutmang: Kattaroq
flex-basis
ga ega elementlar bir xilflex-shrink
omiliga ega kichikroq elementlarga qaraganda mutlaq ma'noda ko'proq qisqaradi. - `flex-basis` eng muhimi: U barcha o'lcham hisob-kitoblari uchun boshlang'ich nuqtani belgilaydi. Yakuniy maketga eng katta ta'sir ko'rsatish uchun
flex-basis
ni nazorat qiling.auto
dan foydalanish kontentning o'lchamiga bog'liq bo'ladi; aniq qiymatdan foydalanish sizga aniq nazoratni beradi. - Brauzer kabi fikrlang: Qadamlarni tasavvur qiling. Birinchidan, baza o'lchamlarini oling. Keyin, bo'sh joyni (ijobiy yoki salbiy) hisoblang. Nihoyat, o'sha joyni grow/shrink qoidalariga muvofiq taqsimlang.
Xulosa
CSS Flexbox o'lchamini aniqlash algoritmi tasodifiy sehr emas; bu yaxshi aniqlangan, mantiqiy va nihoyatda kuchli kontentdan xabardor tizimdir. Oddiy xususiyat-qiymat juftliklaridan o'tib, asosiy jarayonni tushunish orqali siz maketlarni ishonch va aniqlik bilan bashorat qilish, tuzatish va loyihalash qobiliyatiga ega bo'lasiz.
Keyingi safar flex element o'zini noto'g'ri tutganda, siz taxmin qilishingiz shart bo'lmaydi. Siz aqlan algoritmdan o'tishingiz mumkin: `flex-basis` ni tekshiring, kontentning ichki o'lchamini hisobga oling, bo'sh joyni tahlil qiling va `flex-grow` yoki `flex-shrink` qoidalarini qo'llang. Siz endi nafaqat chiroyli, balki barqaror, kontentning dinamik tabiatiga go'zal moslashadigan UI'larni yaratish uchun bilimga egasiz, u dunyoning qayeridan kelib chiqishidan qat'i nazar.