Como ambas as animações têm semelhanças, vou pegar emprestado algumas seções de conteúdo do tutorial anterior. Isso ajudará a manter cada tutorial detalhado e independente.
Demonstração de Animação de Página
Para este tutorial, nossa demonstração não vai ao vivo no CodePen. Como precisamos de páginas diferentes para mostrar a animação, decidi que é melhor hospedá-la no GitHub. Aqui está o estrutura do projeto:
1 |
panels-animation/ |
2 |
├── about.html |
3 |
├── contact.html |
4 |
├── index.html |
5 |
├── main.css |
6 |
└── main.js |
Antes de continuarmos, vale a pena notar que a inspiração para esta demo foi tirada do adorável Site da Nine Orchard.
1. Comece com a marcação da página
Vamos descrever a marcação para o index.html
página. Isso será semelhante às outras páginas.
Dentro dela, colocaremos:
- Um cabeçalho de página típico
- Os painéis que serão responsáveis por dividir a tela em sete partes iguais.
- O
main
elemento onde o conteúdo principal da página ficará.
Além disso, importaremos:
Com tudo isso em mente, aqui está a marcação associada:
1 |
|
2 |
lang="en">
|
3 |
|
4 |
charset="utf-8">
|
5 |
name="viewport" content="width=device-width, initial-scale=1">
|
6 |
rel="preconnect" href="https://fonts.gstatic.com">
|
7 |
rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap">
|
8 |
rel="stylesheet" href="main.css">
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
href="index.html">Home
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
Home Page
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
Considere os estilos embutidos que adicionamos aos painéis. Como veremos mais adiante, usaremos o index
Variável CSS para animá-los. Quanto maior o valor, mais tempo levará para o elemento associado ser animado.
2. Definir alguns estilos básicos
Em seguida, continuaremos com algumas variáveis CSS e redefiniremos estilos:
1 |
:root { |
2 |
--panel-width: calc(100% / 7); |
3 |
--darkblue: #02020c; |
4 |
--white: #fff; |
5 |
--lightgray: #fafafb; |
6 |
}
|
7 |
|
8 |
* { |
9 |
padding: 0; |
10 |
margin: 0; |
11 |
box-sizing: border-box; |
12 |
}
|
13 |
|
14 |
ul { |
15 |
list-style: none; |
16 |
}
|
17 |
|
18 |
a { |
19 |
color: inherit; |
20 |
text-decoration: none; |
21 |
}
|
22 |
|
23 |
h1 { |
24 |
font-size: 3rem; |
25 |
}
|
26 |
|
27 |
body { |
28 |
height: 100vh; |
29 |
font-family: "Montserrat", sans-serif; |
30 |
color: var(--white); |
31 |
background: var(--darkblue); |
32 |
overflow: hidden; |
33 |
}
|
Três coisas a serem observadas:
- O
panel-width
variável determinará a largura do painel. - A altura da página será igual à altura da viewport.
- Ocultaremos qualquer barra de rolagem em potencial que possa aparecer dependendo da quantidade de conteúdo da página.
3. Especifique os estilos principais
Vamos agora nos concentrar no principal estilos. Vamos deixar de fora os estilos de cabeçalho, pois eles não têm nenhuma importância.
4. Disparar as animações
Quando a página é carregada, as seguintes animações devem ser reproduzidas nesta ordem:
- Primeiro, os painéis devem aparecer de baixo para cima.
- Em seguida, os painéis devem desaparecer e passar para o topo.
- Por fim, todo o conteúdo da página deve ficar visível.
Durante as duas primeiras etapas, os painéis serão transicionados com algum atraso. Como discutimos antes, isso dependerá do valor de seus index
variável.
Imitar uma linha do tempo
Para criar uma sequência de interpolações como fizemos da última vez com a Timeline do GSAP, vamos ttirar proveito de um evento menos conhecido chamado transitionend
. Esse evento é acionado toda vez que uma transição CSS termina e nos dá a capacidade de sincronizar as animações.
Claro, não estamos interessados em todas as transições, em vez disso, nos preocupamos apenas com as transições dos painéis e especificamente com as transições do último painel animado. No nosso caso, os últimos painéis animados serão o primeiro e o sétimo (último) pois ambos possuem index: 3
.
Como você verá no código, trabalharemos com o último, mas também poderíamos ter usado o primeiro. Para entender melhor, tente dar ao painel selecionado um grande atraso de cerca de 1s e veja como as animações ficam fora de sincronia.
Em termos de lógica de código, faremos o seguinte nesta ordem:
- Primeiro, quando a página carregar, adicionaremos o
loaded
aula para obody
. - Então, vamos esperar até que a transição do último painel termine-esse disparará duas vezes no total. Nesse ponto, adicionaremos outra classe ao
body
. Na primeira vez, adicionaremos osecond-round
classe, enquanto na segunda vez, vamos adicionar othird-round
.
Após a conclusão de nossas transições, o body
terá essas aulas:
Aqui está o código JavaScript:
1 |
const body = document.body; |
2 |
const lastPanel = document.querySelector(".panels .panel:last-child"); |
3 |
|
4 |
window.addEventListener("load", () => { |
5 |
body.classList.add("loaded"); |
6 |
|
7 |
lastPanel.addEventListener("transitionend", () => { |
8 |
if (body.classList.contains("second-round")) { |
9 |
body.classList.add("third-round"); |
10 |
} else { |
11 |
body.classList.add("second-round"); |
12 |
}
|
13 |
});
|
14 |
});
|
Ao invés de
load
evento, poderíamos ter usado o DOMContentLoaded
evento.
E os estilos correspondentes:
1 |
.loaded .panels .panel { |
2 |
clip-path: inset(0); |
3 |
transition-delay: calc(var(--index) * 0.06s); |
4 |
}
|
5 |
|
6 |
.loaded.second-round .panels .panel { |
7 |
clip-path: inset(0 0 100% 0); |
8 |
}
|
9 |
|
10 |
.loaded.third-round { |
11 |
overflow: auto; |
12 |
}
|
13 |
|
14 |
.loaded.third-round .page-main > div > * { |
15 |
opacity: 1; |
16 |
transform: none; |
17 |
}
|
Conclusão
Parabéns, pessoal! Conseguimos construir uma atraente animação de carregamento de página JavaScript por meio de animações impressionantes, graças ao transitionend
evento. Obviamente, para uso mais pesado de animações, uma biblioteca como GSAP é uma abordagem mais robusta a seguir. Sinta-se à vontade para estender a demonstração como desejar e compartilhá-la comigo!
Como sempre, muito obrigado pela leitura!
Mais projetos para praticar
Dê uma olhada nesses projetos no Tuts+ que usam o clip-path
propriedade para aplicar diferentes tipos de animações.
[ad_2]