Creación de un efecto de fondo deslizante CSS | Programar Plus

El “truco” de deslizar fondos en CSS no es nuevo. De hecho, la primera vez que lo encontré podría haber sido hace un par de años en el sitio de Valio Con (el diseño actual ya no lo tiene). Sin embargo, lo noté en un par de sitios nuevos que visité hoy y pensé que valdría la pena compartirlo.

Este es el efecto que buscamos:

Vea Pen gamYOy de Programar Plus(@css-tricks) en CodePen.

Tenga en cuenta que esto es diferente de una presentación de diapositivas o carrusel de CSS, donde el contenido se separa en diapositivas en las que se puede detener. Hay grandes ejemplos de ellos en todo CodePen.

Esta técnica toma el fondo de un elemento y lo desliza a través del eje x infinitamente en un bucle para crear el efecto de un fondo interminable y siempre en movimiento.

Configurando el HTML

Esta es una especie de modelo de cómo debe estructurarse nuestro HTML:

Hay un elemento que se ajusta al ancho exacto de la ventana gráfica y otro que la atraviesa y la desborda. Eso significa que solo necesitamos crear dos elementos en el marcado HTML: uno para el fondo y otro para que actúe como un envoltorio contenedor para ese fondo.

<div class="wrapper">
  <div class="sliding-background"></div>
</div>

Posicionamiento de los elementos

Avancemos y agreguemos algo de CSS que posicionará correctamente nuestros dos elementos.

.wrapper {
  overflow: hidden;
}

.sliding-background {
  height: 500px;
  width: 5076px;
}

Nuestra .wrapper es el 100 % del ancho del navegador de forma predeterminada (así son los elementos a nivel de bloque), y hemos agregado un overflow propiedad que ocultará cualquier cosa que esté visualmente contenida fuera de ella. Piense en ello como un recorte en una fotografía. Puede haber cosas adicionales fuera del envoltorio, pero el envoltorio nos impide verlo.

Ahí es donde nuestro .sliding-background entra en juego. Está configurado con un ancho ridículo que desbordaría la mayoría de las ventanas gráficas. Y ese es el truco: debe ser algo que desborde el envoltorio. En este caso, elegí un tanto arbitrariamente un 5076px ancho.

Crear la imagen de fondo

Necesitamos una imagen si vamos a desplazar algo por la pantalla, ¿verdad? Ese es nuestro próximo orden del día.

Recuerda cómo mencioné que había elegido arbitrariamente 5076px como el ancho para el fondo deslizante? Bueno, es arbitrario, pero intencional en el sentido de que es divisible por 3, lo que encaja en el tiempo de un ciclo de un minuto, que aparecerá un poco más tarde. Eso significa que el lienzo de nuestra imagen de fondo es 5076 / 3 o 1692px. Al final, nuestro fondo se repetirá un total de tres veces en un minuto en un bucle infinito. ¡Matemáticas para ganar!

El 500px la altura es verdaderamente arbitraria. Eso puede ser lo que quieras y actuará como la altura del lienzo para la imagen de fondo.

Aquí está la plantilla de Photoshop utilizada en este ejemplo para comenzar:

Descargar ZIP

Guarda (¡y optimiza!) la imagen. Esto es lo que usaremos como imagen de fondo en el CSS:

.sliding-background {
  background: url("..path/to/image") repeat-x;
  height: 500px;
  width: 5076px;
}

¡Estupendo! Eso nos da la imagen descomunal que desborda el envoltorio y ahora se puede usar para desplazarse por la pantalla hasta el infinito.

El efecto deslizante

Está bien, hagamos que este chico malo se mueva. Queremos que vaya de izquierda a derecha en un bucle que se repite una y otra vez para crear un efecto uniforme que la imagen continúa para siempre.

Primero, definamos la animación CSS:

@keyframes .slide {
  0%{
    transform: translate3d(0, 0, 0);
  }
  100%{
    transform: translate3d(-1692px, 0, 0);
  }
}

estamos usando el transform propiedad para colocar la imagen izquierda en el borde izquierdo de la envoltura cuando comienza la animación, así:

Cuando la animación se haya completado, habrá transformado la posición negativamente (de izquierda a derecha) en una cantidad que coincida con el ancho exacto de nuestra imagen. Y, desde el .sliding-background es tres veces el ancho de la imagen real, la imagen se repite tres veces entre el 0 % y el 100 % antes de volver a repetirse.

Nota: la razón por la que estamos usando un adicional <div> en absoluto, en lugar de animar background-position en lo principal <div>, es para que podamos usar un animado transform para hacer el movimiento, que es mucho más performático.

OK, redondeemos las cosas llamando a nuestro slide animación en el .sliding-background clase:

.sliding-background {
  background: url("..path/to/image") repeat-x;
  height: 560px;
  width: 5076px;
  animation: slide 60s linear infinite;
}

El animation propiedad instruye al .sliding-background usar el slide animación y ejecutarla durante un minuto a la vez en un bucle infinito lineal.

Poniendolo todo junto

<div class="wrapper">
  <div class="sliding-background"></div>
</div>
.wrapper {
  overflow: hidden;
}

.sliding-background {
  background: url("..path/to/image") repeat-x;
  height: 560px;
  width: 5076px;
  animation: slide 60s linear infinite;
}

@keyframes slide{
  0%{
    transform: translate3d(0, 0, 0);
  }
  100%{
    transform: translate3d(-1692px, 0, 0);
  }
}

Aquí está el resultado final:

Vea Pen gamYOy de Programar Plus(@css-tricks) en CodePen.

(Visited 4 times, 1 visits today)