Advertisement
  1. Web Design
  2. HTML/CSS
  3. HTML Templates

Cómo crear una simple presentación de diapositivas con el truco Checkbox de CSS

Scroll to top
Read Time: 9 min

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

Final product imageFinal product imageFinal product image
What You'll Be Creating

En este nuevo tutorial, aprenderemos cómo crear, desde cero, una presentación de diapositivas con imágenes totalmente funcional, responsiva y con miniaturas. Para lograrlo, no necesitaremos escribir ni una sola línea de JavaScript. De hecho, una vez más, solo utilizaremos HTML y CSS, ya que aprovechamos el «truco checkbox de CSS».

Nota: Este tutorial asume que estás familiarizado con esa técnica de CSS junto con los selectores avanzados de CSS (por ejemplo, el combinador general «sibling»). Si no has escuchado hablar de ellos antes, o necesitas un repaso, revisa los siguientes tutoriales:

Nuestra presentación de diapositivas con CSS responsiva

Aquí está la presentación de diapositivas que vamos a crear en este tutorial:


1. Empieza con el marcado en HTML

Para los propósitos de este ejercicio, tomaremos tres imágenes de Unsplash.

Luego, crearemos los correspondientes botones de radio que agruparemos bajo la palabra clave image:

1
<input type="radio" id="image1" name="image" checked>
2
<input type="radio" id="image2" name="image">
3
<input type="radio" id="image3" name="image">

A continuación, pondremos dentro de un contenedor los elementos .featured-wrapper y .thumb-list.

El elemento .featured-wrapper contendrá tres listas:

  • La primera lista tendrá las imágenes de la presentación de diapositivas. Únicamente aparecerá una sola imagen a la vez.
  • Las otras dos listas, que son idénticas, se usarán para navegar entre las imágenes/diapositivas. Ambas listas contendrán etiquetas cuyos valores for coincidan con los valores id de los botones de radio mencionados.

Sugerencia: En nuestro ejemplo, asociaremos un botón de radio con más de una etiqueta. Es perfectamente válido.

El elemento .thumb-list también incluirá las imágenes de la presentación de diapositivas junto con sus descripciones. No obstante, a diferencia de las imágenes del elemento .featured-list, estas imágenes siempre estarán visibles y se usarán para la navegación con las miniaturas.

En resumen, nuestra presentación de diapositivas ofrecerá a los usuarios la posibilidad de cambiar entre las diapositivas mediante puntos, flechas y miniaturas. ¡Genial!

La estructura HTML final

De forma predeterminada, la primera imagen debería ser visible/activa. Teniendo esto en cuenta, añadiremos el atributo checked al primer botón de radio.

Teniendo todo junto, aquí está la estructura de nuestro contenedor:

1
<div class="container">
2
  <div class="featured-wrapper">
3
    <ul class="featured-list">
4
      <li>
5
        <figure>
6
          <img src="IMG_SRC" alt="">
7
        </figure>
8
      </li>
9
      <!-- other two list items here -->
10
    </ul>
11
    <ul class="arrows">
12
      <li>
13
        <label for="image1"></label>
14
      </li>
15
      <li>
16
        <label for="image2"></label>
17
      </li>
18
      <li>
19
        <label for="image3"></label>
20
      </li>
21
    </ul>
22
    <ul class="dots">
23
      <li>
24
        <label for="image1"></label>
25
      </li>
26
      <li>
27
        <label for="image2"></label>
28
      </li>
29
      <li>
30
        <label for="image3"></label>
31
      </li>
32
    </ul>
33
  </div>
34
  <ul class="thumb-list">
35
    <li>
36
      <label for="image1">
37
        <img src="IMG_SRC" alt="">
38
        <span class="outer">
39
          <span class="inner">...</span>
40
        </span>
41
      </label>
42
    </li>
43
    <!-- other two list items here -->
44
  </ul>
45
</div>

Nota: En cada etiqueta dentro de la lista .thumb-list, no utilizo los elementos figure y figcaption porque el Validador W3C nos arrojará un error. Nos limitaremos a los elementos en línea.

2. Define los estilos

Por lo que respecta a los estilos, primero ocultaremos visualmente los botones de radio moviéndolos fuera de la pantalla:

1
input[type="radio"] {
2
  position: absolute;
3
  bottom: 0;
4
  left: -9999px;
5
}

Nota: Añadí la propiedad botton: 0 para evitar que el navegador salte a la parte superior de la página cada vez que se haga clic en una etiqueta. No es el enfoque ideal, pero al parecer cumple con el trabajo. Como alternativa, siendo una solución más estable, podría haber establecido display: none, pero esto no es recomendable debido a las restricciones de accesibilidad del teclado. De manera específica, ese estilo evita que las teclas de flecha cambien el botón de radio seleccionado.

Como siempre, nuestro contenedor tendrá un ancho máximo con el contenido centrado de manera horizontal.

1
.container {
2
  max-width: 700px;
3
  padding: 0 20px;
4
  margin: 0 auto;
5
}

Imágenes grandes

De forma predeterminada, todas las imágenes destacadas se apilarán una encima de otra. Todas estarán ocultas, excepto la imagen asociada al botón de radio marcado.

Para apilar las imágenes, por sorprendente que parezca, no utilizaremos la propiedad común position. Normalmente, lo que esperarías es que convirtamos las imágenes en elementos posicionados de manera absoluta. Pero ese método tiene una gran desventaja: los elementos absolutos se eliminan del flujo normal del documento, por lo que tendríamos que encontrar una manera de preservar la relación de aspecto de las imágenes. Por ejemplo, una solución rústica y poco elegante podría ser añadir una altura fija al contenedor de las imágenes.

Aquí es donde las nuevas adiciones de CSS como las rejillas (CSS Grid) vienen al rescate, especialmente si solo estás interesado en los navegadores modernos. Así que primero, haremos que la lista se comporte como un contenedor de rejilla, luego posicionaremos sus elementos en la misma celda dándoles grid-row: 1 y grid-column: 1.

Images positioning with CSS GridImages positioning with CSS GridImages positioning with CSS Grid

Aquí está el CSS correspondiente:

1
.featured-wrapper .featured-list {
2
  display: grid;
3
}
4
5
.featured-wrapper .featured-list li {
6
  grid-column: 1;
7
  grid-row: 1;
8
  opacity: 0;
9
  transition: opacity 0.25s;
10
}

Los puntos

La navegación con los puntos estará absolutamente posicionada y situada en la parte inferior del elemento .feature-wrapper. Cada una de sus etiquetas tendrá la apariencia de un círculo, de esta forma:

The dots navigationThe dots navigationThe dots navigation

Aquí están los estilos relacionados:

1
/*CUSTOM VARIABLES HERE*/
2
3
.featured-wrapper {
4
  position: relative;
5
}
6
7
.featured-wrapper .dots {
8
  position: absolute;
9
  bottom: 10px;
10
  left: 50%;
11
  transform: translateX(-50%);
12
  display: flex;
13
}
14
15
.featured-wrapper .dots li:not(:last-child) {
16
  margin-right: 8px;
17
}
18
19
.featured-wrapper .dots label {
20
  display: inline-block;
21
  width: 12px;
22
  height: 12px;
23
  border-radius: 50%;
24
  border: 1px solid var(--white);
25
  transition: background 0.25s;
26
}
27
28
.featured-wrapper .dots label:hover {
29
  background: currentColor;
30
}

Las flechas

Las flechas de navegación estarán posicionadas de forma absoluta en el interior del elemento .feature-wrapper:

The navigation arrowsThe navigation arrowsThe navigation arrows

Ten en cuenta que solo aparecerán las flechas de la etiqueta asociada al botón de radio marcado. Para crearlas, utilizaremos los pseudoelementos ::before y ::after de la etiqueta objetivo.

Aquí están los estilos requeridos:

1
/*CUSTOM VARIABLES HERE*/
2
3
.featured-wrapper .arrows label::before,
4
.featured-wrapper .arrows label::after {
5
  position: absolute;
6
  top: 50%;
7
  transform: translateY(-50%);
8
  width: 40px;
9
  height: 40px;
10
  border-radius: 50%;
11
  color: var(--black);
12
  background-position: center;
13
  background-repeat: no-repeat;
14
  background-size: 24px 24px;
15
  background-color: var(--white);
16
  opacity: 0.5;
17
  transition: opacity 0.25s;
18
}
19
20
.featured-wrapper .arrows label::before {
21
  left: 10px;
22
}
23
24
.featured-wrapper .arrows label::after {
25
  right: 10px;
26
}

Las miniaturas

Cada miniatura cubrirá un tercio del ancho del elemento principal, de esta manera:

The thumbnails layoutThe thumbnails layoutThe thumbnails layout

Para posicionar el texto arriba de su imagen, en lugar de utilizar el posicionamiento tradicional de CSS, aprovecharemos el truco de la rejillas de CSS (CSS Grid) que aprendimos anteriormente.

Convertiremos la etiqueta en un elemento de rejillas y obligaremos a los elementos secundarios a cubrir sus dimensiones completas. Por defecto, únicamente aparecerá el título asociado con el botón de opción marcado. Además, su contenido será centrado de manera horizontal y vertical gracias a las rejillas de CSS nuevamente.

Aquí están los estilos objetivo:

1
/*CUSTOM VARIABLES HERE*/
2
3
.thumb-list {
4
  display: grid;
5
  grid-template-columns: repeat(3, 1fr);
6
  grid-column-gap: 20px;
7
  margin-top: 20px;
8
}
9
10
.thumb-list label {
11
  display: grid;
12
}
13
14
.thumb-list img,
15
.thumb-list .outer {
16
  grid-column: 1;
17
  grid-row: 1;
18
}
19
20
.thumb-list .outer {
21
  display: grid;
22
  place-items: center;
23
  transition: background 0.25s;
24
}
25
26
.thumb-list .inner {
27
  font-size: 18px;
28
  opacity: 0;
29
  transform: translateY(20px);
30
  transition: all 0.25s;
31
}


3. El truco de Checkbox: Cambiar entre diapositivas

¡Ahora vamos a divertirnos! Empujaremos los límites de CSS gracias al truco de checkbox e imitaremos el evento click de JavaScript.

Por tanto, cada vez que hagamos clic en una imagen en miniatura, en un punto o en una flecha (es decir, cuando se active), va a ocurrir lo siguiente:

  • La diapositiva activa se hará visible.
  • El punto activo recibirá un color blanco de fondo.
  • Aparecerá el título de la imagen en miniatura activa.
  • Se mostrarán las flechas anterior y siguiente de la diapositiva activa. Estas se enlazarán con su diapositiva anterior y su siguiente diapositiva, respectivamente.

Aquí están los estilos que manejan esta funcionalidad:

1
/*CUSTOM VARIABLES HERE*/
2
3
[id="image1"]:checked ~ .container .featured-list li:nth-child(1),
4
[id="image2"]:checked ~ .container .featured-list li:nth-child(2),
5
[id="image3"]:checked ~ .container .featured-list li:nth-child(3),
6
[id^="image"]:checked ~ .container .arrows [for^="image"]:hover::before,
7
[id^="image"]:checked ~ .container .arrows [for^="image"]:hover::after {
8
  opacity: 1;
9
}
10
11
[id="image1"]:checked ~ .container .arrows [for="image3"]::before,
12
[id="image2"]:checked ~ .container .arrows [for="image1"]::before,
13
[id="image3"]:checked ~ .container .arrows [for="image2"]::before {
14
  content: ’’; 
15
  background-image: url(arrow-prev-slideshow.svg);
16
}
17
18
[id="image1"]:checked ~ .container .arrows [for="image2"]::after,
19
[id="image2"]:checked ~ .container .arrows [for="image3"]::after,
20
[id="image3"]:checked ~ .container .arrows [for="image1"]::after {
21
  content: ’’; 
22
  background-image: url(arrow-next-slideshow.svg);
23
}
24
25
[id="image1"]:checked ~ .container .dots [for="image1"],
26
[id="image2"]:checked ~ .container .dots [for="image2"],
27
[id="image3"]:checked ~ .container .dots [for="image3"] {
28
  background: currentColor;
29
}
30
31
[id="image1"]:checked ~ .container [for="image1"] .outer,
32
[id="image2"]:checked ~ .container [for="image2"] .outer,
33
[id="image3"]:checked ~ .container [for="image3"] .outer {
34
  background: var(--overlay);
35
}
36
37
[id="image1"]:checked ~ .container [for="image1"] .inner,
38
[id="image2"]:checked ~ .container [for="image2"] .inner,
39
[id="image3"]:checked ~ .container [for="image3"] .inner {
40
  opacity: 1;
41
  transform: none;
42
}

Quizá te lleve algún tiempo entender cómo funcionan los estilos mencionados anteriormente. Si este es el caso, ¡el inspector de los navegadores es tu mejor amigo!

Conclusión

¡Eso es todo, amigos! En este tutorial, hemos logrado crear una presentación de diapositivas con miniaturas responsiva, usando únicamente CSS y aprovechando el «truco checkbox de CSS». Esperamos que hayas disfrutado de este ejercicio y que lo incorpores en un próximo proyecto.

Aquí tienes un recordatorio de lo que hemos creado:

Como una última reflexión, diría que sin duda, la técnica del truco checkbox de CSS es una gran forma para mejorar tu conocimiento de CSS. Por otro lado, en un proyecto real, debemos ser conscientes de sus limitaciones (accesibilidad, marcado) y de cuándo vale la pena usarlo en lugar de las alternativas de JavaScript.

¿Alguna vez has creado algo interesante con el truco de checkbox? ¡Haznos saber!

Lecturas adicionales

Revisa estos tutoriales para inspirarte con las poderosas presentaciones de diapositivas que puedes crear, personalizando los populares plugins de jQuery:

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.