PLANTA 2 · Sessió 2 · CSS a React
El taller d'estils
Sistema a restaurar: Aparador i tema visual
- Alerta
- Manual
- Reptes
- Mòdul
Aquesta planta ja té llum. Pots tornar-la a jugar per repassar, però la puntuació desada no canviarà.
Manual de la planta
0 / 5Desbloqueja les 5 pàgines del manual per obrir els reptes. Llegeix-les bé: els reptes en pregunten els detalls.
Cascada i especificitat
Quan dues regles diuen coses diferents al mateix element, guanya la més específica. L'especificitat es compta com a tres xifres (id, classe, element): les classes, pseudoclasses (:hover, :not()) i atributs sumen a la segona xifra; les etiquetes i pseudoelements, a la tercera. Si empaten, guanya la regla que va més avall. L'atribut style en línia guanya a tots els selectors.
| Selector | Especificitat |
|---|---|
p | (0,0,1) |
.preu | (0,1,0) |
.enllac:hover | (0,2,0) |
#oferta .preu | (1,1,0) |
Per això, a la capçalera, .enllac:hover tapava el fons de .actiu, i la solució va ser .enllac:hover:not(.actiu).
Model de caixa i unitats
- Cada element és una caixa: contingut + padding + border, i el margin fora. Per defecte,
widthnomés mesura el contingut. - Amb
box-sizing: border-box, elwidthja inclou padding i vora. Per això el reinici el posa a tots els elements. - Els marges verticals de dos blocs seguits es col·lapsen: es queda el més gran.
rem: relatiu a la mida de lletra de l'arrel (16px per defecte).em: relatiu a l'element.%: al pare.vw/dvh: a la finestra.fr: fracció de l'espai lliure a Grid.clamp(mínim, preferit, màxim): una mida fluida amb límits.
Flexbox per a una dimensió, Grid per a dues
Flexbox col·loca elements en una fila o columna: justify-content alinea a l'eix principal, align-items a l'eix creuat, i gap separa. Grid treballa en files i columnes alhora.
.graella {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: var(--espai-4);
}
.peu {
display: flex;
justify-content: space-between;
margin-top: auto;
}| Fragment | Què fa |
|---|---|
repeat(auto-fit, minmax(240px, 1fr)) | Posa tantes columnes com hi càpiguen, de 240px com a mínim, i reparteix la resta. Graella adaptativa sense cap media query. |
gap: var(--espai-4); | L'espai entre targetes surt d'un token, no d'un número escrit a mà. |
justify-content: space-between; | Envia el preu a un costat i el botó a l'altre (eix principal). |
margin-top: auto; | Dins d'una targeta flex en columna, empeny el peu a baix: tots els botons queden alineats. |
Tokens, tema fosc i accessibilitat
Els colors, espais i radis es declaren un sol cop com a variables CSS a :root i es fan servir amb var(). El tema fosc només redefineix les variables: no cal tocar cap component.
:root {
--color-marca: #e02018;
--color-fons: #ffffff;
--color-text: #1a1a1a;
}
@media (prefers-color-scheme: dark) {
:root {
--color-fons: #121212;
--color-text: #f2f2f2;
}
}
:focus-visible { outline: 3px solid var(--color-text); }
@media (prefers-reduced-motion: reduce) {
.targeta { transition: none; }
}| Fragment | Què fa |
|---|---|
:root { --color-marca: … } | Els tokens: un sol lloc on canviar l'aspecte de tota la botiga. |
@media (prefers-color-scheme: dark) | S'aplica si el sistema de l'usuari està en mode fosc. |
:focus-visible | Contorn visible quan es navega amb el teclat, sense molestar qui fa servir el ratolí. |
@media (prefers-reduced-motion: reduce) | Treu les animacions a qui ha demanat menys moviment al sistema. |
CSS dins de React: la norma del mòdul
Hi ha cinc maneres de posar CSS en React (full global, CSS Modules, style, CSS-in-JS i utilitats). Al mòdul fem servir tokens al full global + un .module.css per component. L'atribut style queda només per a valors calculats en temps d'execució.
import clsx from 'clsx';
import estils from './TargetaProducte.module.css';
export default function TargetaProducte({ nom, esgotat }: Props) {
return (
<article className={clsx(estils.targeta, esgotat && estils.esgotat)}>
<h3 className={estils.titol}>{nom}</h3>
</article>
);
}| Fragment | Què fa |
|---|---|
import estils from './TargetaProducte.module.css'; | Vite converteix cada classe en un nom únic (_targeta_a1b2c): no pot xocar amb cap altre component. |
className={estils.targeta} | Es fa servir com una propietat de l'objecte estils. |
clsx(estils.targeta, esgotat && estils.esgotat) | clsx ajunta les classes i descarta les falses: esgotat només s'afegeix si el producte no té estoc. |
Planta restaurada · Aparador i tema visual
L'aparador torna a brillar: tokens restaurats i tema fosc en marxa.
- XP
- 0
- Bonus ratxa
- 0
- Errors
- 0
- Pistes
- 0
- Estrelles
- ☆☆☆
Anota la lletra i la seva posició: al terrat hauràs de compilar l'ordre de reinici.