Modulul layout flexbox ne permite să așezăm elemente flexibile în orice ordine și direcție. Comanda Flexbox este, de fapt, mai ușoară decât comandarea cu flotoare sau grila CSS, chiar dacă s-ar putea să nu credeți asta la început. Deoarece flexbox este un model de aspect unidimensional, spre deosebire de grila CSS care este bidimensională, trebuie doar să acordați atenție unei singure direcții. Regulile sunt, de asemenea, definite clar de W3C, deci nu trebuie să vă ocupați de mizeria obișnuită a flotorilor și a clarificărilor.
Citiți acest ghid, veți învăța cum să utilizați următoarele proprietăți flexbox în scopul de a comanda:
flex-direcție
flex-wrap
-Flow flex
Ordin
Când vorbim despre comanda flexbox, trebuie să clarificăm diferența dintre ordonare și reordonare.
Când configuram un layout flexbox, trebuie să definim mai întâi sursa Ordin, ceea ce înseamnă că trebuie să decidem cum sunt poziționate axele containerului flexibil. Am scris în detaliu despre modul în care axele flexbox lucrează în ghidul meu despre alinierea flexboxului.
Pe scurt, fiecare container flexibil are două axe: axa principală și axa transversală. Axa principală va avea una din cele patru direcții, iar axa transversală va fi întotdeauna perpendiculară pe aceea:
Am stabilit axa principală cu flex-direcție
proprietatea, atunci decidem cum se vor înfășura elementele flexibile, folosind flex-wrap
proprietate. Aceste două proprietăți determină modul în care browserul va stabili elementele din interiorul containerului flexibil.
Flexbox ne permite, de asemenea, să manipulăm în mod efectiv ordinea sursă implicită reordonare, cu ajutorul Ordin
proprietate. Reordonarea înseamnă că modificăm redarea vizuală a elementelor, în timp ce ordinea sursă rămâne intactă.
Dacă utilizăm capabilitățile de rearanjare ale flexbox, nu trebuie să schimbăm structura documentului HTML doar din motive de prezentare vizuală. Deci, utilizatorii de cititoare de ecran (și motoarele de căutare) pot obține conținutul într-un mod logic structurat (de exemplu, bara laterală nu va avea prioritate față de conținutul principal).
Comanda Flexbox se întâmplă cu proprietățile flex-direction și flex-wrap. Flex-direcție
specifică direcția axei principale. Pot avea următoarele valori:
rând
(implicit): de la stânga la dreaptarând-revers
axa principală: de la dreapta la stângacoloană
axa principală: de sus în joscoloană inversă
axa principală: de jos în susFlex-folie
definește dacă elementele flex sunt așezate într-o singură linie sau înfășurate pe mai multe linii. Controlează de asemenea direcția axei încrucișate. Poate avea trei valori:
nowrap
(implicit) stabilește elemente flexibile într-o singură linie; axa transversală se află în poziția implicităîmpacheta
stabilește elemente flexibile în mai multe linii; axa transversală se află în poziția implicităwrap-revers
stabilește elemente flexibile în mai multe linii; axa transversală este inversatăPoziția prestabilită a axei încrucișate este:
rând
și rând-revers
coloană
și coloană inversă
În articolul meu precedent despre alinierea flexbox, puteți găsi patru exemple detaliate (cu demonstrații) despre cum să configurați axa principală în patru direcții diferite folosind flex-direcție
. Cu toate acestea, atunci când discutăm despre comanda flexbox, cred că este mai important să știți cum să utilizați flex-direcție
și flex-wrap
proprietăţi împreună pentru a obține ordinea sursă pe care o căutăm.
Vom folosi un exemplu simplu de cod pentru a vedea cum funcționează comenzile flexbox. HTML-ul conține doar câteva diviziuni:
123456789
.recipient
div va fi containerul flex și divs cu .articol
clasa va fi elementele flexibile. Vom folosi (aproape) același CSS în toate exemplele, doar flex-direcție
și flex-wrap
proprietățile se vor schimba. Iată cum arată CSS-ul nostru cu rând
și împacheta
valori:
html background: # fff7f6; .container display: flex; direcția flexibilă: rând; flex-wrap: folie; .item font-size: 2rem; linia-înălțime: 1; text-align: centru; padding: 3rem; fundal: mistyrose; frontieră: roșii solide de 3px; culoare: roșii; margine: 6px;
Iată același exemplu într-o demonstrație CodePen:
Rând
și Coloană
Acum, am ajuns la partea cu adevărat interesantă! Nu este prea dificil să înțelegi comanda flexbox în teorie, dar folosirea ei în practică poate fi cu siguranță o provocare. Acest lucru se întâmplă deoarece este dificil vedea cât de diferite variații ale flex-direcție
și flex-wrap
comparați unul cu celălalt.
În stiloul încorporat de mai jos, puteți vedea cum direcție flexibilă: rând
și direcția flex: coloană
layouts lucrează împreună cu valori diferite ale flex-wrap
proprietate. Utilizați comenzile de formular pentru a vedea combinații diferite.
După cum puteți vedea, când flex-direcție
este rând
, Articolele flexibile sunt așezate orizontal, de la stânga la dreapta. Când o folosim wrap-revers
in loc de împacheta
, flexbox începe să stabilească elementele din fund, în loc de top. Acest lucru se întâmplă pentru că wrap-revers
inversează direcția axei transversale.
Cand flex-direcție
este coloană
, articolele sunt așezate vertical, de sus în jos. Și când o vom folosi wrap-revers
in loc de împacheta
, flexbox începe să stabilească elementele din dreapta (acum acesta este punctul de plecare al axei încrucișate), în loc de stânga.
rând-revers
și coloană inversă
Acum, să aruncăm o privire la modul în care flexbox stabilește elementele atunci când direcția flex este rând-revers
și coloană inversă
.
După cum puteți vedea în demo-ul de mai sus, flexbox-ul începe să plaseze elementele de la începutul axei principale în ambele cazuri, la fel ca înainte. Axa principală a rând-revers
aspectul rulează de la de la dreapta la stanga, astfel incat flexbox incepe sa dea elementele din dreapta. Și, axa principală a coloană inversă
aspectul rulează de la de sus în sus, astfel încât elementele să înceapă să curgă din partea inferioară a containerului flexibil.
Când o folosim flex-wrap: folie
, flexbox începe să înfășoare articolele din top cand flex-direcție
este rând-revers
și de la stânga când este coloană inversă
, deoarece acestea sunt punctele de plecare ale axei încrucișate în respectivele cazuri.
Când întoarcem direcția de înfășurare la flex-wrap: wrap-reverse
, axa transversală se va desfășura în direcția opusă. Se va indica de la de sus în sus cand flex-direcție
este rând-revers
, și din de la dreapta la stanga când este coloană inversă
.
-Flow flex
stenografieCSS are, de asemenea, o scurtă însemnătate pentru flex-direcție
și flex-wrap
proprietăți. Se numește flex-flow. Pentru ao folosi, trebuie să enumerăm cele două proprietăți una după alta în felul următor:
.container-1 flex-flow: wrap; .container-2 flex-flow: coloană inversă wrap-reverse;
E timpul să privim lucrurile puțin diferit.
Proprietatea de comandă modifică ordinea implicită a elementelor flex cu care definim flex-direcție
și -Flow flex
. Afectează numai randarea vizuală a elementelor, deci nu afectează modul în care cititorii de ecran și alți agenți de utilizare non-CSS citesc codul sursă.
Spre deosebire de proprietățile menționate anterior, le folosim Ordin
pe flex articole, în loc de flex recipient. Poate să ia orice valoare întregă, iar valoarea implicită este 0.
Următorul exemplu se mută .item-3
la punctul de plecare al axei principale. Deoarece toate elementele au valoarea 0 ca valoare implicită, este suficient să utilizați ordine: -1
regula pentru a deveni primul element din container:
.element-3 ordine: -1;
Veți observa că putem folosi aceeași logică pentru a ne mișca .item-3
până la capătul axei principale. Trebuie doar să definim un pozitiv Ordin
pentru aceasta.
Desigur, putem reordona cât mai multe dintre aceste elemente flexibile așa cum ne dorim (desi trebuie sa reordonare cont de faptul că tot ceea ce, probabil, nu este cel mai prietenos de accesibilitate decizie vreodată). Ordin
proprietățile diferitelor elemente flexibile sunt întotdeauna relativ unele cu celelalte. Mai jos, puteți vedea cum să reordonați mai multe elemente din interiorul containerului flexibil.
.element-3 ordine: -1; .item-4 ordine: -2; .item-5 ordine: 2; .item-7 ordine: 1;
Cel mai important lucru pe care trebuie să-l înțelegem este că Ordin
proprietatea nu afectează comenzile de pictură, vorbire și navigare secvențială. Aceasta înseamnă că atunci când modificăm ordinea elementelor noastre flexibile, utilizatorii de medii non-vizuale nu vor experimenta modificările. De exemplu, utilizatorii care se bazează pe navigarea prin tastatură se vor mișca în continuare prin legăturile din ordinea sursă originală.
Acest comportament flexbox poate fi util în unele cazuri. De exemplu, este posibil să se facă accesibil așa-numitul "Layout Holy Grail" cu ajutorul comenzii flexbox. Graal Layout Sfânt este popular aspectul blog cu un antet, un subsol și două bare laterale: unul pe stânga și una pe dreapta conținutul principal.
În acest aspect, de obicei, punem bara laterală stângă inainte de conținutul principal din codul HTML. Cu toate acestea, din punctul de vedere al accesibilității, utilizatorii de tehnologii de asistență ar trebui să întâlnească mai întâi conținutul principal. Flexbox este perfect pentru acest lucru. Putem plasa conținutul principal în fața celor două bare laterale în marcajul nostru. Apoi, trebuie doar să punem bara laterală și conținutul principal în poziția corectă folosind Ordin
proprietate:
.sidebar-stânga ordine: 1; articol ordine: 2; . sidebar-right ordine: 3;
Tot ceea ce se spune în acest tutorial se aplică modului de scriere LTR (stânga-dreapta). Axele Flexbox respectă de fapt direcția de scriere a documentului, care poate fi configurată cu proprietățile direcției și modului de scriere. De aceea, în modul de scriere LTR, axa principală rulează de la stânga la dreapta când flex-direcție
este rând
. În modul de scriere RTL, rulează în direcția opusă, de la dreapta la stânga, iar tot ce se schimbă în consecință.
Acest tutorial a fost a doua parte a seriei flexbox. Asigurați-vă că ați citit prima parte despre alinierea flexbox, pentru a afla cum să aliniați elementele flexibile de-a lungul axelor principale și celor încrucișate. Dacă doriți să aflați mai multe despre comanda flexbox, MDN are un articol foarte informativ pe această temă.