Advertisement
  1. Web Design
  2. Parallax Scrolling

Consejo rápido: crea un efecto de paralaje muy simple con CSS y JavaScript

Scroll to top
Read Time: 4 min

() translation by (you can also view the original English article)

En este consejo rápido, aprenderemos a añadir un simple, pero útil, efecto de desplazamiento de paralaje a una imagen «hero». Para lograrlo, usaremos un poco de código JavaScript, pero ten en cuenta que puedes crear sitios web de paralaje CSS puro combinando transformaciones 3D.

Aquí está la página que vamos a crear. ¡Desplazate hacia abajo!

Vamos a crearlo en tres pasos fundamentales: iniciando con el marcado, luego el estilo y después el comportamiento JavaScript.

1. Empieza con el marcado HTML

El marcado de la página consta de dos secciones. La primera sección contiene la imagen «hero» y sus elementos secundarios, mientras que la segunda sección contiene el contenido principal de la página:

1
<section class="banner" data-direction="down" data-speed="0.6">
2
  <h1 class="banner-title" data-direction="up" data-speed="0.25">...</h1>
3
  <p class="banner-subtitle" data-direction="up" data-speed="0.35">...</p>
4
  <img class="skiing" src="IMG_SRC" alt="" data-direction="up" data-speed="0.85">
5
</section>
6
7
<section class="content">
8
  <div class="container">...</div>
9
</section>

Observa los atributos personalizados data-direction y data-speed asignados a los elementos de la primera sección. Estos componentes son los elementos de paralaje y los valores de sus atributos determinarán su comportamiento durante el desplazamiento de paralaje. ¡Más de ello en un minuto!

2. Añade el CSS

Luego, especificaremos algunas reglas de CSS para nuestra página. Nada realmente importante, solo algunas cosas básicas que mejorarán el diseño de la página:

1
body {
2
  font: 20px/1.6 sans-serif;
3
}
4
5
.banner {
6
  position: relative;
7
  height: 100vh;
8
  background: #ededed url(IMG_SRC) no-repeat center/cover;
9
  display: flex;
10
  flex-direction: column;
11
  justify-content: center;
12
  align-items: center;
13
}
14
15
.banner > *:not(.skiing) {
16
  font-weight: 900;
17
  letter-spacing: -0.05em;
18
  padding: 5px 15px;
19
  background: #ffc844;
20
}
21
22
.banner-title {
23
  font-size: 3em;
24
  margin-bottom: -0.5em;
25
  transform: rotate(-6deg);
26
}
27
28
.banner-subtitle {
29
  font-size: 1.5em;
30
  box-shadow: -15px -15px 15px rgba(0, 0, 0, 0.07);
31
  transform: rotate(-3deg);
32
}
33
34
.skiing {
35
  position: absolute;
36
  right: 40px;
37
  bottom: 20px;
38
  max-width: 150px;
39
}
40
41
.content {
42
  position: relative;
43
  padding: 20px 0;
44
  background: white;
45
}
46
47
.container {
48
  max-width: 1100px;
49
  padding: 0 15px;
50
  margin: 0 auto;
51
}
52
53
.content p + p {
54
  margin-top: 25px;
55
}
56
57
@media screen and (max-width: 500px) {
58
  body {
59
    font-size: 14px;
60
  }
61
62
  .skiing {
63
    right: 20px;
64
    max-width: 100px;
65
  }
66
}

3. Aplica JavaScript

Para crear el efecto de paralaje, escucharemos el evento scroll.

Cada vez que se desplaza la página, enlazamos los elementos de paralaje y hacemos lo siguiente:

  • Recuperamos el valor de su atributo data-speed y lo multiplicamos por el número de píxeles en que el documento se desplaza verticalmente. Eso nos da la velocidad a la que se ejecuta cada uno de los elementos de paralaje. Por ejemplo, data-speed = 1 significa que un elemento se moverá tan rápido como el contenido de la página. Por otro lado, un elemento con data-speed = 0.5 se moverá un 50% más lento que el desplazamiento de la página.
  • Recuperamos el valor de su atributo data-direction. Este atributo especifica dónde se moverán los elementos de paralaje a medida que se desplaza la página. Los valores posibles son up y down. Así que por ejemplo, data-direction = "up" significa que un elemento se moverá hacia arriba. En nuestro caso, todo menos la imagen se moverá hacia arriba.
  • Basados en sus valores de atributo, utilizamos la función translate3d() para mover los elementos hacia arriba o hacia abajo.

Aquí está el código JavaScript correspondiente:

1
const parallaxEls = document.querySelectorAll("[data-speed]");
2
3
window.addEventListener("scroll", scrollHandler);
4
5
function scrollHandler() {
6
  for (const parallaxEl of parallaxEls) {
7
    const direction = parallaxEl.dataset.direction == "up" ? "-" : "";
8
    const transformY = this.pageYOffset * parallaxEl.dataset.speed;
9
    if (parallaxEl.classList.contains("banner-title")) {
10
      parallaxEl.style.transform = `translate3d(0,${direction}${transformY}px,0) rotate(-6deg)`;
11
    } else if (parallaxEl.classList.contains("banner-subtitle")) {
12
      parallaxEl.style.transform = `translate3d(0,${direction}${transformY}px,0) rotate(-3deg)`;
13
    } else {
14
      parallaxEl.style.transform = `translate3d(0,${direction}${transformY}px,0)`;
15
    }
16
  }
17
}

Conclusión

¡Eso es! En este consejo rápido, creamos un efecto de desplazamiento de paralaje realmente simple con solo unas pocas líneas de JavaScript. Nuevamente, como ya se discutió, esta es una demostración básica y podría no ser adecuada para todos los casos de paralaje.

Los efectos de paralaje ciertamente pueden aportar carácter a tu sitio web, pero el navegador puede tener que realizar tareas «costosas» para crearlos, utilizando recursos e impidiendo el rendimiento. Asegúrate de tener en cuenta el rendimiento durante las implementaciones del paralaje.

No obstante, si deseas crear una experiencia de paralaje más avanzada, puedes mirar algunas bibliotecas de JavaScript que existen, como parallax.js.

¡Y como siempre, gracias por leer!

Más generosidad de paralaje en Tuts+


Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.