Stilizarea cutiilor cu CSS
Toate elementele HTML sunt „captive” într-o cutie, creată cu ajutorul CSS. Înțelegerea acestor cutii reprezintă cheia către realizarea de machete eficiente și flexibile în CSS.
În această secțiune, vom explora în profunzime modelul cutiei, ceea ce ne va permite să construim machete din ce în ce mai complexe și să înțelegem modul de funcționare și terminologia utilizată.
Cutii block și inline-block
În CSS există două tipuri principale de cutii: cutii de tip bloc și cutii în linie (inline), fiecare cu comportamente și caracteristici diferite, atât individual, cât și în relație cu alte elemente din pagină.
O cutie de tip bloc se comportă astfel:
- Se extinde pe orizontală pentru a umple tot spațiul disponibil din containerul părinte. De cele mai multe ori, va avea aceeași lățime ca și containerul, ocupând 100% din spațiul disponibil.
- Produce o rupere de linie înainte și după element.
- Proprietățile de lățime și înălțime se aplică.
- Proprietățile padding, margin și border vor influența poziționarea altor elemente din jur, împingându-le în funcție de spațiul definit.
Elemente precum titlurile H1 sau paragrafele p sunt, în mod implicit, de tip bloc. Acest comportament poate fi modificat prin utilizarea proprietății display cu valoarea inline.
O cutie de tip inline se comportă astfel:
- Nu produce o rupere de linie.
- Proprietățile de lățime și înălțime nu se aplică.
- Proprietățile padding, margin și border se aplică, dar nu vor influența poziționarea altor elemente inline din jur.
- Elementele a, em, strong, span sunt, implicit, de tip inline.
Tipul de cutie aplicat unui element este definit prin valorile proprietății display: block, inline și inline-block.
Tipuri de afișaj interior și exterior
Acum este un moment potrivit pentru a explica și diferenția tipurile de afișare interioară și exterioară.
Așa cum am precizat anterior, cutiile au un tip de afișare exterioară, care indică dacă elementul este de tip block sau inline.
De asemenea, cutiile au un tip de afișare interioară, care dictează modul în care sunt dispuse elementele din interiorul acelui container.
În mod implicit, elementele din interiorul unei cutii sunt dispuse în flux normal (normal flow), ceea ce înseamnă că se vor comporta ca orice alt element de tip block sau inline.
Totuși, putem modifica tipul de afișare interioară folosind valori precum flex. Dacă aplicăm display: flex; unui element, tipul de afișare exterioară rămâne block, iar afișarea interioară devine flex. Toți copiii direcți ai acelui container vor deveni elemente flex și se vor comporta conform regulilor din specificația Flexbox, despre care vom discuta mai detaliat în secțiunile următoare.
Cel mai important aspect de reținut este că, în absența altor reguli CSS, afișarea de tip block și inline reprezintă comportamentele implicite pe web — adică acel flux normal menționat mai sus.
Mai jos avem trei elemente HTML diferite, toate având ca mod de afișare exterior tipul block:
Primul este un paragraf cu un chenar definit în CSS. Browserul îl afișează într-o cutie de tip block, ceea ce înseamnă că începe pe o linie nouă și se extinde pe toată lățimea disponibilă.
Al doilea element este o listă cu afișare flex, ceea ce stabilește un layout flexibil pentru elementele din interiorul containerului. Lista în sine rămâne de tip block, deci se extinde pe toată lățimea și este afișată pe propria linie.
Ultimul paragraf este tot de tip block, iar în interiorul lui se află două elemente span. Acestea au, implicit, afișare inline, dar unul dintre ele are atribuită o clasă care schimbă afișarea în block.
În exemplul de mai jos putem observa comportamentul elementelor de tip inline.
Elementul span din primul paragraf este, în mod implicit, de tip inline, așa că nu forțează o rupere de linie.
Avem, de asemenea, un element ul cu setarea display: inline-flex;, care creează o
cutie flexibilă în jurul elementelor din interior.
În final, sunt două paragrafe cu setarea display: inline;. Containerul inline-flex și
cele două paragrafe sunt afișate pe aceeași linie, în loc să creeze o rupere de linie, așa cum s-ar întâmpla
dacă ar avea display: block;.
Puteți modifica diferitele tipuri de afișare pentru a observa comportamentul în diverse situații.
Ceea ce trebuie reținut din exemplele de mai sus este faptul că modificarea valorii proprietății
display poate schimba modul de afișare exterioară în block sau
inline, influențând astfel relațiile cu elementele din jur.
În continuare, ne vom concentra pe tipul de afișaj exterior.
Ce este modelul cutiei CSS?
Modelul complet al cutiei CSS se aplică elementelor de tip block, în timp ce elementele inline folosesc doar o parte din acest model.
Practic, acest model definește modul în care diferitele componente ale unei cutii CSS — margin, border, padding și content — interacționează pentru a forma o cutie vizibilă în pagină.
Există două variante ale modelului: modelul standard și modelul alternativ.
În mod normal, o cutie CSS este alcătuită din:
- Content box - zona în care este afișat conținutul, dimensionată cu proprietăți
precum
widthșiheight. - Padding box - spațiul alb din jurul conținutului.
- Border box - înfășoară conținutul și padding-ul.
- Margin box - stratul cel mai exterior, care creează spațiu între cutii.
Imaginea de mai jos este edificatoare:
Modelul standard al cutiei CSS
În modelul standard, dacă setăm o lățime și o înălțime pentru o cutie, acestea definesc dimensiunile content box. Umplutura (padding) și chenarul (border) se adaugă peste aceste dimensiuni pentru a calcula dimensiunea totală a cutiei.
Presupunem că avem următoarea cutie CSS:
.box {
width: 350px;
height: 150px;
margin: 25px;
padding: 25px;
border: 5px solid black;
}
Lățimea totală a acestei cutii este de 410px (350 + 25 + 25 + 5 + 5), iar înălțimea este de 210px (150 + 25 + 25 + 5 + 5), rezultând din adăugarea padding-ului și border-ului la dimensiunile inițiale.
☞ Marginea (margin) nu este inclusă în calculul dimensiunii totale a cutiei. Ea influențează spațiul ocupat în pagină, dar este considerată exteriorul cutiei. Cutia se oprește la chenar.
Modelul alternativ al cutiei CSS
Este destul de incomod să adăugăm mereu padding și border pentru a calcula dimensiunea totală a cutiei.
Din acest motiv a fost introdus modelul alternativ al cutiei CSS.
În acest model, dimensiunea setată reprezintă dimensiunea totală a cutiei vizibile. Padding-ul și border-ul sunt scăzute din dimensiunea conținutului.
Aceeași cutie CSS de mai sus va avea, în acest caz, lățimea de 350px și înălțimea de 150px.
În mod implicit, browserele folosesc modelul standard. Pentru a activa modelul alternativ, se utilizează
proprietatea box-sizing: border-box;, care spune browserului să includă padding-ul și border-ul în
dimensiunea totală.
.box {
box-sizing: border-box;
}
Dacă doriți ca toate cutiile din pagină să folosească modelul alternativ, aplicați această regulă pe elementul
html și faceți ca toate celelalte elemente să o moștenească:
html {
box-sizing: border-box;
}
*, *::before, *::after {
box-sizing: inherit;
}
Exersați modelele de cutii
În exemplul următor sunt două cutii CSS. Ambele au clasa .box, prin care li se aplică aceleași dimensiuni.
Singura diferență este că pentru a doua cutie a fost setat modelul alternativ al cutiei CSS.
Provocarea este să modificați dimensiunile celei de-a doua cutii, prin adăugarea de cod CSS în clasa .alternate, astfel încât să ajungă la aceeași lățime și înălțime ca prima cutie.
Utilizați DevTools pentru a vizualiza modelul cutiei CSS
Instrumentele pentru dezvoltatori din browser vă pot ajuta să înțelegeți mai bine și mai rapid modelul cutiei.
Dacă inspectați un element în Firefox DevTools, puteți vedea dimensiunea elementului, plus umplutura, chenarul și marginea.
Inspectarea unui element în acest mod este o metodă eficientă de a verifica dacă dimensiunile cutiei corespund cu ceea ce credeți că ați definit în CSS.
Marginea-umplutura-chenarul
Probabil cunoașteți deja aceste proprietăți, dar acum le vom analiza în detaliu.
Marginea (margin)
Marginea este un spațiu invizibil din jurul cutiei, care poate împinge alte elemente din pagină.
Poate avea valori pozitive, dar și negative. Setarea unei valori negative pentru o latură poate duce la suprapunerea peste alte elemente.
Indiferent de modelul de afișare utilizat (standard sau alternativ), marginea se aplică întotdeauna după ce dimensiunea cutiei vizibile a fost calculată.
Putem controla toate marginile simultan cu proprietatea margin, sau individual, folosind forma extinsă:
margin-topmargin-rightmargin-bottommargin-left
În exemplul următor, încercați să modificați valorile marginilor pentru a observa efectele în pagină.
Prăbușirea marginilor (Margin collapsing)
Un concept important de înțeles este cel legat de prăbușirea marginilor.
Atunci când două elemente au marginile care se ating, acestea se combină într-o singură margine, cu dimensiunea celei mai mari dintre cele două.
În exemplul următor avem două paragrafe. Paragraful superior are o margine inferioară de 50px (margin-bottom: 50px;), iar al doilea paragraf are o margine superioară de 30px (margin-top: 30px;).
Deoarece cele două elemente se ating, marginile se prăbușesc, astfel că spațiul real dintre paragrafe este de 50px, nu suma celor două margini.
Puteți testa acest comportament setând margin-top la 0 pentru al doilea paragraf — veți observa că spațiul dintre cele două paragrafe rămâne tot de 50px, cât are paragraful unu.
Există o serie de reguli care determină când marginile se prăbușesc și când nu. Este important să rețineți acest comportament, mai ales atunci când creați spațiu cu ajutorul marginilor și nu obțineți rezultatul dorit — cauza poate fi prăbușirea marginilor.
Situații complexe ale proprietății margin
Așa cum ați observat, marginile superioare și inferioare ale cutiilor CSS se pot combina într-o singură margine, aplicându-se cea mai mare dintre ele.
☞ Rețineți că marginile elementelor flotante (float) sau
poziționate absolut (position: absolute) nu se prăbușesc niciodată.
Prăbușirea marginilor apare în trei situații principale:
- Frați adiacenți (Adjacent siblings): Marginile elementelor aflate unul după
altul se prăbușesc, cu excepția cazului în care ultimul element trebuie să reseteze un
floatanterior. - Fără separare între părinte și descendenți: Dacă nu există chenar, umplutură, conținut inline, înălțime sau alt element care să creeze spațiu între marginea părintelui și cea a descendentului, marginile se prăbușesc.
- Blocuri goale: Dacă un bloc nu are chenar, padding, conținut sau înălțime, marginile superioare și inferioare se prăbușesc între ele.
☞ Alte situații complexe pot apărea din combinarea celor de mai sus.
Aceste reguli se aplică chiar și când marginile au valoarea 0. Astfel, marginea unui element
descendent poate ieși în afara părintelui, chiar dacă marginea părintelui este zero.
În cazul marginilor negative, dimensiunea marginii prăbușite este suma dintre cea mai mare margine pozitivă și cea mai mică margine negativă.
Dacă toate marginile sunt negative, se aplică cea mai mică dintre ele. Acest comportament este valabil atât pentru elemente adiacente, cât și pentru cele imbricate.
Chenarul (Border)
Chenarul — sau granița — este poziționat între margine și umplutură. Dacă se utilizează modelul standard al cutiei, chenarul este adăugat la înălțimea și lățimea cutiei. În cazul modelului alternativ, dimensiunea chenarului reduce dimensiunea content-box, deoarece ocupă o parte din spațiul total definit de lățime și înălțime.
Pentru stilizarea chenarului există numeroase proprietăți, deoarece fiecare dintre cele patru laturi poate avea un stil, o lățime și o culoare diferită.
Putem seta stilul, dimensiunea și culoarea simultan, folosind forma scurtă a proprietății border.
Pentru a seta individual stilul, lățimea și culoarea fiecărei laturi, folosim:
border-topborder-rightborder-bottomborder-left
Pentru a controla toate laturile simultan, putem folosi:
border-widthborder-styleborder-color
Iar pentru a stiliza o singură latură în detaliu:
border-top-widthborder-top-styleborder-top-colorborder-right-widthborder-right-styleborder-right-colorborder-bottom-widthborder-bottom-styleborder-bottom-colorborder-left-widthborder-left-styleborder-left-color
În exemplul următor am folosit atât forma scurtă, cât și forma extinsă pentru a crea chenare variate. Poți modifica valorile pentru a înțelege mai bine cum funcționează fiecare proprietate.
Umplutura (padding)
Umplutura este spațiul dintre conținutul unui element și chenarul acestuia. Ea contribuie la lizibilitate și la estetica generală a layout-ului.
Spre deosebire de margine, umplutura nu poate avea valori negative — poate fi 0 sau orice valoare pozitivă.
Orice culoare de fundal aplicată unui element va fi vizibilă și în zona de umplutură, ceea ce o face ideală pentru a crea spațiu vizual între conținut și chenar.
Putem controla umplutura individual pe fiecare latură, folosind:
padding-toppadding-rightpadding-bottompadding-left
Alternativ, putem folosi forma scurtă:
padding: 10px;
În exemplul următor, puteți modifica valorile pentru clasa .box și observați cum se modifică spațiul dintre text și chenar. De asemenea, puteți ajusta umplutura pentru .container pentru a vedea cum influențează spațiul dintre container și elementul din interior.
Modelul cutiei vs. cutiile inline
Toate regulile discutate anterior se aplică complet pentru cutiile de tip block. Unele
proprietăți, precum padding, margin și border, se aplică și elementelor
inline, cum ar fi span, dar cu limitări.
În exemplul următor, avem un element span în interiorul unui paragraf. I-am setat lățimea,
înălțimea, umplutura, chenarul și marginea. Veți observa că:
- Lățimea și înălțimea sunt ignorate.
- Umplutura și marginea se aplică, dar nu afectează poziționarea altor elemente inline.
- Chenarul și umplutura se pot suprapune peste textul din jur.
💡 Recomandare: Dacă vrei ca un element inline să respecte dimensiuni și să se comporte ca un
bloc, folosește display: inline-block;.
Utilizarea valorii inline-block
Există o valoare specială a proprietății display, care combină comportamentele celor două tipuri
principale: block și inline. Aceasta este extrem de utilă atunci când nu dorim ca un
element să creeze o rupere de linie, dar vrem ca el să respecte dimensiunile setate și să evite suprapunerile,
așa cum am văzut în exemplul anterior.
O cutie de tip inline-block se comportă astfel:
- Respectă proprietățile
widthșiheight. Margin,paddingșiborderinfluențează poziționarea altor elemente din jur.- Nu produce o rupere de linie, dar poate fi mai mare decât conținutul, dacă se setează dimensiuni explicite.
În exemplul următor, am aplicat display: inline-block; unui element span. Poți
schimba valoarea cu block sau o poți elimina complet pentru a observa diferențele.
Acest comportament este extrem de util, de exemplu, atunci când dorim ca un link să aibă o zonă clicabilă mai
mare, prin adăugarea de padding.
Elementul <a> este, în mod implicit, de tip inline, la fel ca
<span>. Prin aplicarea display: inline-block;, putem extinde zona activă a
linkului, oferind o experiență mai bună utilizatorului.
Veți întâlni această tehnică frecvent în barele de navigare.
În exemplul următor, bara de navigare este afișată în linie (row) cu ajutorul
Flexbox. Am adăugat padding și o culoare de fundal pentru linkuri, care se
modifică la :hover.
Inițial, padding-ul pare să se suprapună peste chenarul <ul>, deoarece
<a> este de tip inline. Adăugând display: inline-block; în regula
.lista-link a, problema se rezolvă și spațiul este respectat corect.
Fundaluri și chenare
În această secțiune vom explora ce se poate realiza cu fundalurile (background) și chenarele
(border) din perspectiva creativității și a designului modern.
Stilizarea fundalurilor cu ajutorul CSS
Proprietatea background este o formă prescurtată care combină mai multe proprietăți
individuale, precum background-color, background-image,
background-position, background-size, background-repeat și
background-attachment.
Exemplul de mai jos este complex, deoarece combină mai multe fundaluri într-o singură declarație:
.box {
background: linear-gradient(105deg, rgba(255,255,255,.2) 39%, rgba(51,56,57,1) 96%) center center / 400px 200px no-repeat,
url(big-star.png) center no-repeat,
red;
}
💡 Recomandare: Pentru fundaluri responsive, folosește background-size: cover;
sau contain și evită dimensiuni fixe dacă designul trebuie să se adapteze la ecrane diferite.
Culori de fundal
Proprietatea background-color definește culoarea de fundal a unui element. Aceasta acceptă orice valoare validă de culoare și se aplică sub conținutul și umplutura elementului.
Sintaxa:
background-color: red;- valoare cuvânt-cheiebackground-color: #bbff00;- valoare hexazecimalăbackground-color: rgb(255, 255, 128);- valoare RGBbackground-color: rgba(117, 190, 218, 0.5);- valoare RGBA, 50% transparentbackground-color: hsl(50, 33%, 25%);- valoare HSLbackground-color: hsla(50, 33%, 25%, 0.75);- valoare HSLA, 75% transparentbackground-color: currentcolor;- culoarea curentă a textuluibackground-color: transparent;- fundal transparentbackground-color: inherit;- moștenește culoarea de la elementul părintebackground-color: initial;- revine la valoarea inițialăbackground-color: unset;- resetează la moștenit sau inițial, în funcție de context
În exemplul următor, am utilizat diferite valori pentru a adăuga culoare de fundal pentru cutie, titlu și un
element span.
Imagini de fundal
Proprietatea background-image permite adăugarea uneia sau mai multor imagini în fundalul unui element HTML.
Imaginile sunt stivuite una peste alta: prima imagine declarată este afișată în prim-plan, iar celelalte se plasează în spatele acesteia, în ordinea în care apar în cod.
În exemplul următor avem două imagini: una mai mare decât cutia și alta mai mică.
Exemplul demonstrează două lucruri:
- Imaginea mai mare nu este redimensionată automat pentru a încăpea în cutie, deci se afișează doar parțial.
- Imaginea mai mică este repetată automat pentru a umple spațiul disponibil.
Dacă se specifică atât o culoare de fundal cât și o imagine, imaginea va fi afișată deasupra culorii.
Este recomandat să specifici o culoare de fundal ca backup, pentru situațiile în care imaginea nu se încarcă.
Sintaxă
background-image:
linear-gradient(to bottom, rgba(255, 255, 0, 0.5), rgba(0, 0, 255, 0.5)),
url("../imagini/imagine.jpg");
-----------------------------
background-image: none;
💡 Recomandare: Pentru performanță optimă, folosește imagini SVG sau WebP acolo unde este
posibil și evită fundaluri grele pe elemente interactive. De asemenea, folosește
background-size: cover; pentru a asigura o acoperire completă și estetică pe ecrane variate.
Controlul repetării fundalului
Proprietatea background-repeat este utilizată pentru a controla comportamentul de repetare al imaginilor de fundal.
Valorile disponibile sunt:
no-repeat- oprește complet repetarea imaginiirepeat-x- repetare pe orizontalărepeat-y- repetare pe verticalărepeat- repetare în ambele direcții (valoare implicită)
Încercați aceste valori în exemplul de mai jos pentru a vedea efectul obținut.
Dimensionarea imaginilor de fundal
În exemplul de mai sus, am observat cum o imagine este decupată atunci când containerul în care se află este mai mic decât imaginea în sine.
În această situație, putem folosi proprietatea background-size, care acceptă valori de lungime sau procentaj, pentru a potrivi imaginea în fundal.
Se pot folosi și valorile:
- cover - imaginea va fi suficient de mare încât să acopere complet containerul, păstrând proporțiile. Este posibil ca o parte din imagine să fie tăiată.
- contain - imaginea va fi redimensionată astfel încât să încapă complet în container. Dacă raportul de aspect al imaginii diferă de cel al containerului, pot apărea spații goale.
În exemplul de mai jos, am folosit o imagine mai mare și am aplicat unități de lungime pentru a o potrivi în interiorul cutiei. Veți observa că imaginea este distorsionată.
Încercați următoarele lucruri:
- Modificați unitățile de lungime
- Eliminați unitățile și folosiți valorile cover sau contain
pentru
background-size
Poziționarea imaginii de fundal
Proprietatea background-position ne permite să alegem poziția în care apare imaginea în interiorul cutiei.
Este utilizat un sistem de coordonate în care colțul din stânga sus al cutiei este punctul (0,0), iar poziționarea se face de-a lungul axelor orizontale (X) și verticale (Y).
☞ Valoarea implicită (default) pentru proprietatea
background-position este 0 0.
Cel mai frecvent, poziționarea se face cu două valori: una pentru direcția orizontală și una pentru direcția verticală.
Se pot folosi cuvinte cheie precum top, left, bottom,
right:
.box {
background-image: url("star.svg");
background-repeat: no-repeat;
background-position: top center;
}
Se pot folosi și valori de lungime și procente:
.box {
background-image: url("star.svg");
background-repeat: no-repeat;
background-position: 20px 10%;
}
Este permis și un mix între cuvinte cheie și valori numerice:
.box {
background-image: url("star.svg");
background-repeat: no-repeat;
background-position: top 20px;
}
În unele cazuri, se pot folosi patru valori pentru a indica distanța față de margini:
.box {
background-image: url("star.svg");
background-repeat: no-repeat;
background-position: top 20px right 10px;
}
În exemplul următor, puteți testa aceste variante pentru a poziționa imaginea în interiorul cutiei:
Utilizarea gradientului de culoare pentru fundal
Când se utilizează un gradient pentru culoarea de fundal, acesta se comportă ca o imagine și poate fi setat prin utilizarea proprietății background-image.
Există pe Internet generatoare de gradienți, pe care le puteți utiliza pentru a genera codul sursă, pe care apoi îl puteți copia și aplica în documentul CSS.
În exemplul de mai jos puteți vedea un gradient liniar și unul radial care se repetă.
Atașarea de fundal - Background attachment
O altă opțiune disponibilă pentru fundaluri este modul în care acestea se comportă atunci când se face scroll.
Acest comportament este controlat prin intermediul proprietății background-attachment, care poate avea următoarele valori:
- scroll - face ca imaginea de fundal să se deruleze odată cu pagina. Dacă se derulează conținutul elementului, fundalul rămâne fix în interiorul acelui element.
- fixed - face ca fundalul să fie fix, atașat de viewport. Nu se va mișca nici când este derulat conținutul elementului, nici când este derulată pagina. Fundalul rămâne mereu în aceeași poziție.
- local - această valoare a fost adăugată mai târziu și face ca fundalul să fie atașat de elementul pe care este setat. Astfel, fundalul se va mișca odată cu conținutul acelui element.
Proprietatea background-attachment are efect doar atunci când există suficient conținut care poate fi derulat. De aceea, exemplul următor este conceput astfel încât să puteți observa diferențele dintre cele trei valori:
Background - utilizarea formei scurte
Utilizarea formei scurte permite setarea tuturor proprietăților diferite, simultan.
Când se utilizează fundaluri multiple, trebuie specificate toate proprietățile pentru primul fundal, apoi, după virgulă, se adaugă următorul fundal și așa mai departe.
În exemplul următor veți vedea un gradient cu mărimea și poziția setate, apoi o imagine de fundal care nu se repetă și, în cele din urmă, o culoare de fundal.
Când se utilizează forma scurtă a proprietății background, trebuie respectate câteva reguli:
- Culoarea de fundal trebuie specificată după ultima virgulă,
- Valoarea pentru background-size poate fi introdusă doar după proprietatea background-position, separată de o bară oblică, astfel: center/80%.
background: no-repeat center/80% url("../imagini/imagine.png");
☞ Atunci când poziționați text deasupra unei imagini sau a unui fundal colorat, trebuie să aveți grijă să existe suficient contrast, astfel încât textul să fie ușor de citit de către utilizatori.
Dacă utilizați o imagine de fundal peste care plasați text, este recomandat să setați și o culoare de fundal, pentru ca textul să rămână vizibil în cazul în care imaginea nu se încarcă.
Cititoarele de ecran nu pot analiza imaginile, motiv pentru care acestea ar trebui utilizate doar în scop decorativ. Orice conținut important trebuie să fie introdus în documentul HTML și nu în fundal.
Chenare - Borders
Când am studiat modelul cutiei, am putut observa cum influențează chenarele dimensiunea acesteia. Acum vom explora cum putem folosi chenarele într-un mod creativ.
De regulă, vom utiliza forma scurtă border, în care setăm dimensiunea, tipul și culoarea chenarului într-o singură linie, aplicabilă tuturor celor patru laturi ale cutiei:
.cutie {
border: 1px solid black;
}
Dar putem viza și o singură latură, de exemplu:
.cutie {
border-top: 1px solid black;
}
Putem folosi și proprietăți individuale:
.cutie {
border-width: 1px;
border-style: solid;
border-color: black;
}
Sau:
.cutie {
border-top-width: 1px;
border-top-style: solid;
border-top-color: black;
}
Există o varietate de stiluri care pot fi utilizate pentru personalizarea chenarelor. În exemplul următor, am folosit stiluri diferite pentru fiecare latură a cutiei.
Colțuri rotunjite
Colțurile unei cutii pot fi rotunjite prin intermediul proprietății border-radius, aceasta fiind forma scurtă. Alternativ, putem folosi forma lungă pentru a stiliza fiecare colț în parte.
Pot fi utilizate două valori (lungimi sau procente): prima pentru rotunjirea orizontală, iar a doua pentru rotunjirea verticală. Totuși, în majoritatea cazurilor se folosește o singură valoare.
De exemplu, pentru a rotunji toate cele patru colțuri, vom folosi:
.cutie {
border-radius: 10px;
}
Pentru o singură latură, putem scrie:
.cutie {
border-top-right-radius: 1em 10%;
}
În exemplul următor, am setat toate cele patru colțuri cu o valoare generală, apoi am modificat doar colțul din dreapta sus:
Forme creative cu border-radius
Proprietatea border-radius poate fi folosită nu doar pentru rotunjirea colțurilor, ci și pentru a crea forme spectaculoase, precum cercuri, capsule sau chiar forme organice. Iată câteva exemple:
Controlul revărsării cu overflow
CSS ne oferă o proprietate specială - overflow - care ne permite să controlăm comportamentul conținutului atunci când acesta depășește dimensiunile unei cutii.
Valori posibile pentru overflow:
- visible - conținutul care depășește cutia va fi afișat în afara acesteia (comportamentul implicit);
- hidden - conținutul care nu încape va fi ascuns;
- scroll - se adaugă bare de derulare, indiferent dacă este nevoie sau nu;
- auto - se adaugă bare de derulare doar dacă este necesar.
Iată un exemplu în care folosim overflow: auto pentru a permite derularea verticală:
În exemplul de mai sus, conținutul care depășește înălțimea cutiei poate fi accesat prin derulare, fără a afecta restul layout-ului.
Este recomandat să testați comportamentul overflow în diferite scenarii, mai ales când lucrați cu
componente responsive sau când anticipați conținut dinamic.
Recomandări pentru o experiență accesibilă
- Evitați
overflow: hiddenpentru elemente care conțin informații importante. - Folosiți
overflow-wrapsauword-breakpentru a preveni revărsarea orizontală a textului. - Asigurați-vă că elementele interactive (butoane, linkuri) nu sunt ascunse din cauza limitărilor de spațiu.
Proprietatea overflow
Proprietatea overflow este cea care ne permite să controlăm revărsarea conținutului dintr-o cutie.
Valoarea implicită este visible, ceea ce înseamnă că vom putea vedea conținutul care depășește dimensiunile cutiei.
Pentru a ascunde conținutul revărsat, putem folosi valoarea hidden. În acest caz, conținutul care nu încape va fi complet ascuns, cu riscul pierderii de informații.
Dacă doriți să nu pierdeți conținutul, puteți afișa bare de scroll permanent, chiar și atunci când nu există conținut revărsat, folosind overflow: scroll;.
În exemplul de mai sus, apar bare de scroll atât pe verticală, cât și pe orizontală. Totuși, dacă dorim doar bara verticală, putem folosi overflow-y: scroll.
Deschideți exemplul și înlocuiți overflow: scroll; cu overflow-y: scroll; pentru a
vedea rezultatul.
De asemenea, putem afișa doar bara de scroll orizontală. Deschideți exemplul următor și decomentați linia
/*overflow-x: scroll;*/.
Totuși, metoda de mai sus nu este recomandată. Pentru a rezolva situațiile în care un cuvânt prea lung nu încape într-o cutie, se recomandă utilizarea proprietăților word-break sau overflow-wrap.
☞ Se pot afișa bare de scroll simultan pe axa X și Y, folosind două valori pentru proprietatea overflow. Prima valoare se aplică pe axa X (orizontală), iar a doua pe axa Y (verticală).
De exemplu, overflow: scroll hidden; va afișa bara de scroll pe orizontală și va ascunde
conținutul pe verticală.
Dacă doriți ca barele de scroll să apară automat doar când este necesar, folosiți overflow: auto;. Astfel, browserul va decide când să afișeze barele de defilare.
În exemplul următor, decomentați linia overflow: auto; pentru a vedea comportamentul dinamic.
Text care nu încape - text-overflow
În cazul în care avem un text prea lung pentru spațiul disponibil, putem controla modul în care este afișat folosind proprietatea text-overflow.
Cel mai des folosită este valoarea ellipsis, care va afișa trei puncte (…) la finalul textului tăiat.
Pentru ca text-overflow: ellipsis; să funcționeze corect, trebuie să respectăm următoarele
condiții:
- Elementul trebuie să aibă
white-space: nowrap; - Trebuie să existe o lățime fixă (
width) - Trebuie să fie setat
overflow: hidden;
Iată un exemplu:
Acest tip de afișare este ideal pentru titluri, butoane sau orice element unde spațiul este limitat și nu dorim ca textul să se rupă pe mai multe linii.
☞ Dacă doriți ca textul să se încadreze pe mai multe linii, folosiți
overflow-wrap: break-word; sau word-break: break-all; în loc de
white-space: nowrap;.
Formatare bloc de context - Block Formatting Context (BFC)
BFC se referă la un concept din CSS, conform căruia, atunci când se utilizează proprietatea overflow: scroll; (de exemplu), se creează un mini-layout, o mini-pagină în document, cu un comportament independent. Elementele din jur nu pot intra în acea cutie și nimic din acea cutie nu poate ieși.
Acest lucru permite o derulare eficientă și consistentă în cutia care are afișate barele de scroll, fără interferențe cu elementele din jur.
Evitarea revărsării conținutului în web design
După cum vom vedea mai târziu, metodele moderne de machetare (layout) gestionează destul de bine revărsarea conținutului, deoarece au fost concepute având în vedere faptul că nu putem prezice cât conținut vom avea într-un document sau într-o cutie dintr-un document.
În trecut se utilizau înălțimi fixe, în încercarea de a alinia cutiile, care de altfel nu aveau legătură între ele, rezultând layout-uri fragile, cu dese suprapuneri de conținut.
Într-o situație ideală, nu vom utiliza înălțimi fixe pentru cutiile dintr-un document HTML.
Atunci când dezvoltați un site, trebuie să acordați o atenție deosebită situațiilor care pot genera revărsare de conținut.
Ar trebui să testați site-ul folosind diferite cantități de conținut, să modificați dimensiunea fontului și să vă asigurați că site-ul se comportă robust, iar codul CSS nu creează probleme.
Afișarea barelor de scroll este, de regulă, rezervată pentru situații cu adevărat speciale, în care chiar dorim să le afișăm.
Metode avansate de stilizare a cutiilor
În această secțiune vă voi arăta câteva tehnici și metode avansate de stilizare a cutiilor.
Umbrele cutiei - Box shadows
Proprietatea box-shadow vă permite să adăugați umbre unei cutii. La fel ca umbrele de text, acestea sunt destul de bine acceptate de către browsere, inclusiv IE9+ și Edge.
Umbră simplă
Pentru început, să ne uităm la un exemplu simplu.
Așa cum se poate vedea, valoarea proprietății box-shadow conține 4 elemente:
.simple-shadow {
box-shadow: 10px 10px 10px rgba(0,0,0,0.7);
}
- Prima valoare de lungime reprezintă poziționarea (decalarea) orizontală (horizontal offset) - distanța dintre umbră și poziția cutiei, spre dreapta (valoare pozitivă) sau spre stânga (valoare negativă);
- A doua valoare de lungime reprezintă decalarea verticală - în jos (valoare pozitivă) sau în sus (valoare negativă);
- A treia valoare de lungime reprezintă raza de estompare (blur radius) - cantitatea de blur aplicată umbrei;
- Culoarea este dată de culoarea de bază a umbrei.
Umbre multiple
Pot fi atribuite mai multe umbre aceleiași cutii, prin separarea cu virgulă a declarațiilor multiple:
.simple-shadow {
box-shadow: 1px 1px 1px white,
2px 2px 1px white,
3px 3px 1px lime,
4px 4px 1px lime,
5px 5px 1px black,
6px 6px 1px black;
}
Exemplul de mai sus este unul amuzant, dar se pot crea umbre multiple cu un aspect mai realist, bazat pe mai multe surse de lumină.
Spre deosebire de text-shadow, pentru box-shadow se poate utiliza valoarea inset, ceea ce va duce la mutarea și manipularea poziției umbrei în interiorul cutiei.
În exemplul următor am configurat un buton și câteva stări ale acestuia, respectiv focus / hover / active. Butonul are o umbră implicită de culoare neagră și două umbre interioare, una albă și una neagră, plasate în colțuri opuse, pentru a-i conferi un efect interesant.
Când butonul este apăsat, starea activă face ca prima umbră să fie înlocuită de o umbră interioară, conferind aspectul apăsării butonului.
☞ Există și un alt element care poate fi adăugat proprietății box-shadow, și anume o valoare suplimentară de lungime, care se introduce chiar înainte de setarea culorii. Aceasta se numește spread radius (raza de răspândire) și face ca umbra să devină mai mare decât cutia.
Filtrele - Filters
Filtrele în CSS permit aplicarea unor efecte vizuale asupra elementelor HTML, cum ar fi estomparea, modificarea culorii, luminozitatea sau contrastul. Acestea sunt utile pentru stilizarea imaginilor, fundalurilor sau chiar a textului, oferind un plus de dinamism și expresivitate în designul web.
Exemplu simplu de filtru
În exemplul următor vom aplica un efect de estompare (blur) și de modificare a culorii
(grayscale) asupra unei imagini:
Lista celor mai utilizate filtre CSS
- blur(px) - aplică estompare;
- brightness(%) - ajustează luminozitatea;
- contrast(%) - modifică contrastul;
- grayscale(%) - transformă imaginea în tonuri de gri;
- sepia(%) - aplică un efect sepia (tonuri calde, vintage);
- saturate(%) - intensifică sau reduce saturația culorilor;
- invert(%) - inversează culorile;
- opacity(%) - setează transparența;
- drop-shadow(x y blur color) - adaugă o umbră similară cu
box-shadow, dar aplicată ca filtru.
Combinarea filtrelor
Filtrele pot fi combinate într-o singură linie, separate prin spațiu:
filter: brightness(120%) contrast(90%) sepia(30%);
☞ Filtrele CSS funcționează cel mai bine pe imagini și elemente grafice, dar pot fi aplicate și pe text sau fundaluri. Totuși, este recomandat să testați compatibilitatea în diferite browsere, mai ales dacă folosiți efecte complexe.
Dimensiunea cutiei - Proprietatea box-sizing
În mod implicit, dimensiunile unei cutii în CSS sunt calculate pe baza modelului content-box,
ceea ce înseamnă că width și height se referă doar la conținutul interior, fără a
include padding și border.
Acest comportament poate duce la rezultate neașteptate, mai ales când lucrăm cu layout-uri precise. Din acest motiv, se recomandă utilizarea valorii border-box, care face ca dimensiunile să includă și padding-ul și chenarul.
Compararea celor două modele
În exemplul următor, avem două cutii cu aceeași lățime, dar comportamente diferite în funcție de valoarea
box-sizing:
Rezultatul
- content-box: lățimea totală este
200px + padding + border, deci cutia va fi mai mare decât 200px. - border-box: lățimea totală rămâne 200px, iar padding-ul și chenarul sunt incluse în această dimensiune.
☞ Este o bună practică să setați box-sizing: border-box; global,
pentru a evita calcule complicate și comportamente imprevizibile.
* {
box-sizing: border-box;
}
Stabilirea limitelor - Proprietățile min/max-width și min/max-height
Aceste proprietăți permit controlul flexibil al dimensiunilor unei cutii, prevenind situații în care elementele devin prea mici sau prea mari.
min-width: stabilește lățimea minimă pe care o poate avea cutia.max-width: stabilește lățimea maximă permisă.min-height: stabilește înălțimea minimă.max-height: stabilește înălțimea maximă.
În exemplul de mai jos, avem o cutie care se redimensionează în funcție de conținut, dar nu poate fi mai mică de 150px și nici mai lată de 400px:
De reținut
- Aceste proprietăți sunt extrem de utile în designul responsive.
- Evită supradimensionarea sau micșorarea excesivă a elementelor.
- Pot fi folosite împreună cu
width: 100%pentru a crea layout-uri fluide, dar controlate.
☞ Exemplu practic: un buton care nu trebuie să fie mai mic de 100px, dar nici mai mare de 300px, indiferent de textul din interior.
Outline vs border - diferențe și utilizări în accesibilitate
Deși ambele creează un contur în jurul unui element, border și outline au
comportamente diferite și scopuri distincte. border face parte din modelul de box și influențează
dimensiunea elementului. outline este un contur exterior, folosit frecvent pentru evidențierea
focusului, mai ales în contextul accesibilității.
border: afectează dimensiunea și poate fi aplicat pe fiecare latură.outline: nu afectează dimensiunea și se aplică uniform în jurul elementului.outlinenu poate fi rotunjit cuborder-radius.outline-offset: permite distanțarea conturului față de element.
În exemplul de mai jos, avem un buton cu border permanent și outline care apare la
focus:
De reținut
outlineeste esențial pentru utilizatorii care navighează cu tastatura.- Nu elimina
outlinefără a oferi o alternativă clară pentru focus. - Poți combina
borderpentru stil șioutlinepentru accesibilitate.
☞ Exemplu practic: un formular accesibil trebuie să evidențieze câmpurile
active cu outline, nu doar cu schimbări subtile de culoare.
Defilare elegantă - Proprietatea scroll-behavior
Proprietatea scroll-behavior controlează modul în care se face defilarea în pagină. Valoarea
smooth creează o tranziție lină, ideală pentru navigații moderne, fără salturi bruște.
auto: comportamentul implicit, fără tranziție.smooth: defilare lină, cu efect vizual plăcut.
În exemplul de mai jos, linkurile duc către secțiuni din pagină, iar defilarea se face lin datorită
scroll-behavior: smooth:
De reținut
- Se aplică pe elementul
htmlsau pe containere individuale. - Funcționează doar cu linkuri interne (
href="#id"), nu cu rola mouse-ului. - Poate fi combinat cu JavaScript pentru efecte mai complexe.
☞ Exemplu practic: un buton „Back to top” care duce utilizatorul înapoi sus, fără șocuri vizuale.
Magie vizuală - Proprietatea backdrop-filter
backdrop-filter aplică efecte grafice (precum blur sau contrast) asupra fundalului unui element
semi-transparent. Este ideal pentru interfețe moderne, unde vrei ca fundalul să rămână vizibil, dar estompat.
blur(): estompează fundalul.brightness(): ajustează luminozitatea.contrast(): modifică contrastul.saturate(): intensifică culorile.grayscale(): transformă fundalul în alb-negru.
În exemplul de mai jos, avem o secțiune cu fundal blurat, peste o imagine:
De reținut
- Funcționează doar pe elemente cu fundal semi-transparent (
rgbasautransparent). - Necesită suport din partea browserului - funcționează în Chrome, Edge, Safari, dar nu în toate versiunile de Firefox.
- Poți combina mai multe filtre pentru efecte complexe.
☞ Exemplu practic: un meniu fix cu fundal blurat peste conținutul paginii - elegant și ușor de citit.
Proporții precise - Proprietatea aspect-ratio
aspect-ratio permite stabilirea unui raport fix între lățimea și înălțimea unui element. Este
extrem de utilă pentru imagini, videoclipuri, carduri sau orice cutie care trebuie să-și păstreze forma
indiferent de conținut.
aspect-ratio: 1 / 1- pătrat perfect.aspect-ratio: 16 / 9- format video widescreen.aspect-ratio: 3 / 4- proporție verticală, ideală pentru portrete.
În exemplul de mai jos, avem trei cutii cu proporții diferite, dar toate se redimensionează păstrând raportul:
De reținut
aspect-ratiofuncționează fără să fie nevoie depadding hackssauJavaScript.- Este suportat în majoritatea browserelor moderne.
- Poate fi folosit împreună cu
object-fitpentru imagini responsive.
☞ Exemplu practic: un grid de carduri care păstrează proporția indiferent de conținut - ideal pentru galerii sau portofolii.
Controlul imaginilor - Proprietatea object-fit
Proprietatea object-fit controlează modul în care o imagine sau un videoclip se potrivește într-un
container cu dimensiuni fixe. Este extrem de utilă atunci când dorim să păstrăm proporția imaginii fără să o
deformăm.
fill: imaginea umple complet containerul, poate fi distorsionată.contain: imaginea se redimensionează pentru a încăpea complet, păstrând proporția.cover: imaginea acoperă containerul, păstrând proporția, dar poate fi tăiată.none: imaginea nu este redimensionată.scale-down: similar cunonesaucontain, în funcție de ce se potrivește mai bine.
În exemplul de mai jos, avem trei imagini cu dimensiuni fixe, fiecare cu un comportament diferit:
De reținut
object-fitfuncționează doar pe elemente media:<img>,<video>,<picture>.- Este ideal pentru carduri, galerii, profile sau bannere responsive.
- Poate fi combinat cu
aspect-ratiopentru control total al proporțiilor.
☞ Exemplu practic: imaginea de profil a unui utilizator care trebuie să rămână pătrată și să nu fie tăiată sau deformată.
Poziționarea elementelor - Proprietățile position și z-index
Cu position putem controla exact unde apare un element pe pagină. Iar cu z-index
decidem cine stă „deasupra” când elementele se suprapun.
static: poziția implicită, fără modificări.relative: se mișcă față de poziția sa inițială.absolute: se poziționează față de cel mai apropiat părinterelative.fixed: rămâne fixat pe ecran, chiar și la scroll.sticky: se comportă carelativepână la un punct, apoi devinefixed.
Avem trei cutii colorate care se suprapun. Fiecare are o poziție diferită și un z-index care
decide ordinea:
De reținut
absolutese bazează pe un părinte cuposition: relative.z-indexfuncționează doar pe elemente poziționate (relative,absolute, etc.).- Valoarea
z-indexmai mare înseamnă „mai în față”.
☞ Exemplu practic: un meniu fixat în colțul paginii care rămâne vizibil la scroll, peste conținut.
Eliminarea containerului vizual - display: contents
Cu display: contents, containerul HTML dispare vizual, dar **copiii săi rămân activi** în layout
și stil. Este ca și cum ai „dizolva” cutia, păstrând ce e înăuntru.
- Elementul părinte nu mai generează o cutie în layout.
- Copiii se comportă ca și cum ar fi direct în containerul superior.
- Util pentru simplificarea structurii vizuale fără a modifica HTML-ul.
Avem două secțiuni identice, dar una folosește display: contents. Vezi diferența în stil și
spațiere:
De reținut
display: contentsnu funcționează pe toate elementele (ex:<table>).- Evenimentele JS și stilurile CSS aplicate pe container pot fi pierdute.
- Ideal pentru layout-uri flexibile sau când vrei să „spargi” o structură fără să modifici HTML-ul.
☞ Exemplu practic: un wrapper folosit doar pentru organizare, dar care nu trebuie să afecteze stilul vizual.
Izolarea stilului și layout-ului - Proprietatea contain
contain este o proprietate CSS care izolează un element de restul paginii, pentru a îmbunătăți
performanța și a preveni efecte neprevăzute în layout.
- Relevanță: crește viteza de randare și previne interferențe între stiluri.
- Utilizare: se aplică pe componente independente, cum ar fi carduri, secțiuni sau widget-uri.
- Valori utile:
layout,style,paint,size,content.
Avem două carduri identice. Al doilea are contain: layout style;, ceea ce îl izolează de restul
layout-ului:
De reținut
containeste esențial pentru componente web moderne.- Previne ca stilurile externe să afecteze layout-ul intern.
- Crește performanța prin reducerea recalculărilor de stil și layout.
☞ Exemplu practic: un widget de chat sau un card de produs care trebuie să rămână stabil indiferent de ce e în jurul lui.
🧠 Quiz - Stilizarea cutiilor cu CSS
