El atributo hidden

Un atributo para marcar secciones como ocultas


En muchas ocasiones, cuando queremos ocultar un elemento lo hacemos con CSS utilizando las propiedades display: none, visibility: hidden, opacity: 0 o alguna similar. Sin embargo, es complicado saber por qué razón hemos ocultado ese elemento. Lo ideal sería tener una forma de saber si semánticamente tiene sentido que un elemento esté oculto, por ejemplo, por que estamos enfocados en otra sección, y la sección oculta no es relevante en este momento.

Ocultación semántica

Con el atributo hidden hacemos desaparecer visualmente un elemento HTML (y todo su contenido, si está en una etiqueta contenedora). Hasta ahora, para realizar esta tarea teníamos que recurrir a CSS, ya que se trata de una cuestión de presentación visual.

Por otro lado, el attributo hidden se debe utilizar en situaciones donde el usuario ha realizado una acción y hay una serie de elementos que queremos ocultar porque ya no son relevantes para el estado en el que se encuentra la web o aplicación, independientemente de los estilos que se le estén aplicando en la página:

<section>
  <h1>Sección 1</h1>
  <p>En esta primera sección vamos a hablar de...</p>
</section>

<section hidden>
  <h1>Sección 2</h1>
  <p>En esta segunda sección vamos a hablar de...</p>
</section>

Observa el fragmento de código anterior y comprobarás que hay dos secciones, donde la segunda está oculta por defecto, ya que queremos que el usuario se enfoque en la primera. Si accede a la segunda sección o realiza una acción determinada, tendríamos que hacer el cambio para que se oculte la primera y se elimine el atributo de la segunda.

El atributo hidden vs display: none

El atributo hidden no tiene ninguna magia extraña. Simplemente se trata de un atributo, que cuando un elemento lo incorpore, el mismo tendrá un display: none por defecto. Sin embargo, nosotros podemos cambiar el estilo mediante CSS si lo deseamos. Por ejemplo, queremos que nuestro elemento con atributo hidden tenga el texto visible pero en gris.

section[hidden] {
  display: block;
  color: #ccc;
}

Ahora las secciones no aparecerán ocultas, sino que aparecerán con el texto de color gris, para destacar que la sección importante es la que no tiene el atributo hidden.

No hagas esto. Es sólo un ejemplo para que comprendas la «magia» que está por detrás.

Ocultando desde Javascript

Continuemos con el HTML del ejemplo anterior, vamos a añadirle un botón HTML y cuando el usuario pulse ese botón queremos ocultar el <section> que estamos mostrando, y mostrar el <section> que tenemos oculto. El código a ejecutar sería el siguiente:

const [firstSection, secondSection] = document.querySelectorAll("section");
const button = document.querySelector("button");

button.addEventListener("click", function() {
  firstSection.toggleAttribute("hidden");
  secondSection.toggleAttribute("hidden");
});
<button>Click me!</button>

<section>
  <h1>Sección 1</h1>
  <p>En esta primera sección vamos a hablar de...</p>
</section>

<section hidden>
  <h1>Sección 2</h1>
  <p>En esta segunda sección vamos a hablar de...</p>
</section>

De esta forma, estaríamos conmutando uno y otro. Si ampliasemos este ejemplo y añadieramos CSS, podríamos crear un sistema de pestañas o ejemplos algo más avanzados. El soporte de este atributo es completo en la mayoría de los navegadores:

El valor until-found

Una característica interesante es la de aplicarle el valor until-found al atributo hidden. De esta forma, le indicamos al navegador que el elemento debe estar oculto hasta que el usuario vaya explícitamente a esa sección.

Veamos un ejemplo:

<a href="#section-2">Ir a la sección 2</a>

<section>
  <h1>Sección 1</h1>
  <p>En esta sección vamos a hablar de...</p>
</section>

<!-- Más contenido -->

<section id="section-2" hidden="until-found">
  <h1>Sección 2</h1>
  <p>En esta sección vamos a hablar de...</p>
</section>

Al pulsar en el enlace <a> que tiene un ancla hacia el elemento con id="section-2", el navegador desbloquea ese elemento y elimina el atributo hidden, por lo que se comienza a visualizar.

El soporte de esta característica aún es experimental:

¿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