Saltar al contenido

CSS, de a poco

Curso de CSS

Herencia

Lección 24 de 37 · 4 min

Algunas propiedades pasan de padres a hijos solas, y otras no. Saber cuáles, y cómo forzarlo con inherit, initial, unset y revert, ahorra muchas reglas repetidas.

Qué se hereda

Si un elemento no tiene valor para una propiedad que se hereda, toma el que calculó su padre. Por eso alcanza con poner la tipografía en body: todo el texto de la página la recibe.

  1. Se heredan las de textocolor, font-family, font-size, font-weight, line-height, letter-spacing, text-align, white-space, visibility, cursor, list-style
  2. No se heredan las de caja y de layoutmargin, padding, border, width, background, display, position, box-shadow, opacity, transform

La idea es que el texto se vea parejo, pero las cajas no se copien: si el borde se heredara, cada párrafo de una tarjeta tendría el suyo. Cada propiedad indica en su especificación si se hereda (en MDN figura como «Inherited: yes» o «no»).

Una entrada con borde y texto naranja. Como es: el color pasa a las tres líneas y el borde queda solo en la entrada. Si el borde se heredara, cada línea tendría su propio borde.

Hay casos que confunden. opacity no se hereda, pero el hijo se ve transparente porque se pinta dentro del padre; con visibility: hidden en cambio el hijo hereda el valor y puede volver con visibility: visible. Y text-decoration no se hereda, pero el subrayado del padre se dibuja sobre el texto de los hijos.

inherit, initial, unset y revert

Cuatro palabras sirven en cualquier propiedad y cambian de dónde sale el valor:

  1. inheritToma el valor del padre, aunque la propiedad no se herede.
  2. initialEl valor inicial que define la especificación. Ojo: no es el del navegador. display: initial en un div da inline.
  3. unsetSe comporta como inherit si la propiedad se hereda, y como initial si no.
  4. revertDeshace tus estilos y vuelve a los del navegador. display: revert en un div da block.

Probalo con el enlace de la cartela. Sin regla, es azul aunque el resto del texto no: los enlaces no heredan el color porque el navegador les pone uno. El panel muestra el valor que calcula el navegador en cada caso:

propiedad
a · sin regla

El enlace de la cartela tiene color: midiendo… (hoja de estilos del navegador).

Una sala blanca y vacía con una escalera angosta contra la pared

Inés Valdés (1931–2004)

Patio en Barracas, 1962

Témpera sobre cartón, 48 × 61 cm

Más obras de la sala 4

Valor calculado de color

sin regla
midiendo…
hoja de estilos del navegador
inherit
midiendo…
heredado de .cartela
initial
midiendo…
valor inicial de la propiedad
unset
midiendo…
heredado de .cartela
revert
midiendo…
hoja de estilos del navegador
valor en el enlace
cartela.css
.cartela {
font-family: system-ui, sans-serif;
border: 1px solid;
padding: 16px;
}
/* a: sin regla propia */
cartela.html
<div class="font-[system-ui,_sans-serif] border border-current p-4">
<p>Inés Valdés (1931–2004)</p>
<p>…</p>
<!-- con el preflight de Tailwind, a ya hereda el color -->
<a href="/sala-4">Más obras de la sala 4</a>
</div>

Fijate en unset y revert con color: el primero hereda el color de la cartela; el segundo vuelve al azul del navegador. Con border, que no se hereda, solo inherit copia el borde.

Hay una quinta: revert-layer deshace solo la capa actual y vuelve a lo que diga la capa anterior. Sirve dentro de @layer y está en los mismos navegadores que las capas (Chrome y Edge 99, Firefox 97, Safari 15.4).

La propiedad all

all aplica una de esas palabras a todas las propiedades a la vez, salvo direction, unicode-bidi y las variables. Sirve para arrancar de cero un elemento que trae muchos estilos, como un botón:

Un botón después de la frase «Receta para 4.». Como viene, tiene fondo gris, borde y una letra más chica. Con all: unset pierde la caja y toma la letra y el color del texto.
boton.css
.boton-texto {
/* sin fondo, borde ni relleno; hereda tipografía y color */
all: unset;
cursor: pointer;
}
.boton-texto:focus-visible {
/* all: unset también borró el foco: hay que devolverlo */
outline: 2px solid;
}

all: revert es más suave: devuelve el elemento a cómo lo dibuja el navegador, con su foco y todo.

currentColor

currentColor es el valor de color del propio elemento. Como color se hereda, un ícono o un borde que use currentColor sigue al texto que lo rodea sin repetir el color. Es el valor inicial de border-color y outline-color: border: 1px solid, sin color, ya lo usa.

aviso.css
.aviso {
color: oklch(0.45 0.15 30);
border-inline-start: 3px solid; /* mismo color que el texto */
}
.aviso svg {
fill: currentColor; /* el ícono también */
}

Variables y herencia

Las variables (--nombre) se heredan siempre: definidas en un contenedor, valen para todo lo de adentro, y un hijo puede redefinirlas para su parte del árbol. Si una variable no tiene que pasar a los hijos, registrala con @property e inherits: false:

tarjeta.css
@property --relleno {
syntax: "<length>";
inherits: false;
initial-value: 0px;
}
.tarjeta { --relleno: 24px; padding: var(--relleno); }
.tarjeta > .nota { padding: var(--relleno); } /* 0px: no la hereda */

@property es Baseline desde julio de 2024 (Chrome y Edge 85, Safari 16.4, Firefox 128). Sin él, la variable se hereda igual que siempre.

Controles de formulario

input, button, select y textarea no heredan la tipografía: la hoja de estilos del navegador les pone una propia, más chica. Por eso un formulario puede verse con dos fuentes distintas. La solución es una línea:

font-size y primera familiamidiendo…

La etiqueta usa midiendo…; el campo de búsqueda, midiendo….

buscador.css
/* sin regla: los controles usan la letra del navegador */
buscador.html
<form>
<label for="q">Artista, obra o año</label>
<!-- el preflight ya pone font: inherit -->
<input id="q" type="search" placeholder="Valdés">
<button>Buscar</button>
</form>

font es un atajo: font: inherit hereda tamaño, familia, peso, estilo e interlineado de una vez. Casi todos los resets modernos lo traen.

En Tailwind

El preflight de Tailwind ya hace dos cosas de esta lección: los controles de formulario heredan font y color, y los enlaces heredan color y text-decoration. Para el resto:

CSSTailwind
color: inherittext-inherit
color: currentColortext-current
border-color: currentColorborder-current
fill: currentColorfill-current
font-family: inheritfont-[inherit]
font: inherit[font:inherit]
color: revert · border: inherit[color:revert] · [border:inherit]
all: unset[all:unset]
aviso.html
<p class="text-red-700 border-s-3 border-current ps-3">
<svg class="size-4 fill-current">…</svg>
Sin servicio entre Medrano y Pasteur.
<!-- rojo: el preflight lo hereda -->
<a class="underline" href="/combinaciones">Ver combinaciones</a>
</p>