Crie uma apresentação de slides animada em CSS puro.



Bom dia amigos

Cansado de JS, mude para CSS!

Desafio


Faça uma apresentação de slides animada usando CSS. As apresentações de slides podem ser usadas, por exemplo, em ocasiões especiais para exibir fotos na tela através do projetor. Através do loop, as fotos exibidas podem servir como pano de fundo para um discurso solene.

Possível solução


Para a apresentação de slides, tiraremos a estranha "foto macro" Paweł Czerwiński (elas são legais).

Então vamos lá.

Nossa marcação ficará assim:

<div class="slideshow"> <img src="https://thebestcode.ru/media/animatedSlideshow/1.jpg" alt="#" class="i_1"> <p class="p_1">a-slide</p> <img src="https://thebestcode.ru/media/animatedSlideshow/2.jpg" alt="#" class="i_2"> <p class="p_2">b-slide</p> <img src="https://thebestcode.ru/media/animatedSlideshow/3.jpg" alt="#" class="i_3"> <p class="p_3">c-slide</p> <img src="https://thebestcode.ru/media/animatedSlideshow/4.jpg" alt="#" class="i_4"> <p class="p_4">d-slide</p> <img src="https://thebestcode.ru/media/animatedSlideshow/5.jpg" alt="#" class="i_5"> <p class="p_5">e-slide</p> <img src="https://thebestcode.ru/media/animatedSlideshow/6.jpg" alt="#" class="i_6"> <p class="p_6">f-slide</p> </div> 

O que estamos observando aqui?

As fotos são agrupadas em uma classe de apresentação de slides, usada para alinhar elementos horizontal e verticalmente.

.slideshow possui os seguintes estilos:

 .slideshow { width: 100vw; height: 100vh; display: flex; justify-content: center; align-items: center; } 

Temos 6 fotos. Cada foto recebe a classe "i_number of photos". Sob cada foto, há uma assinatura com a classe "p_number of photo".

Img tem os seguintes estilos:

 img { position: absolute; max-width: 90vw; max-height: 80vh; opacity: 0; animation: slideshow 36s ease-in-out infinite; } 

O tempo de animação depende do número de fotos e do tempo de exibição de cada foto. Nesse caso: 6 fotos por 6 segundos cada.

Vamos para a animação:

 @keyframes slideshow { from { opacity: 0; filter: grayscale(100%); } 5% { opacity: 1; filter: grayscale(50%); } 10% { opacity: 1; filter: grayscale(0); transform: scale(1.1); } 15% { opacity: 1; filter: blur(0); } 20% { opacity: 0; filter: blur(2px); transform: scale(0.9); } 25% { opacity: 0; } } 

Usamos apenas 25% da animação, mas em seis etapas. 25% é a quarta parte, portanto as fotos se sobrepõem um pouco. Como estamos implementando o efeito "fade in-fade out", ou seja, Trabalhamos com transparência, é exatamente disso que precisamos.

Usando “filter: grayscale”, saturamos a cor da foto exibida (branqueada), usando “transform: scale”, dimensionamos a foto um pouco para frente ao produzir e um pouco para trás ao substituir, usando “filter: blur” para desfocar a foto substituída.

Em seguida, trabalhamos com fotos individuais:

 .slideshow .i_1 { animation-delay: 6s; transform: translateX(-100px) rotate(-3deg); } .slideshow .i_2 { animation-delay: 12s; transform: translateX(100px) rotate(3deg); } .slideshow .i_3 { animation-delay: 18s; transform: translateY(-100px) rotate(3deg); } .slideshow .i_4 { animation-delay: 24s; transform: translateY(100px) rotate(-3deg); } .slideshow .i_5 { animation-delay: 30s; transform: rotate(-6deg); } .slideshow .i_6 { animation-delay: 36s; transform: rotate(6deg); } 

Definimos o atraso da animação para cada foto (6 segundos do primeiro e +6 segundos de cada subsequente). Para variar, mudamos e giramos cada foto usando "transform: translate rotate" (os valores foram selecionados empiricamente).

Terminamos a foto. Agora vamos às assinaturas.

P tem os seguintes estilos:

 p { margin: 0; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #e4e4e4; text-shadow: 0 0 1px #000; text-transform: uppercase; font-size: 2.8em; opacity: 0; animation: title 36s linear infinite; } 

O tempo de animação das legendas corresponde ao tempo da animação da foto.

A animação de assinatura parece muito mais fácil:

 @keyframes title { from { opacity: 0; } 5% { opacity: 1; } 20% { opacity: 1; } 25% { opacity: 0; } } 

Também exibimos uma assinatura separada usando o atraso da animação:

 .slideshow .p_1 { animation-delay: 7s; } .slideshow .p_2 { animation-delay: 13s; } .slideshow .p_3 { animation-delay: 19s; } .slideshow .p_4 { animation-delay: 25s; } .slideshow .p_5 { animation-delay: 31s; } .slideshow .p_6 { animation-delay: 37s; } 

Observe que o atraso das legendas na animação é de 1 segundo a mais que os valores correspondentes das fotos. Isso é feito para exibir legendas após o aparecimento e a transformação de uma foto específica.

Isso é tudo. Na minha opinião, ficou simples, mas interessante.

O resultado pode ser visto aqui .

Obrigado pela atenção. Tudo de bom.

Source: https://habr.com/ru/post/pt486064/


All Articles