You are on the editable version of MDN Web Docs

View as an MDN Web Docs user: https://developer.mozilla.org/ca/docs/Learn/CSS/Building_blocks/Cascada_i_herència

L’objectiu d’aquest article és desenvolupar la comprensió d’alguns dels conceptes més fonamentals del CSS (la cascada, l’especificitat i l’herència) que controlen com s’aplica el CSS a l’HTML i com es resolen els conflictes.

Si bé pot semblar que és menys rellevant i una mica més acadèmic que algunes altres parts del curs, la seva comprensió t'estalviarà feina més endavant! T’animem a treballar aquesta secció en profunditat i comprovar que entens els conceptes abans de continuar endavant.

Prerequisits: Coneixements bàsics d'informàtica, tenir el programari bàsic instal·lat, coneixements bàsics de com treballar amb fitxers i d'HTML (mira Introducció a l'HTML) i nocions bàsiques de com funciona el CSS.
Objectiu: Aprendre què són la cascada i l'especificitat, i com funciona l'herència en CSS.

Regles conflictives

CSS significa fulls d'estil en cascada (cascading style sheets), i es molt important entendre la paraula, cascada; el comportament de la cascada és clau per a comprendre el CSS.

En algun moment treballaràs en un projecte i trobaràs que el CSS que creus que s’hauria d’aplicar a un element no funciona. Normalment, el problema és que has creat dues regles que podrien aplicar-se al mateix element. La cascada i el concepte d’especificitat, que estan estretament relacionats, són mecanismes que controlen quina regla s'aplica quan hi ha aquest conflicte. La regla que dona estil al teu element pot ser que no sigui la que esperaves, per la qual cosa has d'entendre com funcionen aquests mecanismes.

Aquí també és important el concepte d'herència, que significa que algunes propietats CSS per defecte hereten valors establerts per a l'element pare, i d'altres no. Això també pot causar algun comportament que potser no esperes.

Comencem per fer una ullada ràpida als elements clau que tractem i, a continuació, examinarem com interaccionen entre si i amb el CSS. Poden semblar un conjunt de conceptes complicats d’entendre. A mesura que vagis adquirint pràctica a l'hora d’escriure CSS, se’t farà més evident la manera que té de funcionar.

La cascada

Fulls d’estil en cascada: en un nivell molt senzill això significa que l’ordre de les regles CSS és important; quan s’apliquen dues regles que tenen la mateixa especificitat, la que s’utilitza és l'última que surt al codi CSS.

En l’exemple següent hi ha dues regles que podrien aplicar-se a h1. h1 acaba sent de color blau: aquestes regles tenen un selector idèntic i, per tant, porten la mateixa especificitat, de manera que l’última regla en el full d'estil guanya.

 

Especificitat

L’especificitat és la manera com el navegador decideix quina regla s’aplica si diverses regles tenen selectors diferents i poden aplicar-se al mateix element. Bàsicament és una mesura de com d'específica serà la selecció d'un selector:

  • Un selector d’elements és menys específic (selecciona tots els elements d’un mateix tipus que apareixen en una pàgina) i, per tant, obté una puntuació més baixa.
  • Un selector de classes és més específic: només selecciona els elements d'una pàgina que tenen un valor d'atribut class específic, de manera que obté una puntuació més alta.

Vegem-ne un exemple! A continuació, tornem a tenir dues regles que podrien aplicar-se a h1. L’encapçalament h1 següent acaba sent de color vermell: el selector de classe dona a aquesta regla una especificitat més alta, i per tant s'aplica encara que la regla amb el selector d'elements apareix més avall en el full d'estil.

 

Més endavant explicarem la puntuació de l'especificitat.

Herència

L’herència també s’ha d’entendre en aquest context: els elements fill hereten alguns valors de propietat CSS que s’han establert en els elements pare, i no n’hereten d’altres.

Per exemple, si configures un element color i un font-family per a un element, aquest color i tipus de lletra també s’apliquen a tots els elements que hi hagi a dintre, tret que els hi hagis aplicat valors de color i lletra diferents directament.

 

Algunes propietats no s'hereten. Per exemple, si estableixes una amplada (width) del 50% per a un element, cap dels seus elements descendents adquireix una amplada del 50% de l'amplada de l'element pare. Si fos així, seria molt frustrant utilitzar CSS!

Nota: A les pàgines de referència de les propietats CSS de MDN, pots trobar un quadre d'informació tècnica, normalment a la part inferior de la secció d'especificacions, que enumera diversos punts de dades sobre aquesta propietat, inclòs si s'hereta o no. Consulta, per exemple, la secció Especificacions de la propietat del color.

Entendre com interaccionen els conceptes

Aquests tres conceptes controlen quin CSS s'aplica a cada element. En les seccions següents veurem com funcionen conjuntament. De vegades pot semblar una mica complicat, però començaràs a recordar-los a mesura que guanyis experiència amb el CSS, i sempre ho pots tornar a buscar si se t'obliden els detalls. Fins i tot als desenvolupadors experimentats els costa recordar tots els detalls.

Comprendre l’herència

Començarem per l'herència. En l'exemple següent hi ha un element <ul>, que conté dos nivells de llistes no ordenades. Hem definit per a l'element exterior <ul> una vora i un farciment, i n’hem canviat el color de la lletra.

El color s’ha aplicat als fills directes i també als indirectes: els elements fill immediats (<li>) i els que hi ha a la primera llista imbricada. Després, hem afegit una classe special a la segona llista imbricada i hi hem aplicat un color diferent, el qual hereten els fills d’aquesta.

 

No s'hereten propietats com l'amplada (com ja s'ha esmentat), els marges, els farciments i les vores. Si els fills de la nostra llista haguessin d’heretar una vora, cada llista i element de llista obtindria una vora, i probablement no sigui un efecte que vulguem.

Quines propietats s'hereten de manera predeterminada i quines no, es en bona mesura qüestió de sentit comú.

Control de l’herència

El CSS proporciona quatre valors especials de propietat universal per a controlar l’herència. Totes les propietats CSS admeten aquests valors.

inherit
Estableix el valor de la propietat aplicat a un element seleccionat perquè sigui igual que el de l’element pare. Això, en efecte, «activa l'herència».
initial
Estableix que el valor de la propietat que s’aplica a l’element que se selecciona sigui igual que el valor que el full d'estil predeterminat del navegador estableix per a la propietat d’aquest element. Si el full d’estil predeterminat del navegador no estableix cap valor i la propietat s’hereta de manera natural, el valor de la propietat s’estableix en inherit.
unset
Restableix la propietat al seu valor natural, cosa que significa que si la propietat s’hereta naturalment, actua com a inherit, i en cas contrari, actua com a initial.

Nota: També hi ha un valor més recent, revert, que té un suport limitat per part dels navegadors.

Nota: Consulta la secció Origin of CSS declarations in Introducing the CSS Cascade per obtenir més informació sobre cadascuna d'elles i el seu funcionament.

Podem observar una llista d’enllaços i analitzar com funcionen els valors universals. L’exemple en viu següent et permet jugar amb el CSS i veure què passa si hi fas canvis. Jugar amb el codi és realment la millor manera d’arribar a conèixer l'HTML i el CSS.

Per exemple:

  1. El segon element de llista té aplicada la classe my-class-1. Estableix el color que hereta l’element <a> que té imbricat. Com canvia el color de l'enllaç si suprimeixes la regla?
  2. Entens per què el tercer i el quart enllaços són del color que són? Si no és així, repassa la descripció dels valors anteriors.
  3. Quin dels enllaços canvia de color si defineixes un color nou per a l'element <a>, per exemple a { color: red; }?

 

Restablir tots els valors de propietat

La propietat CSS abreviada all es pot utilitzar per a aplicar un d’aquests valors d’herència a (gairebé) totes les propietats alhora. El seu valor pot ser qualsevol dels valors d'herència (inherit, initial, unset o revert). És una manera còmoda de desfer els canvis que s’han aplicat a l’estil de manera que puguis tornar a un punt de partida conegut abans d'introduir canvis nous.

En l’exemple següent hi ha dues citacions de bloc. La primera té un estil que s’aplica directament sobre la citació de bloc, mentre que la segona té una classe aplicada a la citació de bloc que estableix el valor de all en unset.

 

Prova d’establir el valor all a alguns dels altres valors disponibles i observa quina és la diferència.

Entendre la cascada

Ara entenem per què un paràgraf que està profundament imbricat dins l'estructura del teu HTML és del mateix color que el CSS que s’ha especificat per a body, i entenem per què canvia el CSS que, de les lliçons introductòries, hem aplicat a algun element en qualsevol punt del document, ja sigui assignant CSS a un element o creant una classe. Ara farem una ullada de més a prop a com la cascada defineix quines regles CSS s'apliquen quan hi ha més d'un situació que pot aplicar estil a un element.

Cal considerar tres factors, en un ordre d'importància creixent. Els posteriors anul·len els anteriors:

  1. Ordre dins el codi
  2. Especificitat
  3. Importància

Ara els analitzarem i descobrirem com els navegadors determinen quin CSS han d’aplicar.

Ordre dins el codi

Ja hem vist com l’ordre dins el codi és important en la cascada. Si hi ha més d’una regla, amb exactament el mateix pes, guanya la que apareix última en el CSS. Pots veure-ho com que les regles que són més properes a l'element sobreescriuen les anteriors fins que l'última guanya i estableix el disseny que es dona a l'element.

Especificitat

Un cop entès el fet que l’ordre dins el codi importa, en algun moment et pots topar amb una situació en què saps que no s’aplica la regla que apareix l’última en el full d’estil, sinó una d’anterior. Això es deu al fet que aquesta regla anterior té una especificitat més elevada: és més específica i, per tant, el navegador la tria per donar estil a l'element.

Com hem vist abans en aquest article, un selector de classes té més pes que un selector d’elements, de manera que les propietats definides per a la classe anul·len les que s’apliquen directament per a l’element.

Una observació important que cal fer aquí és que, tot i que pensem en selectors i regles que s’apliquen a l'element que seleccionen, no es sobreescriu tota la regla, sinó només les propietats que són iguals.

Aquest comportament ajuda a evitar repeticions dins el CSS. Una pràctica habitual és definir estils genèrics per als elements bàsics, i després crear classes per a aquells que són diferents. Per exemple, en el full d’estil següent hem definit estils genèrics per a títols d’encapçalament de nivell 2 i després hem creat algunes classes que canvien només algunes propietats i valors. Els valors definits inicialment s'apliquen a tots els títols d’encapçalament, i els valors més específics s'apliquen als títols d’encapçalament en què s'ha establert alguna classe.

 

Observa ara com calcula l’especificitat el navegador. Ja saps que un selector d’elements té una especificitat baixa i una classe el pot sobreescriure. Essencialment s’atorga un valor en punts als diferents tipus de selectors i, si se sumen, s’obté el pes concret de cada selector, que pot avaluar-se respecte d’altres coincidències potencials.

La quantitat d'especificitat que presenta un selector es mesura a partir de quatre valors (o components) diferents, que es poden entendre com si fossin milers, centenes, desenes i unitats; quatre dígits simples disposats en quatre columnes:

  1. Milers: suma un punt en aquesta columna si la declaració es troba continguda dins d’un atribut style, també conegut com estil de línia. Aquestes declaracions no tenen selectors, de manera que la seva especificitat és sempre de 1.000.
  2. Centenes: suma un punt en aquesta columna per cada selector d’identificador que està contingut en el selector global.
  3. Desenes: suma un punt en aquesta columna per cada selector de classe, selector d'atributs o de pseudoclasse que està contingut dins del selector general.
  4. Unitats: suma un punt en aquesta columna per cada selector d'elements o pseudoelement que està contingut dins del selector general.

Nota: El selector universal (*), els combinadors (+, >, ~, ' ') i la pseudoclasse de negació (:not) no tenen cap efecte sobre l'especificitat.

La taula següent mostra alguns exemples aïllats per posar-te en situació. Estudia aquestes qüestions i assegura't d’entendre per què tenen aquestes especificitats. Encara no hem exposat detalladament els selectors, però pots trobar detalls de cada selector en la pàgina de referència dels selectors de MDN.

Selector Milers Centenes Desenes Unitats Especificitat total
h1 0 0 0 1 0001
h1 + p::first-letter 0 0 0 3 0003
li > a[href*="en-US"] > .inline-warning 0 0 2 2 0022
#identifier 0 1 0 0 0100
Cap selector, amb una regla dins de l’atribut style d'un element 1 0 0 0 1000

Abans de continuar endavant, observa un exemple en acció.

 

Què hi passa, aquí? En primer lloc, només ens interessen les set primeres regles d’aquest exemple i, com ja deus haver observat, hem inclòs els seus valors d’especificitat en un comentari abans de cadascuna.

  • Els dos primers selectors competeixen per donar estil al color de fons de l'enllaç; el segon guanya i fa que el color de fons sigui blau perquè té un selector d’ID addicional en la cadena: l’especificitat és de 201 contra 101.
  • Els selectors tercer i quart competeixen per donar estil al color del text de l'enllaç: el segon guanya i fa que el text sigui blanc perquè, encara que té un selector d'elements de menys, el selector que falta es canvia per un selector de classe, que passa de valdre 1 a valdre 10. Així, doncs, l’especificitat guanyadora és de 113 contra 104.
  • Els selectors 5-7 competeixen per donar estil a la vora de l'enllaç quan el cursor hi passa per sobre. El selector sis perd clarament contra el cinc, amb una especificitat de 23 enfront d’una de 24: té un selector de menys en la cadena. El selector set, però, supera el cinc i el sis: té el mateix nombre de subselectors que cinc en la cadena, però un element ha estat canviat per un selector de classe. Així doncs, l’especificitat guanyadora és 33 contra 23 i 24.

Nota: Aquest ha estat només un exemple aproximat per facilitar-ne la comprensió. En realitat, cada tipus de selector té el seu nivell d'especificitat propi, que no pot ser sobreescrit per selectors amb un nivell d'especificitat inferior. Per exemple, una combinació de selectors d’una classe milió no podrien sobreescriure les regles d’un selector d’ID unitat.

Una manera més precisa d’avaluar l’especificitat seria puntuar els nivells d’especificitat individualment començant pel més alt i descendint quan sigui necessari. Només quan hi hagi un empat entre puntuacions de selector dins d’un nivell d’especificitat, hauràs d'avaluar el nivell següent; en cas contrari, pots prescindir dels selectors de nivell d’especificitat inferior perquè mai podran sobreescriure els nivells d’especificitat més alts.

!important

Hi ha una element especial de CSS que podries utilitzar per substituir tots els càlculs anteriors, però has de tenir molta cura a l'hora de fer-lo servir: !important. S’utilitza per fer que una propietat i un valor particulars tinguin l’especificitat màxima; per tant, anul·la les regles normals de la cascada.

Observa aquest exemple, en què hi ha dos paràgrafs, un dels quals té un selector d’ID.

 

Fes-ne la prova i observa què succeeix. Si et costa d’entendre, prova d’eliminar algunes de les propietats i observa què passa:

  1. Veuràs que els valors color i padding de la tercera regla s'han aplicat, però background-color no ho ha fet. Per què? Els tres haurien d’aplicar-se sense cap problema, perquè les regles posteriors en l’ordre del codi en general anul·len les regles anteriors.
  2. Tanmateix, les regles anteriors guanyen perquè els selectors de classe tenen una especificitat més alta que els selectors d’element.
  3. Els dos elements tenen una class better, però el segon té un id winning. Com que els ID tenen una especificitat encara més elevada que les classes (només es pot tenir un element amb un determinat ID en una mateixa pàgina, però es poden tenir molts elements amb la mateixa classe: els selectors ID són molt específics amb allò que delimiten), el color de fons vermell i la vora negra d'1 píxel s'aplicaran tots dos estils al segon element, mentre que el primer element té un color de fons gris i cap vora, tal i com especifica la classe.
  4. El segon element si adquireix un color de fons vermell, però no té cap vora. Per què? Perquè la declaració !important de la segona regla s’ha inclòs després de border: none, i això vol dir que aquesta declaració obté el valor de la vora border) de la regla anterior, tot i que l'ID té una especificitat més elevada.

Nota: L'única manera de substituir aquesta declaració !important seria incloure una altra declaració !important en una declaració amb la mateixa especificitat que es trobi més endavant en l'ordre del codi, o que presenti una especificitat més alta.

És útil saber que !important existeix perquè sàpigues què és si t’ho trobes en el codi d’algú altre. Tanmateix, et recomanem fermament que no l'utilitzis tret que no tinguis cap altra alternativa. !important canvia el funcionament habitual de la cascada, de manera que pot complicar molt la resolució dels problemes de depuració de CSS, sobretot en un full d’estil.

Una de les situacions en què potser l'has d'utilitzar és quan treballes en un CMS en què no pots editar els mòduls CSS bàsics, però vols substituir un estil que no es pot substituir de cap altra manera. Però, de debò, no ho facis servir si ho pots evitar!

La importància de la ubicació del CSS

Per acabar, és útil tenir en compte també que la importància d’una declaració CSS depèn de quin full d’estil s’especifica; és possible que els usuaris estableixin fulls d’estil personalitzats que anul·lin els estils del desenvolupador. Per exemple, l’usuari pot tenir una deficiència visual i pot voler definir una mida de lletra per a totes les pàgines web que visita que sigui el doble de la mida normal, per a poder llegir amb més facilitat.

En resum

Les declaracions que entren en conflicte s’aplicaran en l’ordre següent, en què les que apareixen amb posterioritat sempre reescriuen les anteriors:

  1. Declaracions en fulls d’estil d’agent d’usuari (per exemple, els estils predeterminats del navegador, que s’utilitzen quan no s’estableix cap altre estil).
  2. Declaracions normals en fulls d’estil de l’usuari (estils personalitzats que estableix un usuari).
  3. Declaracions normals en fulls d'estil d'autor (aquests són els estils que establim nosaltres, els desenvolupadors web).
  4. Declaracions importants en fulls d’estil d’autor.
  5. Declaracions importants en els fulls d'estil de l'usuari.

Té sentit que els fulls d’estil dels desenvolupadors web reemplacin els fulls d’estil dels usuaris, de manera que el disseny es pot mantenir tal i com es pretén, però a vegades els usuaris tenen bons motius per a anul·lar els estils dels desenvolupadors web, com ja s’ha esmentat; això es pot aconseguir amb !important en les regles d’estil.

Posa a prova les teves habilitats

Hem vist moltes coses en aquest article. Ets capaç de recordar-ne la informació més important? A Test your skills: the Cascade trobaràs més proves per verificar que has retingut aquesta informació abans de continuar.

Què segueix?

Si has entès el gruix d’aquest article, ja has començat a familiaritzar-te amb la mecànica fonamental del CSS. A continuació, examinarem els selectors amb detall.

Si no has entès del tot els conceptes de la cascada, l'especificitat i l'herència, no et preocupis. Sens dubte, això és el més complicat que hem exposat fins ara, i a vegades fins i tot els desenvolupadors web professionals ho troben complicat. T’aconsellem que tornis a aquest article unes quantes vegades a mesura que avancis en el curs, i que hi continuïs pensant.

Torna a aquest punt si comences a trobar-te amb problemes estranys amb estils que no s'apliquen com esperaves. Podria ser un problema d'especificitat.

En aquest mòdul

  1. La cascada i l'herència
  2. Selectors CSS
  3. El model de caixes
  4. Fons i vores
  5. El tractament del text en diverses direccions
  6. El desbordament dels continguts
  7. Els valors i les unitats
  8. Dimensionar elements en CSS
  9. Imatges, media i elements de formulari
  10. Aplicar estil a les taules
  11. Depurar el CSS
  12. Organitza el teu CSS

Document Tags and Contributors

Contributors to this page: UOCccorcoles, editorUOC
Last updated by: UOCccorcoles,