Cómo convertir los indicadores del carrusel de Bootstrap en barras de progreso animadas
Spanish (Español) translation by Carlos (you can also view the original English article)
En este tutorial, trabajaremos con otra interesante extensión de Bootstrap. De manera concreta, crearemos un componente de carrusel de Bootstrap y personalizaremos sus indicadores para que parezcan barras de progreso animadas. De ese modo, tendremos una perspectiva clara de cuándo se cargará la siguiente diapositiva.
Nuestra extensión del carrusel de Bootstrap
Esto es lo que vamos a crear:
1. Crea un carrusel de Bootstrap con indicadores
Suponiendo que ya hemos instalado los archivos de Bootstrap necesarios, primero crearemos un carrusel de imágenes (imágenes de Unsplash) con indicadores, aprovechando el código básico para el componente de carrusel que nos ofrece el framework.
Este es el código necesario
1 |
<div id="carouselExampleIndicators" class="carousel slide" data-bs-ride="carousel" data-bs-pause="false"> |
2 |
<div class="carousel-indicators"> |
3 |
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"> |
4 |
<span></span>
|
5 |
</button>
|
6 |
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="1" aria-label="Slide 2"> |
7 |
<span></span>
|
8 |
</button>
|
9 |
<button type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide-to="2" aria-label="Slide 3"> |
10 |
<span></span>
|
11 |
</button>
|
12 |
</div>
|
13 |
<div class="carousel-inner"> |
14 |
<div class="carousel-item active"> |
15 |
<img src="bs-carousel1.jpg" class="d-block w-100" alt="..."> |
16 |
</div>
|
17 |
<div class="carousel-item"> |
18 |
<img src="bs-carousel2.jpg" class="d-block w-100" alt="..."> |
19 |
</div>
|
20 |
<div class="carousel-item"> |
21 |
<img src="bs-carousel3.jpg" class="d-block w-100" alt="..."> |
22 |
</div>
|
23 |
</div>
|
24 |
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="prev"> |
25 |
<span class="carousel-control-prev-icon" aria-hidden="true"></span> |
26 |
<span class="visually-hidden">Previous</span> |
27 |
</button>
|
28 |
<button class="carousel-control-next" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="next"> |
29 |
<span class="carousel-control-next-icon" aria-hidden="true"></span> |
30 |
<span class="visually-hidden">Next</span> |
31 |
</button>
|
32 |
</div>
|
Presta atención a dos cosas:
- Añadimos el atributo
data-bs-pause="false"para evitar pausar el carrusel cuando pasemos el puntero del mouse sobre él. - Agregamos un elemento
spana cada indicador de carrusel. Eso actuará como nuestra barra de progreso.
2. Personaliza los indicadores de Bootstrap
Como siguiente paso, personalizaremos el estilo de los indicadores predeterminados. Los haremos más grandes y posicionaremos de manera absoluta su elemento span de arriba. Al principio, los elementos span tendrán un ancho cero. Ese ancho aumentará gradualmente tan pronto como se active la diapositiva correspondiente.



Estos son los estilos asociados:
1 |
.carousel-indicators [data-bs-target] { |
2 |
position: relative; |
3 |
width: 60px; |
4 |
height: 6px; |
5 |
border: none; |
6 |
border-radius: 24px; |
7 |
}
|
8 |
|
9 |
.carousel-indicators [data-bs-target] span { |
10 |
content: ’’; |
11 |
position: absolute; |
12 |
top: 0; |
13 |
left: 0; |
14 |
width: 0; |
15 |
height: 100%; |
16 |
background: #7952b3; |
17 |
border-radius: inherit; |
18 |
}
|
3. Crea un elemento de progreso para cada diapositiva
Cuando se cargue la página o cambie una diapositiva, se activará la función fillCarouselIndicator().
Esta función recibirá como parámetro la diapositiva activa. Al comienzo, consideraremos que la primera diapositiva es la activa.
Adentro, haremos las siguientes cosas:
- Ejecutaremos una función cada 50 ms cuyo trabajo será animar gradualmente el ancho del elemento
spandel indicador activo hasta el 100%. - Al principio, estableceremos el ancho de todos los elemetos
spanen cero y cancelaremos la ejecución de la llamada programada (si la hubiera). Hacemos esto como precaución en caso de que decidamos cambiar una diapositiva antes del comportamiento de reproducción automática por defecto de Bootstrap (cada 5000 ms).

Tomando en cuenta todo lo anterior, aquí está el código asociado:
1 |
...
|
2 |
|
3 |
function fillCarouselIndicator(index) { |
4 |
let i = 0; |
5 |
// 2
|
6 |
for (const carouselIndicator of carouselIndicators) { |
7 |
carouselIndicator.style.width = 0; |
8 |
}
|
9 |
clearInterval(intervalID); |
10 |
|
11 |
// 1
|
12 |
intervalID = setInterval(function () { |
13 |
i++; |
14 |
myCarousel.querySelector(".carousel-indicators .active span").style.width = |
15 |
i + "%"; |
16 |
}, 50); |
17 |
}
|
setInterval() debe ejecutarse cada 50ms. Normalmente, su última llamada es cuando el valor de la variable i se establece en 100 (100 * 50 = 5000). Si, por algún motivo, deseas cambiar el tiempo predefinido necesario para el ciclo entre diapositivas, recuerda, además, modificar el tiempo del intervalo correspondientemente. Por ejemplo, si estableces el tiempo del intervalo del carrusel en 6000, tienes que asignar 60 como el segundo parámetro de nuestro método de intervalo.¿Precisión?
Si alguna vez has trabajado con temporizadores en JavaScript (setTimeout(), setInterval()), quizá hayas visto que no siempre son precisos. Además, pueden comportarse de manera diferente en distintos navegadores/dispositivos.
En mis pruebas, nuestro ejemplo funcionó bien en navegadores como Chrome y Edge, pero en Firefox, la siguiente diapositiva era mostrada mientras que el indicador activo tenía un ancho de alrededor del 80%.

Por lo tanto, vamos a realizar un arreglo simple para garantizar la compatibilidad con los navegadores. De manera más específica añadiremos tres cosas:
- Primero, obtendremos una referencia para nuestro carrusel. Eso nos dará la posibilidad de usar sus métodos API.
- Luego, cada vez que una diapositiva cambie, detendremos el carrusel.
- Por último, forzaremos la navegación a la siguiente diapositiva tan pronto como el ancho del elemento
spanactivo sea del 100%. Con esta incorporación, el atributodata-bs-pause="false"que agregamos anteriormente no desempeñará ninguna función, así que puedes eliminarlo si lo deseas.
Este es el código JavaScript adicional que se necesita para esta funcionalidad:
1 |
// 1
|
2 |
const carousel = new bootstrap.Carousel(myCarousel); |
3 |
|
4 |
function fillCarouselIndicator(index) { |
5 |
...
|
6 |
// 2
|
7 |
carousel.pause(); |
8 |
|
9 |
intervalID = setInterval(function () { |
10 |
...
|
11 |
|
12 |
if (i >= 100) { |
13 |
// 3
|
14 |
carousel.next(); |
15 |
}
|
16 |
}, 50); |
17 |
}
|
slide.bs.carousel que usamos aquí, también puedes utilizar slid.bs.carousel. En este caso, tienes que personalizar un poco el código. Conclusión
¡Eso es todo, amigos! En este breve ejercicio, aprendimos cómo crear carruseles de Bootstrap únicos convirtiendo sus indicadores en barras de progreso animadas.
Esperemos que esta técnica haya sido beneficiosa y que planeen incorporarla en uno de sus próximos proyectos.
Una vez más, esto es lo que creamos:
Si quieres expandir tus conocimientos sobre Bootstrap, asegúrate de examinar los recursos de Bootstrap, en constante evolución, aquí en Tuts+.
Como siempre, ¡muchas gracias por leer!
Plantillas de Bootstrap en Envato Elements


BootstrapLas 20 mejores plantillas de Bootstrap para comercio electrónico (para tu tienda en línea)Brenda Barron

HTMLLas 15 mejores plantillas de Bootstrap para portafoliosFranc Lucas

Bootstrap20 plantillas de Bootstrap con muchas funciones para paneles de administraciónIan Yates

Bootstrap20 nuevas plantillas de Bootstrap para portafolios para 2021Brenda Barron

BootstrapLas 20 mejores plantillas de Bootstrap para páginas de aterrizajeBrenda Barron

BootstrapMás de 15 de las mejores plantillas de Bootstrap para sitios web (con diseños modernos)Hermione Wright

Bootstrap30 increíbles plantillas de Bootstrap para probar en 2021Paula Borowska



