Odklenite moč CSS Flexboxa z razumevanjem njegovega algoritma za določanje velikosti. Ta vodnik pojasnjuje določanje velikosti na osnovi vsebine, flex-basis, grow, shrink in pogoste izzive pri postavitvah.
Demistifikacija algoritma za določanje velikosti Flexbox: Poglobljen vpogled v postavitve na osnovi vsebine
Ste kdaj uporabili flex: 1
na skupini elementov in pričakovali popolnoma enake stolpce, nato pa ugotovili, da so njihove velikosti še vedno različne? Ali ste se kdaj borili s flex elementom, ki se trmasto ni hotel skrčiti in je povzročil grdo prelivanje, ki je uničilo vaš dizajn? Te pogoste frustracije razvijalce pogosto vodijo v krog ugibanj in naključnega spreminjanja lastnosti. Rešitev pa ni čarovnija, temveč logika.
Odgovor na te uganke se skriva globoko v specifikaciji CSS, v procesu, znanem kot intrinzični algoritem za določanje velikosti Flexbox. To je močan mehanizem, ki se zaveda vsebine in poganja Flexbox, vendar se njegova notranja logika pogosto zdi kot nepregledna črna škatla. Razumevanje tega algoritma je ključ do obvladovanja Flexboxa in gradnje resnično predvidljivih in odpornih uporabniških vmesnikov.
Ta vodnik je namenjen razvijalcem po vsem svetu, ki želijo pri delu s Flexboxom preiti od "poskusov in napak" k "načrtnemu oblikovanju". Ta močan algoritem bomo razčlenili korak za korakom, zmedo spremenili v jasnost in vas opolnomočili za gradnjo robustnejših in globalno ozaveščenih postavitev, ki delujejo za kakršno koli vsebino v katerem koli jeziku.
Onkraj fiksnih pikslov: Razumevanje intrinzičnega in ekstrinzičnega določanja velikosti
Preden se poglobimo v sam algoritem, je ključnega pomena razumeti temeljni koncept postavitve v CSS: razliko med intrinzičnim in ekstrinzičnim določanjem velikosti.
- Ekstrinzično določanje velikosti: To je, ko vi, razvijalec, izrecno določite velikost elementa. Lastnosti, kot so
width: 500px
,height: 50%
aliwidth: 30rem
, so primeri ekstrinzičnega določanja velikosti. Velikost je določena z dejavniki, ki so zunanji vsebini elementa. - Intrinzično določanje velikosti: To je, ko brskalnik izračuna velikost elementa na podlagi vsebine, ki jo vsebuje. Gumb, ki se naravno razširi, da sprejme daljši napis, uporablja intrinzično določanje velikosti. Velikost je določena z dejavniki, ki so notranji elementu.
Flexbox je mojster intrinzičnega določanja velikosti na osnovi vsebine. Medtem ko vi določite pravila (lastnosti flex), brskalnik sprejme končne odločitve o velikosti na podlagi vsebine flex elementov in razpoložljivega prostora v vsebniku. Prav to ga dela tako močnega za ustvarjanje tekočih, odzivnih dizajnov.
Trije stebri prilagodljivosti: Osvežitev znanja o `flex-basis`, `flex-grow` in `flex-shrink`
Odločitve algoritma Flexbox v glavnem vodijo tri lastnosti, ki se pogosto nastavijo skupaj z okrajšavo flex
. Trdno razumevanje teh lastnosti je nujno za razumevanje naslednjih korakov.
1. `flex-basis`: Izhodiščna črta
Predstavljajte si flex-basis
kot idealno ali "hipotetično" začetno velikost flex elementa vzdolž glavne osi, preden pride do kakršnega koli povečevanja ali zmanjševanja. To je osnova, iz katere se izvajajo vsi ostali izračuni.
- Lahko je dolžina (npr.
100px
,10rem
) ali odstotek (25%
). - Privzeta vrednost je
auto
. Ko je nastavljena naauto
, brskalnik najprej preveri glavno lastnost velikosti elementa (width
za vodoravni flex vsebnik,height
za navpičnega). - Tukaj je ključna povezava: Če je tudi glavna lastnost velikosti tudi
auto
, seflex-basis
razreši v intrinzično velikost elementa, ki temelji na vsebini. Na ta način vsebina sama že od samega začetka sodeluje v procesu določanja velikosti. - Na voljo je tudi vrednost
content
, ki brskalniku izrecno naroči, naj uporabi intrinzično velikost.
2. `flex-grow`: Prisvajanje pozitivnega prostora
Lastnost flex-grow
je število brez enote, ki določa, koliko pozitivnega prostega prostora v flex vsebniku naj element absorbira v primerjavi s svojimi sorodniki. Pozitiven prosti prostor obstaja, ko je flex vsebnik večji od vsote vrednosti `flex-basis` vseh njegovih elementov.
- Privzeta vrednost je
0
, kar pomeni, da se elementi privzeto ne bodo povečevali. - Če imajo vsi elementi
flex-grow: 1
, se preostali prostor enakomerno porazdeli mednje. - Če ima en element
flex-grow: 2
, ostali paflex-grow: 1
, bo prvi element prejel dvakrat več razpoložljivega prostega prostora kot ostali.
3. `flex-shrink`: Odstopanje negativnega prostora
Lastnost flex-shrink
je nasprotje flex-grow
. To je število brez enote, ki določa, kako element odstopi prostor, ko je vsebnik premajhen, da bi sprejel flex-basis
vseh svojih elementov. To je pogosto najmanj razumljena od treh lastnosti.
- Privzeta vrednost je
1
, kar pomeni, da se elementi lahko po potrebi privzeto skrčijo. - Pogosta napačna predstava je, da
flex-shrink: 2
povzroči, da se element skrči "dvakrat hitreje" v preprostem smislu. Stvar je bolj zapletena: količina, za katero se element skrči, je sorazmerna z njegovim faktorjemflex-shrink
, pomnoženim z njegovimflex-basis
. To ključno podrobnost bomo raziskali s praktičnim primerom kasneje.
Algoritem za določanje velikosti Flexbox: Razčlenitev po korakih
Sedaj pa odgrnimo zaveso in si poglejmo miselni proces brskalnika. Čeprav je uradna specifikacija W3C zelo tehnična in natančna, lahko jedro logike poenostavimo v bolj razumljiv, zaporedni model za eno samo flex vrstico.
Korak 1: Določitev osnovnih velikosti Flex in hipotetičnih glavnih velikosti
Najprej brskalnik potrebuje izhodišče za vsak element. Izračuna osnovno velikost flex za vsak element v vsebniku. Ta je primarno določena z razrešeno vrednostjo lastnosti flex-basis
. Ta osnovna velikost flex postane "hipotetična glavna velikost" elementa za naslednje korake. To je velikost, ki jo element *želi* imeti pred kakršnimi koli pogajanji s svojimi sorodniki.
Korak 2: Določitev glavne velikosti flex vsebnika
Nato brskalnik ugotovi velikost samega flex vsebnika vzdolž njegove glavne osi. To je lahko fiksna širina iz vašega CSS-ja, odstotek njegovega starša ali pa je lahko intrinzično določena z lastno vsebino. Ta končna, dokončna velikost je "proračun" prostora, s katerim morajo delati flex elementi.
Korak 3: Zbiranje flex elementov v flex vrstice
Brskalnik nato določi, kako združiti elemente. Če je nastavljeno flex-wrap: nowrap
(privzeto), se vsi elementi štejejo za del ene same vrstice. Če je aktivno flex-wrap: wrap
ali wrap-reverse
, brskalnik porazdeli elemente v eno ali več vrstic. Preostanek algoritma se nato uporabi za vsako vrstico elementov posebej.
Korak 4: Razrešitev prilagodljivih dolžin (Jedro logike)
To je srce algoritma, kjer se zgodi dejansko določanje velikosti in porazdelitev. To je dvodelni proces.
Del 4a: Izračun prostega prostora
Brskalnik izračuna skupni razpoložljivi prosti prostor znotraj flex vrstice. To stori tako, da odšteje vsoto vseh osnovnih velikosti flex elementov (iz 1. koraka) od glavne velikosti vsebnika (iz 2. koraka).
Prosti prostor = Glavna velikost vsebnika - vsota vseh osnovnih velikosti Flex elementov
Ta rezultat je lahko:
- Pozitiven: Vsebnik ima več prostora, kot ga elementi potrebujejo. Ta dodatni prostor bo porazdeljen z uporabo
flex-grow
. - Negativen: Elementi so skupaj večji od vsebnika. Ta primanjkljaj prostora (prelivanje) pomeni, da se morajo elementi skrčiti v skladu s svojimi vrednostmi
flex-shrink
. - Nič: Elementi se popolnoma prilegajo. Povečevanje ali krčenje ni potrebno.
Del 4b: Porazdelitev prostega prostora
Sedaj brskalnik porazdeli izračunani prosti prostor. To je iterativen proces, vendar lahko logiko povzamemo:
- Če je prosti prostor pozitiven (povečevanje):
- Brskalnik sešteje vse faktorje
flex-grow
elementov v vrstici. - Nato sorazmerno porazdeli pozitivni prosti prostor vsakemu elementu. Količina prostora, ki jo prejme element, je:
(flex-grow elementa / vsota vseh faktorjev flex-grow) * pozitivni prosti prostor
. - Končna velikost elementa je njegov
flex-basis
plus njegov delež porazdeljenega prostora. To povečanje je omejeno z lastnostjomax-width
alimax-height
elementa.
- Brskalnik sešteje vse faktorje
- Če je prosti prostor negativen (krčenje):
- To je bolj zapleten del. Za vsak element brskalnik izračuna utežen faktor krčenja tako, da pomnoži njegovo osnovno velikost flex z njegovo vrednostjo
flex-shrink
:Utežen faktor krčenja = osnovna velikost flex * flex-shrink
. - Nato sešteje vse te utežene faktorje krčenja.
- Negativni prostor (količina prelivanja) se porazdeli vsakemu elementu sorazmerno na podlagi tega uteženega faktorja. Količina, za katero se element skrči, je:
(utežen faktor krčenja elementa / vsota vseh uteženih faktorjev krčenja) * negativni prosti prostor
. - Končna velikost elementa je njegov
flex-basis
minus njegov delež porazdeljenega negativnega prostora. To krčenje je omejeno z lastnostjomin-width
alimin-height
elementa, ki ima ključno privzeto vrednostauto
.
- To je bolj zapleten del. Za vsak element brskalnik izračuna utežen faktor krčenja tako, da pomnoži njegovo osnovno velikost flex z njegovo vrednostjo
Korak 5: Poravnava po glavni osi
Ko so končne velikosti vseh elementov določene, brskalnik uporabi lastnost justify-content
za poravnavo elementov vzdolž glavne osi znotraj vsebnika. To se zgodi *po* končanih vseh izračunih velikosti.
Praktični scenariji: Od teorije do realnosti
Razumevanje teorije je eno; videti jo v praksi utrdi znanje. Poglejmo si nekaj pogostih scenarijev, ki jih je z našim razumevanjem algoritma zdaj enostavno pojasniti.
Scenarij 1: Resnično enaki stolpci in okrajšava `flex: 1`
Problem: Uporabite flex-grow: 1
za vse elemente, vendar na koncu nimajo enakih širin.
Pojasnilo: To se zgodi, ko uporabite okrajšavo, kot je flex: auto
(kar se razširi v flex: 1 1 auto
) ali pa samo nastavite flex-grow: 1
, medtem ko flex-basis
pustite na privzeti vrednosti auto
. Po algoritmu se flex-basis: auto
razreši v velikost vsebine elementa. Torej, element z več vsebine začne z večjo osnovno velikostjo flex. Čeprav se preostali prosti prostor porazdeli enakomerno, bodo končne velikosti elementov različne, ker so bila njihova izhodišča različna.
Rešitev: Uporabite okrajšavo flex: 1
. To se razširi v flex: 1 1 0%
. Ključ je flex-basis: 0%
. To prisili vsak element, da začne s hipotetično osnovno velikostjo 0. Celotna širina vsebnika postane "pozitiven prosti prostor". Ker imajo vsi elementi flex-grow: 1
, se celoten prostor enakomerno porazdeli mednje, kar povzroči resnično enako široke stolpce ne glede na njihovo vsebino.
Scenarij 2: Uganka sorazmernosti `flex-shrink`
Problem: Imate dva elementa, oba z flex-shrink: 1
, a ko se vsebnik skrči, en element izgubi veliko več širine kot drugi.
Pojasnilo: To je popolna ilustracija koraka 4b za negativni prostor. Krčenje ne temelji samo na faktorju flex-shrink
; uteženo je z flex-basis
elementa. Večji element ima več za "odstopiti".
Poglejmo 500px širok vsebnik z dvema elementoma:
- Element A:
flex: 0 1 400px;
(osnovna velikost 400px) - Element B:
flex: 0 1 200px;
(osnovna velikost 200px)
Skupna osnovna velikost je 600px, kar je za 100px preveč za vsebnik (100px negativnega prostora).
- Utežen faktor krčenja elementa A:
400px * 1 = 400
- Utežen faktor krčenja elementa B:
200px * 1 = 200
- Skupni uteženi faktorji:
400 + 200 = 600
Sedaj porazdelimo 100px negativnega prostora:
- Element A se skrči za:
(400 / 600) * 100px = ~66.67px
- Element B se skrči za:
(200 / 600) * 100px = ~33.33px
Čeprav sta oba imela flex-shrink: 1
, je večji element izgubil dvakrat več širine, ker je bila njegova osnovna velikost dvakrat večja. Algoritem se je obnašal točno tako, kot je bilo zasnovano.
Scenarij 3: Neskrčljiv element in rešitev `min-width: 0`
Problem: Imate element z dolgim nizom besedila (kot je URL) ali veliko sliko, in se noče skrčiti pod določeno velikost, kar povzroči prelivanje iz vsebnika.
Pojasnilo: Ne pozabite, da je proces krčenja omejen z minimalno velikostjo elementa. Privzeto imajo flex elementi min-width: auto
. Za element, ki vsebuje besedilo ali slike, se ta vrednost auto
razreši v njegovo intrinzično minimalno velikost. Za besedilo je to pogosto širina najdaljše nelomljive besede ali niza. Algoritem flex bo skrčil element, vendar se bo ustavil, ko bo dosegel to izračunano minimalno širino, kar vodi do prelivanja, če še vedno ni dovolj prostora.
Rešitev: Da bi elementu omogočili, da se skrči manj od svoje intrinzične velikosti vsebine, morate to privzeto obnašanje preglasiti. Najpogostejši popravek je uporaba min-width: 0
na flex elementu. To brskalniku sporoči: "Imaš moje dovoljenje, da ta element po potrebi skrčiš vse do ničelne širine," s čimer se prepreči prelivanje.
Srce intrinzičnega določanja velikosti: `min-content` in `max-content`
Da bi v celoti razumeli določanje velikosti na osnovi vsebine, moramo na hitro opredeliti dve povezani ključni besedi:
max-content
: Intrinzična prednostna širina elementa. Za besedilo je to širina, ki bi jo besedilo zavzelo, če bi imelo neskončno prostora in se mu nikoli ne bi bilo treba prelomiti.min-content
: Intrinzična minimalna širina elementa. Za besedilo je to širina njegovega najdaljšega nelomljivega niza (npr. ene same dolge besede). To je najmanjša velikost, ki jo lahko doseže, ne da bi se njegova lastna vsebina prelila.
Ko je flex-basis
nastavljen na auto
in je tudi width
elementa auto
, brskalnik v bistvu uporabi velikost max-content
kot začetno osnovno velikost flex elementa. Zato elementi z več vsebine začnejo kot večji, še preden algoritem flex sploh začne porazdeljevati prosti prostor.
Globalne posledice in zmogljivost
Ta pristop, ki ga poganja vsebina, ima pomembne posledice za globalno občinstvo in za aplikacije, kjer je zmogljivost ključnega pomena.
Internacionalizacija (i18n) je pomembna
Določanje velikosti na osnovi vsebine je dvorezen meč za mednarodne spletne strani. Po eni strani je fantastično, saj omogoča, da se postavitve prilagajajo različnim jezikom, kjer se lahko napisi na gumbih in naslovi drastično razlikujejo po dolžini. Po drugi strani pa lahko povzroči nepričakovane prelome postavitve.
Poglejmo nemški jezik, ki je znan po dolgih zloženkah. Beseda, kot je "Donaudampfschifffahrtsgesellschaftskapitän", znatno poveča velikost min-content
elementa. Če je ta element flex element, se morda upira krčenju na načine, ki jih niste pričakovali, ko ste oblikovali postavitev s krajšim angleškim besedilom. Podobno nekateri jeziki, kot sta japonščina ali kitajščina, morda nimajo presledkov med besedami, kar vpliva na izračun prelivanja in določanja velikosti. To je odličen primer, zakaj je razumevanje intrinzičnega algoritma ključnega pomena za gradnjo postavitev, ki so dovolj robustne, da delujejo za vse in povsod.
Opombe o zmogljivosti
Ker mora brskalnik izmeriti vsebino flex elementov za izračun njihovih intrinzičnih velikosti, to predstavlja določeno računsko obremenitev. Za večino spletnih strani in aplikacij je ta obremenitev zanemarljiva in ni vredna skrbi. Vendar pa lahko v zelo kompleksnih, globoko ugnezdenih uporabniških vmesnikih z tisoči elementov ti izračuni postavitve postanejo ozko grlo zmogljivosti. V takšnih naprednih primerih lahko razvijalci raziščejo lastnosti CSS, kot sta contain: layout
ali content-visibility
, da optimizirajo zmogljivost upodabljanja, vendar je to tema za kdaj drugič.
Praktični vpogledi: Vaš plonk listek za določanje velikosti s Flexboxom
Za povzetek so tukaj ključni poudarki, ki jih lahko takoj uporabite:
- Za resnično enako široke stolpce: Vedno uporabite
flex: 1
(kar je okrajšava zaflex: 1 1 0%
). Ključ jeflex-basis
z vrednostjo nič. - Če se element noče skrčiti: Najverjetnejši krivec je njegova implicitna vrednost
min-width: auto
. Uporabitemin-width: 0
na flex elementu, da mu omogočite krčenje pod velikost njegove vsebine. - Ne pozabite, da je `flex-shrink` utežen: Elementi z večjim
flex-basis
se bodo v absolutnem smislu skrčili bolj kot manjši elementi z istim faktorjemflex-shrink
. - `flex-basis` je kralj: Določa izhodišče za vse izračune velikosti. Nadzorujte
flex-basis
, da boste imeli največji vpliv na končno postavitev. Uporabaauto
se prepusti velikosti vsebine; uporaba določene vrednosti vam daje izrecen nadzor. - Mislite kot brskalnik: Vizualizirajte korake. Najprej določite osnovne velikosti. Nato izračunajte prosti prostor (pozitiven ali negativen). Na koncu ta prostor porazdelite v skladu s pravili za povečevanje/krčenje.
Zaključek
Algoritem za določanje velikosti CSS Flexbox ni samovoljna čarovnija; je dobro opredeljen, logičen in neverjetno močan sistem, ki se zaveda vsebine. S preseganjem preprostih parov lastnost-vrednost in razumevanjem osnovnega procesa pridobite sposobnost predvidevanja, odpravljanja napak in arhitekture postavitev z zaupanjem in natančnostjo.
Naslednjič, ko se bo flex element obnašal neprimerno, vam ne bo treba ugibati. Mentalno lahko preidete skozi algoritem: preverite flex-basis
, upoštevajte intrinzično velikost vsebine, analizirajte prosti prostor in uporabite pravila flex-grow
ali flex-shrink
. Zdaj imate znanje za ustvarjanje uporabniških vmesnikov, ki niso le elegantni, ampak tudi odporni in se lepo prilagajajo dinamični naravi vsebine, ne glede na to, od kod na svetu prihaja.