Herencia en CSS

La forma en la que CSS sobreescribe valores


Antes de empezar a profundizar en CSS, hay ciertos detalles que convendría conocer bien. El concepto de herencia es uno de ellos. Se trata de una característica básica de CSS, que mucha gente desconoce y que puede provocar problemas si no se utiliza adecuadamente.

¿Qué es la herencia en CSS?

A la hora de escribir código CSS, comenzamos escribiéndolo desde arriba hacia abajo. Esto puede parecer simple (y lo es), pero a medida que escribimos, nuestro código CSS se hace más y más extenso y ya no es tan sencillo añadir líneas de código, porque tenemos que volver hacia atrás, revisar si la clase que vamos a escribir ya existe, modificar código ya existente, ser organizado, etc...

Observa el siguiente fragmento de código:

.parent {
  background: black;
  color: white;
}

.child {
  color: gold;
}
<div class="parent">
  <p class="child">Hello from child!</p>
</div>

Observa que en este caso, el texto .child aparece de color dorado porque tenemos un color: gold dentro del .child. Si no lo tuvieramos, el .child se mostraría de color blanco porque hereda el color de su elemento padre .parent, donde tiene establecido un color: white.

Ten en cuenta la estructura del DOM (HTML) de la página. En CSS, si nosotros damos estilo a un elemento HTML, su hijo directo hereda el estilo del padre, salvo que le hayas indicado explícitamente otro estilo diferente. A continuación, ocurre lo mismo con el hijo del hijo, que hereda los estilos de su padre directo. Y así sucesivamente.

html
  |
  +--- body
        |
        +--- .parent
                |
                +--- .child

Si colocamos un color de texto en el <body>, el elemento .parent y el elemento <h1> heredarán el mismo color de texto (salvo que en alguno de los padres se cambie el estilo). Esto es la herencia de CSS, en principio algo sencillo, pero que se va complicando poco a poco.

Recuerda que una forma de organizar tu código CSS es aplicar Nesting CSS, un mecanismo para organizar mejor tus estilos, más legible y de forma nativa, sin herramientas de terceros.

Propiedades heredables

Debemos saber que no todas las propiedades CSS son heredables. Las propiedades color o font-family son heredables y su valor se hereda desde los elementos HTML padres hacia los elementos HTML hijos, sobreescribiendo el valor que tienen por defecto.

Esto ocurre con prácticamente todas las propiedades de texto o tipografías, como font-* o text-*, además de algunas propiedades muy concretas:

Propiedad heredableDescripción
colorEstablece el color de texto.
font-family, font-size, font-style, font-variant, font-weightPropiedades relacionadas con la tipografía.
text-align, text-shadow, text-overflow, text-indent, text-transformPropiedades relacionadas con el texto.
word-spacing, letter-spacing, direction, line-height, white-spacePropiedades especiales de texto.
visibilityPropiedad de visibilidad de un elemento.
list-style-typePropiedad para viñetas de una lista.

Observa ahora el siguiente ejemplo, donde tenemos tres elementos: .grandparent, .parent y .child. Vamos a aplicarle estilo a .grandparent, que es el padre de .parent:

.grandparent {
  color: green;           /* Propiedad heredable */
  font-size: 28px;        /* Propiedad heredable */
  border: 3px solid red;  /* Propiedad no heredable */
}
<div class="grandparent">
  Hello from grandparent!
  <div class="parent">
    Hello from parent!
    <div class="child">
      Hello from child!
    </div>
  </div>
</div>

Si observas el resultado y el código HTML, verás que tanto el texto de .grandparent (abuelo), como el de .parent (padre), como el de .child (hijo) aparecerán de color verde y con el mismo tamaño. Esto ocurre porque las propiedades color y font-size son heredables y se van heredando de sus padres directos.

Sin embargo, con el borde rojo sólo se aplica borde al .grandparent (abuelo). La propiedad border no es heredable.

Si la propiedad border aplicara herencia a sus hijos, todos los elementos HTML situados en el interior de .parent tendrían su propio borde rojo, comportamiento que no suele ser el deseado. La herencia sólo ocurre con algunas propiedades donde suele ser deseable.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev