Como fazer um carrossel com CSS puro?
Nesse tutorial estarei ensinando como fazer um slider/carrossel com CSS puro. Isso mesmo! Não vamos utilizar Javascript para iterar com os itens do nosso carrossel.
Código do carrossel
<section class="slider">
<input name='slide' type="radio" >
<input name='slide' type="radio" checked>
<input name='slide' type="radio">
<input name='slide' type="radio">
<div class="slider-content">
<div class="slider-item">1</div>
<div class="slider-item">2</div>
<div class="slider-item">3</div>
<div class="slider-item">4</div>
</div>
</section>
CSS:
.slider{
overflow: hidden;
}
.slider > .slider-content{
display: flex;
flex-wrap: nowrap;
width: 100%;
transition: all 500ms ease;
}
.slider > .slider-content > .slider-item {
flex: 0 0 auto;
width: 100%;
}
.slider > input:nth-child(1):checked ~ .slider-content{
transform: translateX(0%);
}
.slider > input:nth-child(2):checked ~ .slider-content{
transform: translateX(-100%);
}
.slider > input:nth-child(3):checked ~ .slider-content{
transform: translateX(-200%);
}
.slider > input:nth-child(4):checked ~ .slider-content{
transform: translateX(-300%);
}
Explicando o código do carrossel com CSS puro
Definimos uma classe .slider principal, que será o contêiner do
nosso carrossel. Em seguida, definimos um .slider-content, que
possui um as definições display: flex,
flex-wrap: nowrap. Essa definição é importante, pois, como cada
.slider-item possui o tamanho de 100%, teremos então a
div.slider-content com o tamanho de 400%, uma vez que temos 4
elementos no nosso exemplo. Foi por esse motivo que definimos o
div.slider como overflow: hidden, para que apenas um
.slider-item seja exibido. O flex-wrap: nowrap não
deixará que os elementos filhos de .slider-content quebrem para
uma nova linha caso o espaço total deste elemento esteja ocupado.
Depois disso, temos input[type=radio]. Utilizamos a posição de
cada um deles para representar um .slider-item. O seletor
:checked é utilizado no CSS para aplicar um estilo em um
[type=radio] que está selecionado atualmente. Cada
:nth-child() representa a posição em que o elemento está disposto
no DOM. Utilizamos isso para aplicar um transform: translateX(),
para fazer com que nosso .slider-content "ande" até o
elemento desejado. Note que incrementamos de 100% em
100%, para que seja exibido o .slider-item dentro de
.slider-content de acordo com sua posição.
Personalizando o carrossel
Observe que, dentro de .slider-item, podemos definir o elemento
que quisermos, com a estilização desejada.