Introducere în CSS Grid Layout. Ce este o grilă flexibilă în aspect receptiv? Poziționarea elementelor într-o grilă
Acest articol arată cum acest comparativ tehnologie nouă, funcționează, și nu doar o descriere a proprietăților cu exemple superficiale.
Articolul în sine este o traducere augmentată receptivă a tutorialului CSS Grid
Modulul CSS Grid a fost dezvoltat de Grupul de lucru CSS pentru a oferi cea mai bună modalitate de a crea șabloane în CSS. A fost inclus în Recomandarea Candidaților în februarie 2017, iar browserele majore au început să o susțină în martie 2017.
Grilă CSS va deveni în curând o parte integrantă a setului de instrumente al oricărui dezvoltator front-end. Și dacă ești unul dintre ei, atunci va trebui să înveți CSS Grid — care aproape sigur va fi o abilitate nenegociabilă pentru orice poziție de dezvoltare front-end.
Cu această funcționalitate puternică și sintaxă intuitivă, șabloanele de grilă vor schimba, fără îndoială, modul în care este construit web-ul.
Introducere
Grila CSS este model noușablon, optimizat pentru șabloane bidimensionale. Acesta este un model ideal pentru șabloane de site-uri web, formulare, galerii și orice necesită o poziționare precisă și receptivă.
Odată cu dezvoltarea web-ului în anul trecut, dezvoltarea șabloanelor de site-uri web a devenit din ce în ce mai dificilă. ÎN primii ani web, Tabelele HTML adesea folosit pentru șabloane cu mai multe coloane, formulare etc. Dar această metodă are dezavantajele ei. Aceasta înseamnă că prezentarea trebuia făcută la nivel de marcare, deci nu a existat nicio distincție între prezentare și conținut. De fapt, tabelele au fost create pentru a conține date tabulare, nu pentru a crea șabloane. Și fără atingere probleme semantice, șabloanele de tabel nu sunt create pentru design adaptabil.
Floats a înlocuit în cele din urmă șabloanele de tabel ca metodă universal acceptată și recomandată pentru crearea de șabloane, deoarece ne permite să poziționăm elementele independent de aspect. Cu toate acestea, până acum această metodă a fost considerată o îmbunătățire semnificativă a fundalului aspect tabelar, avea și limitările sale. Float-urile au fost concepute în principal pentru șabloane de documente și nu erau potrivite pentru șabloanele de aplicații complexe care sunt acum comune pe web. Elementele plutitoare sunt greu de controlat, mai ales pe dispozitive și ferestre marimi diferite. Acest lucru a dus la diferite hack-uri asemănătoare grilei care au devenit norma, majoritatea necesitând un marcaj suplimentar care a diminuat întregul concept de separare a conținutului. Deci, grupul de lucru CSS căuta o soluție mai bună.
Modelul CSS Grid abordează aceste probleme și multe altele. Vă permite să creați șabloane avansate într-o fracțiune din timpul pe care l-ați petrece cu ele cu flote și cu mai puțină codare.
Dar, desigur, ar putea folosi sensuri diferite, cum ar fi 100px , 7em , 30% și așa mai departe. De asemenea, puteți atribui nume șirurilor de caractere împreună cu dimensiunile acestora.
grid-template-coloane: 1fr 1fr 1fr
La fel ca mai sus, definește doar coloanele în grile.
Expune un gol. Adică spații dintre elementele grilei. Aici folosim o unitate de lungime vw, care este relativă la lățimea ferestrei de vizualizare, dar putem folosi și 10px, 1em, etc. Proprietatea grid-gap este prescurtare pentru grid-row-gap și grid-column-gap proprietăți.
Ei bine, cealaltă parte a codului pur și simplu atribuie stiluri diferite elemente de grilă.
#grilă >
funcția repeat().
Puteți folosi funcția repeat() pentru a face declarații repetate ale mărimii unui element. De exemplu, în loc să faci asta:
Grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
Noi putem sa facem asta:
Grid-template-rows: repetare(5, 1fr);
Ceea ce va reduce semnificativ cantitatea de cod pe care trebuie să o scrieți, mai ales dacă lucrați cu grile mari și repetate.
Crearea unui șablon de site web cu grilă CSS
Grilele includ o sintaxă intuitivă „grafică ASCII” în care puteți „vedea” virtual șablonul în cod, ceea ce face foarte ușor să creați și să modificați șablonul. Chiar și modificări semnificative pot fi făcute în câteva secunde. Această sintaxă intuitivă ajută și la design web responsive. Creare diferite șabloane Pentru diferite dispozitive devine destul de simplă atunci când folosiți grile.
Să creăm acum un șablon de site web care arată astfel:
Și iată codul pentru acest șablon:
Să aruncăm o privire mai atentă la codul nostru. Marcajul HTML arată astfel:
Și așa vom face
container grilă, astfel încât toate celelalte elemente devin elemente grilă.Acum să ne uităm la grafica ASCII despre care am vorbit înainte.
Grid-template-zone: „header header header” „nav article ads” „footer footer footer”;
Această piesă definește șablonul nostru. Doar privind codul, putem vedea că este o grilă 3x3 (trei rânduri și trei coloane). Acest lucru ne oferă cinci zone de grilă pe nouă celule de grilă, deoarece unele zone de grilă se întind pe mai multe celule.
De asemenea, vedem că antetul ocupă întreg primul rând de trei celule, iar subsolul ocupă întregul rând de jos, ocupând tot trei celule. Secțiunile de navigare, conținut și publicitate împart spațiu în al doilea rând, unde fiecare dintre aceste elemente primește o celulă.
Acum putem aloca fiecare dintre aceste zone de grilă fiecărui element:
#pageHeader ( grid-area: header; ) #pageFooter ( grid-area: footer; ) #mainArticle ( grid-area: articol; ) #mainNav ( grid-area: nav; ) #siteAds ( grid-area: reclame; )
Proprietatea grid-area este o proprietate scurtă care vă permite să plasați elemente de grilă pe o grilă. În cazul nostru, ne referim pur și simplu la numele pe care le-am specificat anterior în zonele-șablon-grilă.
Cea mai mare parte a șablonului este deja completată. Restul codului se va ocupa pur și simplu de dimensiuni, spații și înălțimi, în general mai mult de o zonă decorativă.
Următorul cod oferă dimensiunile rândurilor și coloanelor:
Grid-template-rows: 60px 1fr 60px; grid-template-coloane: 20% 1fr 15%;
Prima și a treia linie au ambele 60 de pixeli înălțime, iar a doua linie ocupă tot spațiul rămas.
Prima coloană este de 20%, iar a treia este de 15%. Al doilea ocupă tot spațiul rămas.
Schimbarea șablonului
Puteți schimba șablonul pur și simplu rearanjand zonele grilei în zonele-șablon-grilă .
Deci, dacă trecem la asta:
Grid-template-zone: „nav header header” „nav article ads” „nav footer ads”;
Ca rezultat, obținem următorul șablon:
Cu toate acestea, poate fi necesar să ajustați dimensiunile dacă mutați o grilă mai mică într-o locație mai mare.
De exemplu, pentru a face acest lucru:
Navigarea ocupă acum spațiul în care se afla conținutul, prin urmare dimensiunile au fost ajustate. Altfel, am avea un conținut restrâns și o navigare largă. Deci codul arată acum așa.
Grid-template-zone: „header header header” „articol nav ads” /* Înainte de aceasta a existat „nav article ads” */ „footer footer footer”; grid-template-rows: 60px 1fr 60px; grid-template-coloane: 1fr 20% 15%; /* Înainte de asta era „20% 1fr 15%” */
Crearea unei grile adaptative
Șablonul de grilă are valori precum completarea automată și potrivirea automată care vă permit să creați o grilă cu multe piste de o anumită dimensiune care se vor potrivi într-un container. Acest lucru ar putea însemna că grila este receptivă, ceea ce înseamnă că elementele își schimbă poziția pe măsură ce redimensionați fereastra browserului.
Exemplu de utilizare a completarii automate:
Iată rezultatul:
Codul responsabil pentru aceasta:
Grid-șablon-coloane: repetare(completare automată, minmax(150px, 1fr));
În ea, coloanele au o dimensiune minimă de 150px și un maxim din spațiul rămas. Astfel de piese vor fi repetate de câte ori este necesar pentru a se potrivi în container.
Funcția Repeat() repetă definiția pistei de numărul de ori specificat de primul parametru. Utilizarea umplerii automate va face ca pistele să se repete de cât mai multe ori posibil până când umple containerul.
Mărimea acestor piste este specificată în al doilea parametru. În cazul nostru, folosim minmax(150px, 1fr) pentru a indica faptul că dimensiunea minimă a coloanei este de 150px, iar cea maximă este de 1fr.
Potrivire automată
potrivirea automată funcționează la fel ca umplerea automată. Singura diferență aici este că potrivirea automată reunește toate pistele goale la sfârșitul plasării, în timp ce completarea automată nu o face. Cel mai bun mod aici este o demonstrație cu comparație.
Folosirea a două elemente mici de grilă aici va ajuta la arătarea întregului concept de muncă. Umplerea automată lasă piste goale la sfârșit la dimensiunile specificate, iar potrivirea automată întinde piesa goală, ceea ce duce la umplerea pistelor cu elemente întinse pentru a umple spațiul.
Grile cu interogări media
Unul dintre punctele forte ale grilelor este că puteți crea un șablon complet diferit în câteva secunde.
Acest lucru face grilele ideale pentru interogări media. Putem pur și simplu reatribui valorile în grafica ASCII și include rezultatul într-o interogare media.
Acesta este un șablon cu trei coloane pe o fereastră de vizualizare mare și se comprimă într-o singură coloană pe dispozitive mici. Deci, acest exemplu va arăta diferit în funcție de dimensiunea ecranului. În orice caz, aici este codul relevant pentru un șablon cu trei coloane pentru ferestre largi.
Grid-template-zone: „header header header” „nav article ads” „footer footer footer”;
Și iată codul corespunzător pentru versiunea mobilă:
Grid-template-zone: „header” „articol” „reclame” „nav” „footer”;
Deci, scopul este să reatribuiți valorile în proprietatea grid-template-zone.
În cazul nostru, am împachetat versiunea mobilă într-o interogare media, astfel:
@media all și (max-width: 575px) ( body ( grid-template-zone: „header” „articol” „ads” „nav” „footer”; grid-template-rows: 80px 1fr 70px 1fr 70px; grid- coloane-șablon: 1fr; ) )
Vă rugăm să rețineți că am ajustat și valorile din rândurile-șablon-grilă și coloanele-șablon-grilă pentru a se potrivi cu noul șablon. În special, ar trebui să existe o singură coloană și ar trebui să ocupe tot spațiul liber. Și, deoarece toate elementele grilei vor fi într-o singură grămadă, vom aloca 5 rânduri și vom determina înălțimile acestora.
Combinarea grilă cu bloc
În funcție de cerințele șablonului dvs., nimic nu vă împiedică să schimbați versiunea mobilă pentru a afișa: bloc . Ca aici:
@media all and (max-width: 575px) (body ( display: block; ) )
Acest lucru va funcționa la fel ca în exemplul de mai sus, dar implicit, elementele vor apărea în ordinea lor inițială. În exemplul de mai sus, versiunea mobilă are un nav sub reclame, dar dacă am folosit display: block, atunci nav-ul ar fi deasupra reclamelor.
De asemenea, folosind această metodă, s-ar putea să fie necesar să adăugați niște căptușeală pentru a compensa lipsa golurilor care au fost incluse în versiunea grilă.
Grile explicite și implicite
CSS Grid folosește conceptul de grilă explicită și grilă implicită. Acesta este un concept cheie la care trebuie să fiți atenți când creați grile, altfel veți ajunge cu o grămadă de rânduri și coloane la care nu vă așteptați niciodată să fie acolo.
O grilă explicită este o grilă pe care o definiți în rânduri-șabloane-grilă, coloane-șabloane-grilă și zonele-șablon-grilă.
Cu toate acestea, este posibil să aveți încă elemente care nu se încadrează în grila definită „explicit”. De exemplu, ați definit o grilă care poate conține doar șase elemente, dar containerul în sine este de fapt format din nouă elemente. Doar șase elemente se vor încadra în grila explicită și trei vor rămâne. Și aici intervin grilele implicite.
Grilele implicite sunt generate automat de containerul grilă ori de câte ori elementele grilei sunt situate în afara grilei explicite. Containerul generează trasee de grilă implicite prin adăugarea de rânduri implicite la grilă. Aceste linii, împreună cu grilele explicite, formează cele implicite. Iată un exemplu:
În acest exemplu, definim în mod explicit două rânduri și două coloane, care vor găzdui patru elemente de grilă. Cu toate acestea, există șase elemente de grilă, așa că a fost creată o grilă implicită pentru a găzdui cele două elemente suplimentare.
Și asta e foarte bine.Dacă nu ar fi fost creată grila implicită, atunci două element suplimentar ar crea o mizerie completă în grilă.
Setarea dimensiunii pistei pentru grile implicite
Poate ați observat că rândul suplimentar nu este la fel de înalt ca precedentele două. Acest lucru se datorează faptului că setăm înălțimea rândului în proprietatea grid-template-rows, dar se aplică numai grilelor explicite. Înălțimea rândurilor pe grilele implicite trebuie setată folosind proprietatea grid-auto-rows. Dar din moment ce nu am făcut acest lucru, se dovedește că rândul implicit folosește dimensiunea auto track, care se bazează pe conținut. Iată cum se află proprietățile pentru setarea dimensiunii pistei:
În general, merge așa:
Grila explicită utilizează rânduri-șablon-grilă și coloane-șablon-grilă
Grila implicită utilizează rânduri automate grilă și coloane automate grilă
În acest caz nu trebuie să precizăm valorile finale pe primul element deoarece acoperă doar o singură pistă. Același lucru se poate spune despre al doilea element de grilă. Implicit dacă nu specificați capăt de linie, atunci elementul se va întinde pe o singură pistă.
De fapt, nu a fost nevoie să specificăm nicio poziționare pentru primul element de grilă, deoarece acesta se află într-o anumită poziție, ar fi fost acolo oricum. Dar dacă nu am fi specificat poziționarea pentru al doilea element, atunci acesta ar fi fost localizat imediat după primul element, ocupând doar 1 pistă.
Denumirea liniilor de grilă
De asemenea, puteți numi linii de grilă pentru a le face mai ușor de referit. Acest lucru se poate face prin setarea proprietăților grid-template-rows și grid-template-columns, de exemplu ca aici:
#grid ( afișare: grilă; /* Setați traseele și denumiți liniile */ grid-template-rows: 50px 1fr 80px ; grid-template-columns: 120px 1fr 80px ; grid-gap: 5px; înălțime: 90vh; ) . .. /* Acum referiți-vă la acele linii numite */ #item2 ( grid-row-start: row3-start; grid-column-start: col2-start; grid-row-end: row3-end; grid-column-end : col3 -end; )
Liniile numite pot fi fie explicite, fie implicite. Liniile denumite implicite sunt create ori de câte ori creați zone de grilă denumite folosind grid-template-areas .
Numele este preluat din zona grilei cu -start și -end adăugate la sfârșit, în funcție de faptul că este începutul sau sfârșitul liniei.
Astfel, pentru fiecare zonă de grilă numită antet, vor fi create patru linii implicite. Două sunt denumite header-start și coloana-start în zona de grilă numită și două sunt denumite header-end, respectiv.
Zone de grilă denumite
Zonele grilei pot fi denumite în proprietatea grid-template-areas a containerului grilă însuși. Aceasta este ceea ce am făcut înainte când am creat șablonul de site. Pentru a restabili acest lucru în memorie, arată astfel:
#grid ( afișare: grilă; /* Denumiți zona grilei */ grid-template-areas: „a a” „b c”; ... ) ... /* Acum aplicați fiecare element de grilă în zona de grilă numită */ # a ( zonă grilă: a; ) #b ( zonă grilă: b; ) #c ( zonă grilă: c; )
Puteți indica o celulă goală folosind un punct (.) sau o serie de puncte fără spații. De exemplu:
Zone-șablon-grilă: „a a” „. b"; Sau grid-template-zone: „antet antet” „... conținut”;
Proprietăți de plasare în grilă
Există trei proprietăți scurte care pot fi utilizate în locul proprietăților lungi de aspect al grilei menționate în exemplele de mai sus. Aici se potrivesc toate.
grid-area - Această proprietate este prescurtarea pentru:
grid-coloană - Această proprietate este prescurtarea pentru:
grid-column-start — indică ce linie de coloană a elementului grilă începe și la câte piste se extinde.
grid-column-end — indică pe ce linii de coloană se termină elementul grilă și la câte piste se extinde.
grid-row — această proprietate este prescurtarea pentru:
grid-row-start — indică de la ce linie de rând începe elementul grilă și la câte piste se extinde.
grid-row-end - indică ce linie de rând va fi ultima pentru element și câte piste se va întinde.
De asemenea, puteți utiliza proprietatea grid-auto-flow, care a fost menționată în capitolul înainte de acesta. Specifică modul în care elementele de grilă plasate automat ar trebui să fie plasate în grilă. Elementele plasate automat sunt acelea care nu sunt plasate în mod explicit folosind niciuna dintre proprietățile de mai sus.
Creați o grilă imbricată
Elementele grilei pot deveni ele însele grile în CSS Grid. Adică, puteți imbrica un element de grilă într-un alt element de grilă, creând astfel o grilă imbricată.
Pentru a crea o astfel de grilă imbricată, tot ce trebuie să faceți este să aplicați display: grid (sau afișare: inline-grid) elementului grilă și acesta devine o grilă în sine. De asemenea, puteți utiliza display: subgrid pentru a crea o subgrid. , Cum se întâmplă asta.
Moştenire
Majoritatea proprietăților grilei nu sunt moștenite, ceea ce înseamnă că grila dvs. imbricată nu va moșteni valorile grilei părinte. Acest lucru vă permite să faceți modificări în grila părinte fără a afecta neintentionat grila copil.
De exemplu, ați setat coloana grid-auto-flow: pe grila părinte, dar nu ați setat proprietatea pe grila imbricată. În acest caz, grila imbricată va fi setată la rând, deoarece aceasta este valoarea inițială pentru această proprietate.
Rețineți că pe grila părinte, numerele merg pe verticală în jos pe coloane, nu pe orizontală de-a lungul rândului, dar grila imbricată merge în continuare orizontal de-a lungul rândului.
Subgrile
Modulul CSS Grid setează valoarea subgrid pentru proprietăți de afișare. Cu toate acestea, nu toate browserele îl acceptă încă. Această valoare ar trebui să se dovedească destul de utilă.
Subgrid este o grilă imbricată, dar cu afișare: subgrid . Acest lucru îl face un tip special de container grilă care participă la setarea dimensiunii grilei containerului grilă părinte. Cu alte cuvinte, conținutul subgrilei influențează dimensiunea grilei părinte, permițând conținutului să fie răspândit în două grile. Mai jos este un exemplu unde această proprietate ar putea fi utilă.
Iată lista elementelor:
Și aici este CSS, unde lista este o grilă, iar elementele listei sunt subgrile.
Ul ( afișare: grilă; grilă: flux automat / auto 1fr; ) li ( afișare: subgrilă; coloană grilă: span 2; margine: 0,5 em; chenar: solid; umplutură: 0,5 em; ) etichetă ( coloană grilă: 1; ) intrare (grilă-coloană: 2; )
Acest exemplu ar arăta eticheta și intrarea într-un rând, cu un chenar în jurul fiecărui element din listă. A da fiecărui element de listă o subgrilă înseamnă că nu ar trebui să existe probleme cu alinierea formularelor de intrare, deoarece fiecare element de listă va participa la modelarea dimensiunii grilei părinte.
Formulare de plasare automată
Puteți folosi grile explicite ca avantaj atunci când creați formulare sau orice altă colecție de elemente care necesită alinierea grilei. De exemplu, puteți utiliza grile explicite pentru a crea un formular ca acesta:
Și pe măsură ce adăugați elemente de formular la marcaj, grila explicită va adăuga rânduri pentru a le găzdui. Deci, pentru a crea forma deasupra, avem nevoie de acest marcaj.
Nu este nevoie de marcaje suplimentare pentru a aranja totul corect. Și, de asemenea, nu este nevoie să adăugați clase suplimentare pentru elementele de formular. Adăugăm o singură clasă pentru
Puteți adăuga automat noi elemente de formular și acestea se vor adapta automat la altele, deoarece vor fi plasate într-o grilă explicită.
Acest lucru este posibil deoarece am făcut din formularul în sine o grilă (afișare: grilă aplicată la .myForm). Și apoi au indicat că etichetele merg într-o coloană, iar controalele în alta.
Iată un alt exemplu, de data aceasta cu mai multe o cantitate mare elemente:
Odată ce subgrilele devin răspândite printre browsere, va fi posibilă alinierea elementelor de formular care nu sunt descendenți direcți ai