Pozadie
Modul Flexbox Layout
(Flexibilná skrinka) (odporúčanie kandidáta W3C z októbra 2017) má za cieľ poskytnúť efektívnejší spôsob rozloženia, zarovnania a rozloženia priestoru medzi položkami v kontajneri, aj keď je ich veľkosť neznáma a / alebo dynamická (teda slovo „flex“).
Hlavnou myšlienkou flexibilného rozloženia je dať kontajneru schopnosť meniť šírku / výšku (a poradie) svojich položiek tak, aby čo najlepšie vyplnili dostupný priestor (väčšinou pre všetky druhy zobrazovacích zariadení a veľkostí obrazoviek). Flex kontajner rozširuje položky tak, aby vyplnili dostupné voľné miesto, alebo ich zmenší, aby sa zabránilo pretečeniu.
Najdôležitejšie je, že rozloženie flexboxu je smerovo-agnostické na rozdiel od bežných rozložení (blok, ktorý je zvisle založený a vložený, ktorý je vodorovne založený). Aj keď fungujú dobre pre stránky, chýba im flexibilita (nie je to určené pre slovné hračky) na podporu veľkých alebo zložitých aplikácií (najmä pokiaľ ide o zmenu orientácie, zmenu veľkosti, natiahnutie, zmenšenie atď.).
Poznámka: Rozloženie Flexboxu je najvhodnejšie pre komponenty aplikácie a malé rozloženia, zatiaľ čo rozloženie Mriežka je určené pre rozloženia väčšieho rozsahu.
Základy a terminológia
Pretože flexbox je celý modul a nie jedna vlastnosť, zahŕňa veľa vecí vrátane celej sady ich vlastností. Niektoré z nich sú určené na umiestnenie na kontajner (nadradený prvok, známy ako „flex kontajner“), zatiaľ čo iné sú určené na umiestnenie na deti (uvedené „flex položky“).
Ak je „bežné“ rozloženie založené na blokových aj riadkových smeroch toku, potom je flexibilné rozloženie založené na „smeroch flex-flow“. Pozrite sa prosím na tento obrázok zo špecifikácie a vysvetlite hlavnú myšlienku, ktorá stojí za rozložením flex.
Položky budú rozložené po buď main axis
(od main-start
do main-end
) alebo priečnou osou (z cross-start
k cross-end
).
- hlavná os - Hlavná os flex kontajnera je primárna os, pozdĺž ktorej sú rozložené flex predmety. Pozor, nemusí to byť nevyhnutne horizontálne; záleží to od
flex-direction
nehnuteľnosti (viď nižšie). - hlavný štart | main-end - Položky flexa sa umiestňujú do kontajnera počnúc od main-start a po main-end.
- hlavná veľkosť - šírka alebo výška položky flexa, podľa toho, ktorá je v hlavnej dimenzii, je hlavnou veľkosťou položky. Vlastnosť hlavnej veľkosti položky flex je buď vlastnosť „šírka“ alebo „výška“, podľa toho, ktorá je v hlavnej dimenzii.
- priečna os - Os kolmá na hlavnú os sa nazýva priečna os. Jeho smer závisí od smeru hlavnej osi.
- krížový štart | cross-end - linky Flex sú naplnené položkami a vkladajú sa do kontajnera počnúc stranou cross-start flex kontajnera a smerujúcou k strane cross-end.
- veľkosť kríža - šírka alebo výška položky typu flex, podľa toho, ktorá z nich má rozmer kríža, predstavuje veľkosť kríža položky. Vlastnosťou veľkosti kríža je ktorákoľvek zo „šírky“ alebo „výšky“, ktorá je v krížovej dimenzii.
Získajte plagát!
Často odkazujete na túto príručku? Prilepte kópiu na stenu kancelárie.
Kúpiť plagát

Vlastnosti pre nadradeného
(flex kontajner)
displej
Toto definuje flex kontajner; vložený alebo blokovaný v závislosti od danej hodnoty. Umožňuje flexibilný kontext pre všetky jeho priame deti.
.container ( display: flex; /* or inline-flex */ )
Upozorňujeme, že stĺpce CSS nemajú žiadny vplyv na flex kontajner.
flex-direction
Týmto sa stanoví hlavná os, čím sa definuje smer, ktorým sú položky flex umiestnené do nádoby flex. Flexbox je (okrem voliteľného balenia) koncept jednosmerného usporiadania. Myslite na to, že položky flex sú primárne rozmiestnené buď vo vodorovných riadkoch, alebo vo zvislých stĺpcoch.
.container ( flex-direction: row | row-reverse | column | column-reverse; )
row
(predvolené): zľava doprava dovnútraltr
; sprava doľava dovnútrartl
row-reverse
: sprava doľava dovnútraltr
; zľava doprava dovnútrartl
column
: rovnaké ako,row
ale zhora nadolcolumn-reverse
: rovnaké ako,row-reverse
ale zdola nahor
flex-wrap
Predvolene sa všetky flexibilné položky pokúsia umiestniť na jeden riadok. Môžete to zmeniť a umožniť tejto položke, aby sa položky podľa potreby zabaľovali.
.container ( flex-wrap: nowrap | wrap | wrap-reverse; )
nowrap
(predvolené): všetky flexibilné položky budú na jednom riadkuwrap
: položky flex budú zabalené do viacerých riadkov, zhora nadol.wrap-reverse
: položky flex budú zabalené do viacerých riadkov zdola nahor.
Tu sú niektoré vizuálne ukážky flex-wrap
.
flex-flow
Toto je skratka pre vlastnosti flex-direction
a flex-wrap
, ktoré spoločne definujú hlavnú a priečnu os kontajnera ohybov. Predvolená hodnota je row nowrap
.
.container ( flex-flow: column wrap; )
justify-content
Toto definuje zarovnanie pozdĺž hlavnej osi. Pomáha distribuovať zvyšné voľné miesto, keď sú buď všetky položky flexa na riadku neohybné, alebo sú ohybné, ale dosiahli maximálnu veľkosť. Tiež vynakladá určitú kontrolu nad zarovnaním položiek, keď pretekajú cez čiaru.
.container ( justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right… + safe | unsafe; )
flex-start
(predvolené): položky sú zabalené na začiatku smeru ohybu.flex-end
: položky sú zabalené na konci smeru ohybu.start
: položky sú zabalené na začiatkuwriting-mode
smeru.end
: položky sú zabalené na konciwriting-mode
smeru.left
: predmety sú zabalené k ľavému okraju kontajnera, pokiaľ to nemá zmysel preflex-direction
, potom sa chová akostart
.right
: položky sú balené smerom k pravému okraju kontajnera, pokiaľ to nemá zmysel pre značkuflex-direction
, potom sa správa akoend
.center
: položky sú vycentrované pozdĺž čiaryspace-between
: položky sú rovnomerne rozložené v rade; prvá položka je na začiatočnom riadku, posledná položka na konečnom riadkuspace-around
: položky sú rovnomerne rozložené v rade s rovnakým priestorom okolo nich. Upozorňujeme, že vizuálne nie sú medzery rovnaké, pretože všetky položky majú rovnaký priestor na oboch stranách. Prvá položka bude mať jednu jednotku priestoru oproti okraju kontajnera, ale dve jednotky priestoru medzi ďalšou položkou, pretože táto ďalšia položka má svoje vlastné správne medzery, ktoré sa uplatňujú.space-evenly
: položky sú distribuované tak, aby boli medzery medzi ľubovoľnými dvoma položkami (a medzerou po okraje) rovnaké.
Upozorňujeme, že podpora prehľadávača pre tieto hodnoty je jemná. Napríklad, space-between
nikdy nedostanete podporu z niektorých verzií Edge a start / end / left / right ešte nie sú v Chrome. MDN má podrobné grafy. Najbezpečnejšie sú hodnoty flex-start
, flex-end
a center
.
Existujú aj dve ďalšie kľúčové slová, ktoré môžete spárovať s týmito hodnotami: safe
a unsafe
. Používanie safe
zaisťuje, že aj keď urobíte tento typ pozícií, nemôžete tlačiť na prvok, ktorý vykresľuje mimo obrazovku (napr. Zhora) takým spôsobom, že sa nedá rolovať ani obsah (tzv. Strata dát). .
zarovnať položky
Toto definuje predvolené správanie spôsobu rozloženia flexibilných položiek pozdĺž priečnej osi na aktuálnom riadku. Predstavte si to ako justify-content
verziu pre priečnu os (kolmo na hlavnú os).
.container ( align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end +… safe | unsafe; )
stretch
(predvolené): natiahnutím naplníte kontajner (stále rešpektujte minimálnu a maximálnu šírku)flex-start
/start
/self-start
: položky sú umiestnené na začiatku priečnej osi. Rozdiel medzi nimi je jemný a týka sa rešpektovaniaflex-direction
pravidiel alebowriting-mode
pravidiel.flex-end
/end
/self-end
: položky sú umiestnené na konci priečnej osi. Rozdiel je opäť jemný a týka sa rešpektovaniaflex-direction
pravidiel vs.writing-mode
pravidiel.center
: položky sú vycentrované v priečnej osibaseline
: položky sú zarovnané, napríklad ich základné čiary sú zarovnané
safe
A unsafe
modifikačné kľúčové slová môžu byť použité v spojení so všetkými ostatnými týchto kľúčových slov (aj keď podporné poznámka browser) a zaoberajú sa vám pomôže zabrániť zladenie prvkov tak, že obsah sa stane nedostupným.
align-content
Týmto sa zarovnávajú riadky kontajnera flex, keď je v priečnej osi viac priestoru, podobne ako pri justify-content
zarovnávaní jednotlivých položiek v hlavnej osi.
Poznámka: Táto vlastnosť sa prejaví iba vo viacriadkových flexibilných kontajneroch, kde flex-flow
je nastavená buď wrap
alebo wrap-reverse
). Jednoriadkový flexibilný kontajner (tj. Kde flex-flow
je nastavená predvolená hodnota no-wrap
) nebude odrážať align-content
.
.container ( align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline | first baseline | last baseline +… safe | unsafe; )
normal
(predvolené): položky sa balia na predvolenú pozíciu, akoby nebola nastavená žiadna hodnota.flex-start
/start
: veci zabalené na začiatok kontajnera. (Podporovanejší)flex-start
vyznamenáva,flex-direction
zatiaľ čostart
vyznamenávawriting-mode
smer.flex-end
/end
: veci zabalené na koniec kontajnera. (Väčšia podpora)flex-end
vyznamenáva,flex-direction
zatiaľ čo koniec ctíwriting-mode
smer.center
: predmety umiestnené v strede nádobyspace-between
: položky rovnomerne rozložené; prvý riadok je na začiatku kontajnera, zatiaľ čo posledný je na koncispace-around
: položky rovnomerne rozložené s rovnakým priestorom okolo každého riadkuspace-evenly
: položky sú rovnomerne rozložené s rovnakým priestorom okolo sebastretch
: čiary sa roztiahnu, aby zabrali zvyšné miesto
safe
A unsafe
modifikačné kľúčové slová môžu byť použité v spojení so všetkými ostatnými týchto kľúčových slov (aj keď podporné poznámka browser) a zaoberajú sa vám pomôže zabrániť zladenie prvkov tak, že obsah sa stane nedostupným.
Vlastnosti pre deti
(flexibilné položky)
objednať
Predvolene sú flexibilné položky rozložené v zdrojovej objednávke. Však order
vlastnosť ovláda poradí, v akom sa objavujú v pružnom kontajneri.
.item ( order: 5; /* default is 0 */ )
flex-grow
To definuje schopnosť položky flex rásť, ak je to potrebné. Prijíma bezjednotkovú hodnotu, ktorá slúži ako proporcia. Diktuje, aké množstvo dostupného priestoru vo vnútri flexibilnej nádoby má položka zaberať.
Ak sú všetky položky flex-grow
nastavené na 1, zostávajúci priestor v kontajneri sa rovnomerne rozdelí medzi všetky deti. Ak má jedno z detí hodnotu 2, zostávajúci priestor by zabral dvakrát toľko miesta ako ostatné (alebo sa o to aspoň pokúsi).
.item ( flex-grow: 4; /* default 0 */ )
Záporné čísla sú neplatné.
flex-shrink
Toto definuje schopnosť položky flex sa v prípade potreby zmenšiť.
.item ( flex-shrink: 3; /* default 1 */ )
Záporné čísla sú neplatné.
flex-základ
Toto definuje predvolenú veľkosť prvku pred distribúciou zostávajúceho priestoru. Môže to byť dĺžka (napr. 20%, 5rem atď.) Alebo kľúčové slovo. auto
Kľúčové slovo znamená "Pozrite sa na moje šírku alebo výšku majetku" (ktorý bol dočasne vykonáva pomocou main-size
kľúčového slova do zastarané). Medzi content
kľúčové slovo znamená "veľkosť je založený na obsahu položky" - toto kľúčové slovo nie je dobre podporované doteraz, takže je ťažké skúške a ťažšie vedieť, aké sú jeho bratia max-content
, min-content
a fit-content
robiť.
.item ( flex-basis: | auto; /* default auto */ )
Ak je nastavené na 0
, extra priestor okolo obsahu sa nezapočítava. Ak je nastavené na auto
, extra priestor sa distribuuje na základe jeho flex-grow
hodnoty. Pozrite si túto grafiku.
flex
Toto je skratka pre flex-grow,
flex-shrink
a flex-basis
kombinovaná. Druhý a tretí parameter ( flex-shrink
a flex-basis
) sú voliteľné. Predvolená hodnota je 0 1 auto
, ale ak ju nastavíte s jedinou číselnou hodnotou, je to podobné 1 0
.
.item ( flex: none | ( ? || ) )
Odporúča sa použiť túto vlastnosť skratky namiesto nastavenia jednotlivých vlastností. Skratka inteligentne nastavuje ďalšie hodnoty.
zosúladiť sa
To umožňuje align-items
prepísať predvolené zarovnanie (alebo to, ktoré určuje ) pre jednotlivé položky flex.
Prečítajte si align-items
vysvetlenie, aby ste pochopili dostupné hodnoty.
.item ( align-self: auto | flex-start | flex-end | center | baseline | stretch; )
Všimnite si, že float
, clear
a vertical-align
nemajú žiadny vplyv na flex položky.
Príklady
Začnime veľmi veľmi jednoduchým príkladom, ktorý rieši takmer každodenný problém: dokonalé centrovanie. Jednoduchšie to nemôže byť, ak používate flexbox.
.parent ( display: flex; height: 300px; /* Or whatever */ ) .child ( width: 100px; /* Or whatever */ height: 100px; /* Or whatever */ margin: auto; /* Magic! */ )
To sa spolieha na skutočnosť, že okraj nastavený na auto
vo flexibilnej nádobe absorbuje ďalší priestor. Takže nastavením zvislého okraja auto
sa položka stane dokonale vycentrovanou v oboch osiach.
Teraz použijeme niekoľko ďalších vlastností. Zvážte zoznam 6 položiek, všetky s pevnými rozmermi, ale je možné ich zmeniť automaticky. Chceme, aby boli rovnomerne rozložené na vodorovnej osi, aby pri zmene veľkosti prehliadača bolo všetko pekne zmenšené a bez mediálnych dotazov.
.flex-container ( /* We first create a flex layout context */ display: flex; /* Then we define the flow direction and if we allow the items to wrap * Remember this is the same as: * flex-direction: row; * flex-wrap: wrap; */ flex-flow: row wrap; /* Then we define how is distributed the remaining space */ justify-content: space-around; )
Hotový. Všetko ostatné je iba o stylingu. Nižšie je pero s týmto príkladom. Určite choďte na CodePen a skúste zmeniť veľkosť svojich okien, aby ste videli, čo sa stane.
Skúsme niečo iné. Predstavte si, že máme navigačný prvok zarovnaný doprava na samom vrchu našej webovej stránky, ale chceme, aby bol sústredený na stredne veľké obrazovky a aby bol jeden stĺpec na malých zariadeniach. Dosť ľahké.
/* Large */ .navigation ( display: flex; flex-flow: row wrap; /* This aligns items to the end line on main-axis */ justify-content: flex-end; ) /* Medium screens */ @media all and (max-width: 800px) ( .navigation ( /* When on medium sized screens, we center it by evenly distributing empty space around items */ justify-content: space-around; ) ) /* Small screens */ @media all and (max-width: 500px) ( .navigation ( /* On small screens, we are no longer using row direction but column */ flex-direction: column; ) )
Skúsme niečo ešte lepšie hraním s flexibilitou flexibilných položiek! Čo tak rozloženie troch stĺpcov, ktoré sú prvé na mobile, s hlavičkou a päty celej šírky. A nezávisle od objednávky zdroja.
.wrapper ( display: flex; flex-flow: row wrap; ) /* We tell all items to be 100% width, via flex-basis */ .wrapper> * ( flex: 1 100%; ) /* We rely on source order for mobile-first approach * in this case: * 1. header * 2. article * 3. aside 1 * 4. aside 2 * 5. footer */ /* Medium screens */ @media all and (min-width: 600px) ( /* We tell both sidebars to share a row */ .aside ( flex: 1 auto; ) ) /* Large screens */ @media all and (min-width: 800px) ( /* We invert order of first sidebar and main * And tell the main element to take twice as much width as the other two sidebars */ .main ( flex: 2 0px; ) .aside-1 ( order: 1; ) .main ( order: 2; ) .aside-2 ( order: 3; ) .footer ( order: 4; ) )
Predpona Flexboxu
Flexbox vyžaduje predponu niektorých dodávateľov, aby podporoval čo najviac prehľadávačov. Nezahŕňa iba vlastnosti predpony s predponou dodávateľa, ale v skutočnosti existujú úplne odlišné názvy vlastností a hodnôt. Je to preto, lebo špecifikácia Flexboxu sa časom menila a vytvárala „starú“, „tweenerovú“ a „novú“ verziu.
Možno najlepším spôsobom, ako to vyriešiť, je napísať novú (a poslednú) syntax a spustiť CSS prostredníctvom nástroja Autoprefixer, ktorý zvláda záložné postupy veľmi dobre.
Alternatívne je tu Sass, @mixin
ktorý vám pomôže s niektorými predponami, ktoré vám tiež poskytnú predstavu o tom, čo je potrebné urobiť:
@mixin flexbox() ( display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; ) @mixin flex($values) ( -webkit-box-flex: $values; -moz-box-flex: $values; -webkit-flex: $values; -ms-flex: $values; flex: $values; ) @mixin order($val) ( -webkit-box-ordinal-group: $val; -moz-box-ordinal-group: $val; -ms-flex-order: $val; -webkit-order: $val; order: $val; ) .wrapper ( @include flexbox(); ) .item ( @include flex(1 200px); @include order(2); )
Súvisiace vlastnosti
- Kompletný sprievodca po sieti
- Položky almanachu vo vlastnostiach mriežky, napríklad mriežka-riadok / mriežkový stĺpec
Ostatné zdroje
- Flexbox v špecifikáciách CSS
- Flexbox na MDN
- Flexbox v Opere
- Ponorte sa do Flexboxu od spoločnosti Bocoup
- Miešanie syntaxí pre najlepšiu podporu prehľadávača v CSS-Tricks
- Flexbox od Raphaela Goettera (FR)
- Flexplorer od Bennetta Feelyho
Ploštice
Flexbox určite nie je bez chýb. Najlepšia zbierka z nich, akú som videl, je Philip Walton a Flexbugs od Grega Whitwortha. Je to miesto s otvoreným zdrojovým kódom na ich sledovanie, takže si myslím, že je najlepšie prepojiť ich.
Podpora prehľadávača
Rozdelené „verziou“ flexboxu:
- (nové) znamená nedávnu syntax zo špecifikácie (napr.
display: flex;
) - (tweener) znamená zvláštnu neoficiálnu syntax z roku 2011 (napr.
display: flexbox;
) - (staré) znamená starú syntax z roku 2009 (napr.
display: box;
)
Chrome | Safari | Firefox | Opera | IE | Hrana | Android | iOS |
---|---|---|---|---|---|---|---|
20- (starý) 21+ (nový) | 3,1+ (staré) 6,1+ (nové) | 2-21 (staré) 22+ (nové) | 12.1+ (nové) | 10 (tweener) 11+ (nový) | 17+ (nové) | 2,1+ (staré) 4,4+ (nové) | 3,2+ (staré) 7,1+ (nové) |
Prehliadač Blackberry 10+ podporuje novú syntax.