La regla @starting-style

Transiciones CSS iniciales


Es muy probable que creando transiciones te hayas encontrado en la situación que al cargar la página te gustaría que un elemento tuviera un estilo diferente, para que no se produzca un salto o suavizar la aparición de un elemento.

La regla @starting-style

Para ello, y en otras situaciones donde quieres que ciertos elementos tengan inicialmente un valor diferente, puedes utilizar la regla @starting-style. Es una regla CSS que permite indicar los estilos que va a tener inicialmente un elemento de la página y de esta forma, evitar este comportamiento (o forzarlo, si interesa):

.element {
  width: 50px;
  height: 50px;
  background: indigo;
  transition:
    opacity 2s,
    width 1s,
    height 1s;
}

.element:hover {
  background: black;
  width: 150px;
  height: 150px;
}

@starting-style {
  .element {
    opacity: 0;
  }
}
<div class="element"></div>

En este caso, estamos creando un elemento con un tamaño inicial de 50x50 que transiciona a 150x150 cuando mueves ratón encima. Añadiéndole el @starting-style con un opacity: 0, conseguiremos que el elemento aparezca cuando carga la página, y luego permita hacer transiciones diferentes.

La regla @starting-style con nesting

Si tenemos en cuenta la anidación o nesting CSS, en lugar de añadir la regla @starting-style como un bloque independiente e incluir un selector, podemos añadirla dentro del selector concreto y utilizarla directamente:

.element {
  width: 50px;
  height: 50px;
  background: indigo;
  transition:
    opacity 2s,
    width 1s,
    height 1s;

  @starting-style { opacity: 0 }
}

Esto hará que el código sea mucho más fácil de modificar y mantener.

Añadir elementos al DOM

Esta regla también es muy útil cuando trabajamos con Javascript y queremos transicionar de forma suave los elementos que añadimos al DOM mediante Javascript.

Observa el siguiente ejemplo donde, cada vez que hacemos click en la página, se añade un cuadradito a la misma. Ten en cuenta que se aplicará la trasición de opacidad, permitiendo la de escalado cuando mueves el ratón sobre un elemento:

html,
body {
  height: 100vh;
  width: 100vw;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-content: start;
}

.element {
  width: 50px;
  height: 50px;
  background: indigo;
  transition:
    opacity 0.5s,
    transform 0.25s;

  @starting-style { opacity: 0 }
}

.element:hover {
  transform: scale(1.5);
  background: gold;
}
document.body.addEventListener("click", () => {
  const element = document.createElement("div");
  element.classList.add("element");
  document.body.append(element);
});

¿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