Avastage CSS Flexboxi vÔimsus, mÔistes selle suuruse algoritmi. See juhend selgitab sisupÔhist suurust, flex-basis, grow, shrink ja levinud paigutuse vÀljakutseid.
Flexboxi suuruse mÀÀramise algoritmi demĂŒstifitseerimine: sĂŒgav sukeldumine sisupĂ”histesse paigutustesse
Kas olete kunagi kasutanud flex: 1
mitme elemendi puhul, oodates tĂ€iuslikult vĂ”rdseid veerge, kuid avastanud, et nende suurused on ikkagi erinevad? VĂ”i olete maadelnud flex-elemendiga, mis kangekaelselt keeldub kahanemast, pĂ”hjustades inetut ĂŒlevoolu, mis rikub teie disaini? Need levinud frustratsioonid viivad arendajad sageli oletuste ja juhuslike omaduste muutmise tsĂŒklisse. Lahendus ei ole aga maagia, vaid loogika.
Vastus neile mĂ”istatustele peitub sĂŒgaval CSS-i spetsifikatsioonis protsessis, mida tuntakse kui Flexboxi sisemise suuruse mÀÀramise algoritmi. See on vĂ”imas, sisuteadlik mootor, mis juhib Flexboxi, kuid selle sisemine loogika vĂ”ib sageli tunduda lĂ€bipaistmatu musta kastina. Selle algoritmi mĂ”istmine on Flexboxi valdamise ja tĂ”eliselt ettearvatavate, vastupidavate kasutajaliideste loomise vĂ”ti.
See juhend on mĂ”eldud arendajatele ĂŒle kogu maailma, kes soovivad Flexboxiga liikuda "katse-eksituse" meetodilt "tahtliku disaini" juurde. Me harutame selle vĂ”imsa algoritmi samm-sammult lahti, muutes segaduse selguseks ja andes teile vĂ”imaluse luua tugevamaid ja globaalselt teadlikumaid paigutusi, mis töötavad mis tahes sisu ja keele puhul.
Fikseeritud pikslitest kaugemale: sisemise vs. vÀlise suuruse mÔistmine
Enne algoritmi endasse sĂŒvenemist on ĂŒlioluline mĂ”ista CSS-i paigutuse pĂ”himĂ”istet: erinevust sisemise ja vĂ€lise suuruse vahel.
- VÀline suurus: See on siis, kui teie, arendaja, mÀÀrate elemendi suuruse selgesÔnaliselt. Omadused nagu
width: 500px
,height: 50%
vÔiwidth: 30rem
on vÀlise suuruse nÀited. Suuruse mÀÀravad tegurid, mis on elemendi sisust vÀljaspool. - Sisemine suurus: See on siis, kui brauser arvutab elemendi suuruse selle sisu pÔhjal. Nupp, mis loomulikult laieneb, et mahutada pikemat tekstisilti, kasutab sisemist suurust. Suuruse mÀÀravad tegurid, mis on elemendi sees.
Flexbox on sisemise, sisupÔhise suuruse meister. Kuigi teie annate reeglid (flex-omadused), teeb brauser lÔplikud suuruse otsused flex-elementide sisu ja konteineris oleva vaba ruumi pÔhjal. Just see teebki selle nii vÔimsaks voolavate, reageerivate disainide loomisel.
Paindlikkuse kolm sammast: meeldetuletus flex-basis
, flex-grow
ja flex-shrink
kohta
Flexboxi algoritmi otsused juhinduvad peamiselt kolmest omadusest, mida sageli mÀÀratakse koos flex
lĂŒhendi abil. Nende kindel mĂ”istmine on jĂ€rgmiste sammude mĂ”istmiseks vĂ€ltimatu.
1. flex-basis
: Stardijoon
MÔelge flex-basis
'ele kui ideaalsele vĂ”i "hĂŒpoteetilisele" algsuurusele piki pĂ”hitelge, enne kui toimub igasugune kasvamine vĂ”i kahanemine. See on baasjoon, millest kĂ”ik muud arvutused lĂ€htuvad.
- See vÔib olla pikkus (nt
100px
,10rem
) vÔi protsent (25%
). - Vaikimisi vÀÀrtus on
auto
. Kui see on seatud vÀÀrtuseleauto
, vaatab brauser esmalt elemendi pÔhimÔÔtme omadust (width
horisontaalse flex-konteineri puhul,height
vertikaalse puhul). - Siin on oluline seos: Kui ka pÔhimÔÔtme omadus on
auto
, lahendatakseflex-basis
elemendi sisemiseks, sisupÔhiseks suuruseks. Nii saab sisu ise suuruse mÀÀramise protsessis kohe algusest peale hÀÀleÔiguse. - Saadaval on ka vÀÀrtus
content
, mis ĂŒtleb brauserile selgesĂ”naliselt, et ta kasutaks sisemist suurust.
2. flex-grow
: Positiivse ruumi hÔivamine
Omadus flex-grow
on ĂŒhikuta arv, mis mÀÀrab, kui suure osa positiivsest vabast ruumist flex-konteineris element peaks endasse imama, vĂ”rreldes oma naaberelementidega. Positiivne vaba ruum tekib siis, kui flex-konteiner on suurem kui kĂ”igi selle elementide `flex-basis` vÀÀrtuste summa.
- Vaikimisi vÀÀrtus on
0
, mis tÀhendab, et elemendid vaikimisi ei kasva. - Kui kÔigil elementidel on
flex-grow: 1
, jaotatakse jĂ€relejÀÀnud ruum nende vahel vĂ”rdselt. - Kui ĂŒhel elemendil on
flex-grow: 2
ja teistelflex-grow: 1
, saab esimene element kaks korda rohkem vaba ruumi kui teised.
3. flex-shrink
: Negatiivsest ruumist loobumine
Omadus flex-shrink
on flex-grow
'i vaste. See on ĂŒhikuta arv, mis reguleerib, kuidas element loobub ruumist, kui konteiner on liiga vĂ€ike, et mahutada kĂ”igi oma elementide `flex-basis` vÀÀrtusi. See on sageli neist kolmest kĂ”ige valesti mĂ”istetud omadus.
- Vaikimisi vÀÀrtus on
1
, mis tÀhendab, et elementidel on vajadusel lubatud vaikimisi kahaneda. - Levinud vÀÀrarusaam on, et
flex-shrink: 2
paneb elemendi lihtsas mĂ”ttes "kaks korda kiiremini" kahanema. Asi on nĂŒansseeritum: elemendi kahanemise suurus on proportsionaalne selle `flex-shrink` teguri ja `flex-basis` korrutisega. Uurime seda olulist detaili hiljem praktilise nĂ€ite varal.
Flexboxi suuruse mÀÀramise algoritm: samm-sammuline ĂŒlevaade
NĂŒĂŒd kergitame saladuskatet ja kĂ€ime lĂ€bi brauseri mĂ”ttekĂ€igu. Kuigi ametlik W3C spetsifikatsioon on vĂ€ga tehniline ja tĂ€pne, saame tuumikloogika lihtsustada seeditavamaks, jĂ€rjestikuseks mudeliks ĂŒhe flex-rea jaoks.
Samm 1: MÀÀrake paindlikud baassuurused ja hĂŒpoteetilised pĂ”himÔÔtmed
Esiteks vajab brauser iga elemendi jaoks lÀhtepunkti. See arvutab iga konteineris oleva elemendi jaoks paindliku baassuuruse. See mÀÀratakse peamiselt flex-basis
omaduse lahendatud vÀÀrtuse jĂ€rgi. See paindlik baassuurus muutub elemendi "hĂŒpoteetiliseks pĂ”himÔÔtmeks" jĂ€rgmiste sammude jaoks. See on suurus, mida element *tahab* olla enne igasugust lĂ€birÀÀkimist oma naaberelementidega.
Samm 2: MÀÀrake paindliku konteineri pÔhimÔÔde
JÀrgmiseks selgitab brauser vÀlja flex-konteineri enda suuruse piki selle pÔhitelge. See vÔib olla teie CSS-ist pÀrit fikseeritud laius, protsent vanemast vÔi see vÔib olla sisemiselt mÀÀratud oma sisu jÀrgi. See lÔplik, kindel suurus on "eelarve" ruumist, millega flex-elemendid peavad töötama.
Samm 3: Koguge paindlikud elemendid paindlikeks ridadeks
SeejÀrel mÀÀrab brauser, kuidas elemente grupeerida. Kui on mÀÀratud flex-wrap: nowrap
(vaikimisi), loetakse kĂ”ik elemendid ĂŒhe rea osaks. Kui on aktiivne flex-wrap: wrap
vÔi wrap-reverse
, jaotab brauser elemendid ĂŒhele vĂ”i mitmele reale. ĂlejÀÀnud algoritmi rakendatakse seejĂ€rel igale elemendireale eraldi.
Samm 4: Lahendage paindlikud pikkused (tuumikloogika)
See on algoritmi sĂŒda, kus toimub tegelik suuruse mÀÀramine ja jaotamine. See on kaheosaline protsess.
Osa 4a: Arvutage vaba ruum
Brauser arvutab kogu saadaoleva vaba ruumi flex-reas. See teeb seda, lahutades konteineri pÔhimÔÔtmest (2. sammust) kÔigi elementide paindlike baassuuruste summa (1. sammust).
Vaba ruum = Konteineri pÔhimÔÔde - KÔigi elementide paindlike baassuuruste summa
See tulemus vÔib olla:
- Positiivne: Konteineris on rohkem ruumi, kui elemendid vajavad. See lisaruum jaotatakse
flex-grow
abil. - Negatiivne: Elemendid on kokku suuremad kui konteiner. See ruumipuudus (ĂŒlevool) tĂ€hendab, et elemendid peavad kahanema vastavalt oma
flex-shrink
vÀÀrtustele. - Null: Elemendid sobivad ideaalselt. Kasvamine ega kahanemine pole vajalik.
Osa 4b: Jaotage vaba ruum
NĂŒĂŒd jaotab brauser arvutatud vaba ruumi. See on iteratiivne protsess, kuid saame loogika kokku vĂ”tta:
- Kui vaba ruum on positiivne (kasvamine):
- Brauser liidab kokku kÔik real olevate elementide
flex-grow
tegurid. - SeejÀrel jaotab see positiivse vaba ruumi igale elemendile proportsionaalselt. Elemendi saadav ruum on:
(Elemendi flex-grow / KÔigi flex-grow tegurite summa) * Positiivne vaba ruum
. - Elemendi lÔplik suurus on selle
flex-basis
pluss selle osa jaotatud ruumist. Seda kasvu piirab elemendimax-width
vÔimax-height
omadus.
- Brauser liidab kokku kÔik real olevate elementide
- Kui vaba ruum on negatiivne (kahanemine):
- See on keerulisem osa. Iga elemendi jaoks arvutab brauser kaalutud kahanemisteguri, korrutades selle paindliku baassuuruse selle
flex-shrink
vÀÀrtusega:Kaalutud kahanemistegur = Paindlik baassuurus * flex-shrink
. - SeejÀrel liidab see kÔik need kaalutud kahanemistegurid kokku.
- Negatiivne ruum (ĂŒlevoolu suurus) jaotatakse igale elemendile proportsionaalselt selle kaalutud teguri alusel. Elemendi kahanemise suurus on:
(Elemendi kaalutud kahanemistegur / KÔigi kaalutud kahanemistegurite summa) * Negatiivne vaba ruum
. - Elemendi lÔplik suurus on selle
flex-basis
miinus selle osa jaotatud negatiivsest ruumist. Seda kahanemist piirab elemendimin-width
vÔimin-height
omadus, mis oluliselt vaikimisi onauto
.
- See on keerulisem osa. Iga elemendi jaoks arvutab brauser kaalutud kahanemisteguri, korrutades selle paindliku baassuuruse selle
Samm 5: PÔhitelje joondamine
Kui kÔigi elementide lÔplikud suurused on kindlaks mÀÀratud, kasutab brauser justify-content
omadust elementide joondamiseks piki pÔhitelge konteineri sees. See juhtub *pÀrast* kÔigi suuruse arvutuste lÔpuleviimist.
Praktilised stsenaariumid: teooriast tegelikkusesse
Teooria mĂ”istmine on ĂŒks asi; selle tegevuses nĂ€gemine kinnistab teadmisi. Vaatame mĂ”ningaid levinud stsenaariume, mida on nĂŒĂŒd meie algoritmi mĂ”istmisega lihtne seletada.
Stsenaarium 1: TÔeliselt vÔrdsed veerud ja flex: 1
lĂŒhend
Probleem: Rakendate kÔigile elementidele flex-grow: 1
, kuid need ei saa vÔrdse laiusega.
Selgitus: See juhtub, kui kasutate lĂŒhendit nagu flex: auto
(mis laieneb vÀÀrtusele flex: 1 1 auto
) vÔi mÀÀrate lihtsalt flex-grow: 1
, jÀttes flex-basis
selle vaikimisi vÀÀrtusele auto
. Algoritmi kohaselt lahendatakse flex-basis: auto
elemendi sisu suuruseks. Seega alustab suurema sisuga element suurema paindliku baassuurusega. Kuigi jÀrelejÀÀnud vaba ruum jaotatakse vÔrdselt, on elementide lÔplikud suurused erinevad, kuna nende lÀhtepunktid olid erinevad.
Lahendus: Kasutage lĂŒhendit flex: 1
. See laieneb vÀÀrtusele flex: 1 1 0%
. VÔti on flex-basis: 0%
. See sunnib iga elementi alustama hĂŒpoteetilise baassuurusega 0. Kogu konteineri laius muutub "positiivseks vabaks ruumiks". Kuna kĂ”igil elementidel on flex-grow: 1
, jaotatakse see kogu ruum nende vahel vÔrdselt, tulemuseks on tÔeliselt vÔrdse laiusega veerud, sÔltumata nende sisust.
Stsenaarium 2: flex-shrink
proportsionaalsuse mÔistatus
Probleem: Teil on kaks elementi, mÔlemal flex-shrink: 1
, kuid kui konteiner kahaneb, kaotab ĂŒks element palju rohkem laiust kui teine.
Selgitus: See on tÀiuslik nÀide 4b sammust negatiivse ruumi puhul. Kahanemine ei pÔhine ainult flex-shrink
teguril; seda kaalutakse elemendi flex-basis
'ega. Suuremal elemendil on rohkem, mida "Ă€ra anda".
Vaatleme 500px konteinerit kahe elemendiga:
- Element A:
flex: 0 1 400px;
(400px baassuurus) - Element B:
flex: 0 1 200px;
(200px baassuurus)
Kogubaassuurus on 600px, mis on konteineri jaoks 100px liiga suur (100px negatiivset ruumi).
- Elemendi A kaalutud kahanemistegur:
400px * 1 = 400
- Elemendi B kaalutud kahanemistegur:
200px * 1 = 200
- Kaalutud tegurite summa:
400 + 200 = 600
NĂŒĂŒd jaotame 100px negatiivset ruumi:
- Element A kahaneb:
(400 / 600) * 100px = ~66.67px
- Element B kahaneb:
(200 / 600) * 100px = ~33.33px
Kuigi mÔlemal oli flex-shrink: 1
, kaotas suurem element kaks korda rohkem laiust, sest selle baassuurus oli kaks korda suurem. Algoritm kÀitus tÀpselt nii, nagu ette nÀhtud.
Stsenaarium 3: Mittekahanev element ja min-width: 0
lahendus
Probleem: Teil on element pika tekstireaga (nagu URL) vĂ”i suure pildiga ja see keeldub kahanemast alla teatud suuruse, pĂ”hjustades ĂŒlevoolu konteinerist.
Selgitus: Pidage meeles, et kahanemisprotsessi piirab elemendi minimaalne suurus. Vaikimisi on flex-elementidel min-width: auto
. Teksti vÔi pilte sisaldava elemendi puhul lahendatakse see auto
vÀÀrtus selle sisemiseks miinimumsuuruseks. Teksti puhul on see sageli kĂ”ige pikema murdmatu sĂ”na vĂ”i stringi laius. Flex-algoritm kahandab elementi, kuid peatub, kui jĂ”uab selle arvutatud miinimumlaiuseni, mis pĂ”hjustab ĂŒlevoolu, kui ruumi ikka veel ei piisa.
Lahendus: Et lubada elemendil kahaneda vĂ€iksemaks kui selle sisemine sisu suurus, peate selle vaikimisi kĂ€itumise ĂŒle kirjutama. KĂ”ige levinum lahendus on rakendada flex-elemendile min-width: 0
. See ĂŒtleb brauserile: "Teil on minu luba kahandada see element vajadusel kuni nulli laiuseni," vĂ€ltides seega ĂŒlevoolu.
Sisemise suuruse sĂŒda: min-content
ja max-content
Et sisupÔhist suuruse mÀÀramist tÀielikult mÔista, peame kiiresti defineerima kaks seotud mÀrksÔna:
max-content
: Elemendi sisemine eelistatud laius. Teksti puhul on see laius, mille tekst vÔtaks, kui tal oleks lÔputult ruumi ja ta ei peaks kunagi reamurdmist tegema.min-content
: Elemendi sisemine miinimumlaius. Teksti puhul on see selle pikima murdmatu stringi laius (nt ĂŒks pikk sĂ”na). See on vĂ€ikseim, milleni see saab minna, ilma et selle enda sisu ĂŒle voolaks.
Kui flex-basis
on auto
ja elemendi width
on samuti auto
, kasutab brauser sisuliselt max-content
suurust elemendi algse paindliku baassuurusena. SeetÔttu on suurema sisuga elemendid suuremad juba enne, kui flex-algoritm hakkab vaba ruumi jaotama.
Globaalsed mÔjud ja jÔudlus
Sellel sisupÔhisel lÀhenemisel on olulised kaalutlused globaalsele publikule ja jÔudluskriitilistele rakendustele.
Rahvusvahelistamine (i18n) on oluline
SisupĂ”hine suuruse mÀÀramine on rahvusvaheliste veebisaitide jaoks kahe teraga mÔÔk. Ăhest kĂŒljest on see fantastiline, vĂ”imaldades paigutustel kohaneda erinevate keeltega, kus nuppude sildid ja pealkirjad vĂ”ivad pikkuselt drastiliselt erineda. Teisest kĂŒljest vĂ”ib see pĂ”hjustada ootamatuid paigutuse katkemisi.
MÔelge saksa keelele, mis on kuulus oma pikkade liitsÔnade poolest. SÔna nagu "DonaudampfschifffahrtsgesellschaftskapitÀn" suurendab oluliselt elemendi min-content
suurust. Kui see element on flex-element, vĂ”ib see kahanemisele vastu seista viisil, mida te lĂŒhema ingliskeelse tekstiga paigutust kujundades ei osanud oodata. Samamoodi ei pruugi mĂ”nedes keeltes nagu jaapani vĂ”i hiina keel olla sĂ”nade vahel tĂŒhikuid, mis mĂ”jutab reamurdmise ja suuruse arvutamist. See on tĂ€iuslik nĂ€ide sellest, miks sisemise algoritmi mĂ”istmine on ĂŒlioluline, et luua paigutusi, mis on piisavalt tugevad, et töötada kĂ”igi jaoks, kĂ”ikjal.
MÀrkused jÔudluse kohta
Kuna brauser peab mÔÔtma flex-elementide sisu nende sisemiste suuruste arvutamiseks, on sellel arvutuslik kulu. Enamiku veebisaitide ja rakenduste puhul on see kulu tĂŒhine ja muretsemist mitte vÀÀrt. Kuid vĂ€ga keerulistes, sĂŒgavalt pesastatud tuhandete elementidega kasutajaliidestes vĂ”ivad need paigutuse arvutused muutuda jĂ”udluse pudelikaelaks. Sellistel edasijĂ”udnud juhtudel vĂ”ivad arendajad uurida CSS-i omadusi nagu contain: layout
vÔi content-visibility
renderdamise jÔudluse optimeerimiseks, kuid see on teema teiseks pÀevaks.
Rakendatavad teadmised: Teie Flexboxi suuruse spikker
KokkuvÔtteks on siin peamised jÀreldused, mida saate kohe rakendada:
- TÔeliselt vÔrdse laiusega veergude jaoks: Kasutage alati
flex: 1
(mis on lĂŒhend vÀÀrtusestflex: 1 1 0%
). NullvÀÀrtusegaflex-basis
on vĂ”ti. - Kui element ei kahane: KĂ”ige tĂ”enĂ€olisem sĂŒĂŒdlane on selle kaudne
min-width: auto
. Rakendage flex-elemendilemin-width: 0
, et lubada sellel kahaneda alla oma sisu suuruse. - Pidage meeles, et `flex-shrink` on kaalutud: Suurema
flex-basis
'ega elemendid kahanevad absoluutarvudes rohkem kui vÀiksemad elemendid samaflex-shrink
teguriga. - `flex-basis` on kuningas: See seab lÀhtepunkti kÔigile suuruse arvutustele. Kontrollige
flex-basis
't, et omada suurimat mÔju lÔplikule paigutusele.auto
kasutamine delegeerib sisu suurusele; konkreetse vÀÀrtuse kasutamine annab teile selgesÔnalise kontrolli. - MÔelge nagu brauser: Visualiseerige samme. Esmalt hankige baassuurused. SeejÀrel arvutage vaba ruum (positiivne vÔi negatiivne). LÔpuks jaotage see ruum vastavalt kasvu/kahanemise reeglitele.
KokkuvÔte
CSS Flexboxi suuruse mÀÀramise algoritm ei ole suvaline maagia; see on hĂ€sti defineeritud, loogiline ja uskumatult vĂ”imas sisuteadlik sĂŒsteem. Liikudes mööda lihtsatest omaduse-vÀÀrtuse paaridest ja mĂ”istes aluseks olevat protsessi, saate vĂ”ime ennustada, siluda ja arhitektuurida paigutusi enesekindluse ja tĂ€psusega.
JĂ€rgmine kord, kui flex-element kĂ€itub valesti, ei pea te arvama. Saate vaimselt samm-sammult algoritmi lĂ€bi kĂ€ia: kontrollige `flex-basis`'t, arvestage sisu sisemist suurust, analĂŒĂŒsige vaba ruumi ja rakendage `flex-grow` vĂ”i `flex-shrink` reegleid. Teil on nĂŒĂŒd teadmised, et luua kasutajaliideseid, mis ei ole mitte ainult elegantsed, vaid ka vastupidavad, kohandudes kaunilt sisu dĂŒnaamilise olemusega, olenemata sellest, kust maailma nurgast see pĂ€rineb.