Como construir uma animação de carregamento de CSS puro (com quadros-chave)

As animações são uma ótima maneira de tornar um site mais interessante; Deixa-me mostrar-te como.

A maioria das animações depende do JavaScript de uma forma ou de outra, especialmente quando lidam com sequências complicadas ou ocorrem após uma interação do usuário, como rolagem ou clique.

No entanto, se estivermos construindo uma animação simples que não exija nenhuma interação do usuário, isso pode ser feito apenas com CSS.

1. Marcação com HTML

Para a estrutura de nossa página da Web, dividiremos o banner em elementos individuais que iremos animar.

1
 class="container">
2
   class="split-screen">
3
   class="background-image">
4
   class="content">
5
    Hello  class="comma">,

6
    

World

7
  
8

2. Estilizando com CSS

Agora podemos estilizar o layout da nossa página. Vamos começar com os elementos estáticos, ou seja, os elementos que não precisam de nenhuma animação.

1
body {
2
  margin: 0;
3
  background-color: #b1bcbf;
4
}
5
6
.container {
7
  width: 100%;
8
  height: 100vh;
9
  position: relative;
10
}
11
12
.background-image {
13
  width: 50%;
14
  position: absolute;
15
  top: 0;
16
  bottom: 0;
17
  left: 0;
18
  margin: auto;
19
  background-image: url("https://images.pexels.com/photos/1261728/pexels-photo-1261728.jpeg");
20
  background-size: cover;
21
}

Veja como está nossa página atualmente:

Uma página da web com metade de uma imagemUma página da web com metade de uma imagemUma página da web com metade de uma imagem

3. Animando com CSS

Depois de terminar nosso estilo estático, podemos passar para os elementos animados. A principal coisa a ter em mente ao trabalhar com animações CSS é monitorar o tempo de cada elemento animado para garantir que eles fluam suavemente juntos. Felizmente, você pode visualizar os detalhes de qualquer animação em uma página da Web usando o Chrome DevTools Animation Inspector. Este gráfico nos dá uma ideia clara do ponto inicial e durante cada elemento animado em nossa página da web.

Vamos dar uma olhada na linha do tempo da nossa demonstração:

Um gráfico mostrando os diferentes tempos das animações do elementoUm gráfico mostrando os diferentes tempos das animações do elementoUm gráfico mostrando os diferentes tempos das animações do elemento

Agora que temos uma ideia de como é a linha do tempo, vamos recriá-la começando com a animação em tela dividida.

O estilo inicial do elemento é definido para cobrir completamente a página:

1
.split-screen {
2
  width: 100%;
3
  background-color: #2c2d2b;
4
  position: absolute;
5
  right: 0;
6
  top: 0;
7
  bottom: 0;
8
  z-index: 2;
9
}

Em seguida, definiremos uma nova animação usando o @keyframes propriedade.


Os quadros-chave são usados ​​para determinar a linha do tempo de cada animação.

Por exemplo, se tivermos uma animação com duração de 2 segundos e definirmos uma opacidade de propriedade de quadro-chave: 1 em 50%, isso significa que o elemento atingirá uma opacidade de 1 em 1s. Também podemos usar o from e to palavras-chave para especificar os quadros-chave inicial e final.

Queremos definir o elemento de tela dividida para ir de 100% a 50% da largura da página.

1
@keyframes reduceSize {
2
  from {
3
    width: 100%;
4
  }
5
  to {
6
    width: 50%;
7
  }
8
}

Atribuir os quadros-chave de animação a um elemento

Agora podemos atribuir esta animação ao split-screen elemento usando o animation-name propriedade. Também podemos controlar o tempo da animação usando o animation-duration e animation-delay propriedades. Com base no gráfico de animação acima, queremos que a animação em tela dividida comece 500ms após o carregamento da página, então daremos um atraso de 0,5s:

1
animation-name: reduceSize;
2
animation-duration: 1.5s;
3
animation-delay: 0.5s;

Esta é a aparência da nossa animação agora (novamente, pressione Rerun para ver a animação):

Modo de preenchimento de animação

Na caneta acima, notamos que o elemento volta ao seu estado original após a animação. Podemos evitar que isso aconteça usando o animation-fill-mode propriedade. Esta propriedade nos permite controlar o estado de um elemento animado antes e depois da realização da animação.

1
animation-name: reduceSize;
2
animation-duration: 1.5s;
3
animation-delay: 0.5s;
4
animation-fill-mode: forwards;

Definindo a propriedade como forwards, estamos especificando que a animação deve manter o estado de seu último quadro-chave. Esta é a nossa animação atualizada:

Usar propriedade abreviada é ainda melhor

Podemos usar a propriedade abreviada de animação para aplicar todo o estilo de animação até agora. Agora, nosso estilo de tela dividida fica assim:

1
.split-screen {
2
  width: 100%;
3
  background-color: #2c2d2b;
4
  position: absolute;
5
  left: 0;
6
  top: 0;
7
  bottom: 0;
8
  z-index: 2;
9
  animation: reduceSize 1.5s 0.5s forwards;
10
}

O valor de duração da animação deve ser colocado antes do valor de atraso da animação.

próxima animação

A próxima animação que aplicamos ao banner da tela dividida é movê-lo para a direita da tela. Definiremos uma propriedade de quadro-chave para lidar com isso:

1
@keyframes moveRight {
2
  from {
3
    left: 0%;
4
  }
5
  to {
6
    left: 50%;
7
  }
8
}

Vamos definir o tempo da animação para começar 3s após o carregamento da página e durar um total de 1,5s. Também podemos combinar animações em CSS:

1
.split-screen {
2
  width: 100%;
3
  background-color: #2c2d2b;
4
  position: absolute;
5
  left: 0;
6
  top: 0;
7
  bottom: 0;
8
  z-index: 2;
9
  animation: 
10
    reduceSize 1.5s 0.5s forwards,
11
    moveRight 1.5s 3s forwards;
12
}

Animação no conteúdo da página

Em seguida, vamos animar o conteúdo da página.

Existem três animações a serem definidas para o conteúdo:

  1. O conteúdo aparece gradualmente enquanto desliza para cima a partir da parte inferior da página
  2. O conteúdo desliza para a direita
  3. O conteúdo altera a cor do texto de branco para uma imagem de fundo

Vamos definir os quadros-chave para cada um. Para deslizar o conteúdo para a direita, podemos reutilizar a animação moveRight já definida.

1
@keyframes fadeInUp {
2
  from {
3
    transform: translateY(100vh);
4
    opacity: 0;
5
  }
6
  to {
7
    transform: translateY(0);
8
    opacity: 1;
9
  }
10
}
11
12
@keyframes changeBackground {
13
  to {
14
    background-image: url("https://images.pexels.com/photos/1261728/pexels-photo-1261728.jpeg");
15
    background-size: 200%;
16
    background-position: center;
17
    background-clip: text;
18
    -webkit-background-clip: text;
19
    color: transparent;
20
  }
21
}

Para o quadro-chave changeBackground, usamos o background-clip propriedade para definir a cor do texto como uma imagem de plano de fundo em vez de uma única cor.

Agora vamos estilizar o conteúdo. Como estamos trabalhando com atrasos de animação, precisaremos aplicar o quadro-chave de início da animação diretamente ao conteúdo ou isso causará um erro quando a animação começar. Dê uma olhada no que acontece se não tivermos o estilo de conteúdo inicial correspondente ao estilo de início do quadro-chave:

O conteúdo fica visível no carregamento da página antes da opacidade e transforma as propriedades no fadeInUp animação são aplicadas, então precisaremos incluir essas propriedades no estilo do conteúdo:

1
.content {
2
  color: white;
3
  font-size: 10vw;
4
  text-transform: uppercase;
5
  position: absolute;
6
  width: fit-content;
7
  height: fit-content;
8
  top: 0;
9
  left: 0;
10
  right: 0;
11
  bottom: 0;
12
  margin: auto;
13
  z-index: 4;
14
  opacity: 0;
15
  transform: translateY(100vh);
16
  animation: 
17
    fadeInUp 2s 0.5s, 
18
    moveRight 1.5s 3s,
19
    changeBackground 1.5s 3s;
20
  animation-fill-mode: forwards;
21
}

Um Último Detalhe

Por fim, aplicamos uma última animação ao span contendo uma vírgula apenas por diversão:

1
.content .comma {
2
  color: #2c2d2b;
3
  opacity: 1;
4
  animation: fadeOut 0.5s forwards 2.5s;
5
}
6
7
@keyframes fadeOut {
8
  from {
9
    opacity: 1;
10
  }
11
  to {
12
    opacity: 0;
13
  }
14
}

Foram realizadas!

E é isso – terminamos com nosso banner animado em CSS!

Deixe uma resposta