Criando Pré-Carregadores em CSS3
Portuguese (Português) translation by Erick Patrick (you can also view the original English article)
Pré-carregadores são algo bastante comum no web design moderno. Como usuários, esperamos que a web seja rápida e fluida - não gostamos de esperar pelas coisas. Pré-carregadores oferecem uma resposta visual que indica que algum conteúdo está sendo carregado, adiministrando expectativas, reduz as chances dos usuários abandonarem seu site.
O Básico do CSS3 para a Criação de Pré-Carregadores
Antes de começarmos a construir nossa coleção de pré-carregadores, discutiremos algumas das características do CSS3 que são essenciais para a criação desse tipo de pré-carregadores
Os Pseudo-elementoss :before
:after
Pseudo-elementos são bastante úteis na criação de pré-carregadores com CSS3. Eles criam um elemento falso antes ou depois do elemento HTML em questão.
“Pseudo é uma palavra que deriva do termo grego pseudēs, que significa falso.”
É o mesmo que criar um elemento que não existe, porém, passível de ser estilizado com CSS. Esses pseudo-elementos não são necessários para a criação de pré-carregadores com CSS3, mas facilitam bastante na hora de minimizar o código HTML.
Pseudo-elementos podem ser estilizados da mesma forma que você faria com qualquer outro elemento HTML, a única diferença é que você precisa especificar a propriedade content
deles. Se não espicificá-la, o elemento não renderizará. A propriedade content
pode conter qualquer texto que seja útil para o seu pré-carregador, como "Carregando...", entretanto, se não precisar de qualquer texto extra, você pode atribuir uma cadeia de caracteres vazia, para essa propriedade.
Animação em CSS3
Os pseudo-elementos do CSS são úteis, porém, não essenciais para a criação de pré-carregadores, contudo, a propriedade animation
é. Sem ela, o pré-carregador falhará em ser animado e passaria a ser um simples adorno visual estático - algo não muito útil para indicar que algum conteúdo está em carregamento.
“O principal componente de animações em CSS é o @keyframes, a regra do CSS onde a animação é criada. Pense no @keyframes como estágios em uma linha do tempo. Dentro da @keyframes, você pode definir esses estágios, cada um com seus própriso estilos declarados.” - Uma introdução à Animação em CSS
Nota: antes de seguirmos para a demonstração, é importante atentar que os prefixos dos motores dos navegadores não estão inlusos nos trechos de códigos abaixo. Se precisar desses prefixos, por favor, veja os exemplos no codepen.
1. Onda de Áudio
A ideia por trás desse pré-carregador é criar uma animação equivalente a uma onda de áudio.
HTML
Ela é obtida através da criação de cinco elementos span
s, cada um representando uma barra de áudio.
1 |
<div id="preloader_1"> |
2 |
<span></span>
|
3 |
<span></span>
|
4 |
<span></span>
|
5 |
<span></span>
|
6 |
<span></span>
|
7 |
</div>
|
CSS
O efeito é obtido através da animação da altura de cada span
, de 5px para 30px. A span
também se movimenta para baixo no eixo Y em 15px, para dar o efeito de que está crescendo a partir do centro.
1 |
#preloader_1{ |
2 |
position:relative; |
3 |
}
|
4 |
#preloader_1 span{ |
5 |
display:block; |
6 |
bottom:0px; |
7 |
width: 9px; |
8 |
height: 5px; |
9 |
background:#9b59b6; |
10 |
position:absolute; |
11 |
animation: preloader_1 1.5s infinite ease-in-out; |
12 |
}
|
13 |
|
14 |
#preloader_1 span:nth-child(2){ |
15 |
left:11px; |
16 |
animation-delay: .2s; |
17 |
|
18 |
}
|
19 |
#preloader_1 span:nth-child(3){ |
20 |
left:22px; |
21 |
animation-delay: .4s; |
22 |
}
|
23 |
#preloader_1 span:nth-child(4){ |
24 |
left:33px; |
25 |
animation-delay: .6s; |
26 |
}
|
27 |
#preloader_1 span:nth-child(5){ |
28 |
left:44px; |
29 |
animation-delay: .8s; |
30 |
}
|
31 |
@keyframes preloader_1 { |
32 |
0% {height:5px;transform:translateY(0px);background:#9b59b6;} |
33 |
25% {height:30px;transform:translateY(15px);background:#3498db;} |
34 |
50% {height:5px;transform:translateY(0px);background:#9b59b6;} |
35 |
100% {height:5px;transform:translateY(0px);background:#9b59b6;} |
36 |
}
|
Por padrão, a animação em cada span
acontece ao mesmo tempo. O efeito da Onda Mexicana é criado a partir da adição de um atraso, com a propriedade animation-delay
, a cada span
com um valor de 2 milisegundos. Cada span
é selecionada através do uso do seletor nth-child()
.
2. Quadrado Circular
Esse pré-carregador usa quatro quadrados que se transformam, giram e mudam de cor até se tornarem círculos.
HTML
Ele é criado usando quatro span
s; Cada um é um círculo/quadrado e possui sua própria animação.
1 |
<div id="preloader_2"> |
2 |
<span></span>
|
3 |
<span></span>
|
4 |
<span></span>
|
5 |
<span></span>
|
6 |
</div>
|
CSS
Todos eles vão de quadrados até se transformarem em círculos, ajustando a propriedade border-radius
de 0px (quadrado) para 20px (círulo).
1 |
#preloader_2{ |
2 |
position: relative; |
3 |
left: 50%; |
4 |
width: 40px; |
5 |
height: 40px; |
6 |
}
|
7 |
#preloader_2 span{ |
8 |
display:block; |
9 |
bottom:0px; |
10 |
width: 20px; |
11 |
height: 20px; |
12 |
background:#9b59b6; |
13 |
position:absolute; |
14 |
}
|
15 |
#preloader_2 span:nth-child(1){ |
16 |
animation: preloader_2_1 1.5s infinite ease-in-out; |
17 |
}
|
18 |
#preloader_2 span:nth-child(2){ |
19 |
left:20px; |
20 |
animation: preloader_2_2 1.5s infinite ease-in-out; |
21 |
|
22 |
}
|
23 |
#preloader_2 span:nth-child(3){ |
24 |
top:0px; |
25 |
animation: preloader_2_3 1.5s infinite ease-in-out; |
26 |
}
|
27 |
#preloader_2 span:nth-child(4){ |
28 |
top:0px; |
29 |
left:20px; |
30 |
animation: preloader_2_4 1.5s infinite ease-in-out; |
31 |
}
|
32 |
|
33 |
@-keyframes preloader_2_1 { |
34 |
0% {-transform: translateX(0px) translateY(0px) rotate(0deg); border-radius:0px;} |
35 |
50% {-transform: translateX(-20px) translateY(-10px) rotate(-180deg); border-radius:20px;background:#3498db;} |
36 |
80% {-transform: translateX(0px) translateY(0px) rotate(-360deg); border-radius:0px;} |
37 |
100% {-transform: translateX(0px) translateY(0px) rotate(-360deg); border-radius:0px;} |
38 |
}
|
39 |
@-keyframes preloader_2_2 { |
40 |
0% {-transform: translateX(0px) translateY(0px) rotate(0deg);border-radius:0px;} |
41 |
50% {-transform: translateX(20px) translateY(-10px) rotate(180deg);border-radius:20px;background:#f1c40f;} |
42 |
80% {-transform: translateX(0px) translateY(0px) rotate(360deg);border-radius:0px;} |
43 |
100% {-transform: translateX(0px) translateY(0px) rotate(360deg);border-radius:0px;} |
44 |
}
|
45 |
@-keyframes preloader_2_3 { |
46 |
0% {-transform: translateX(0px) translateY(0px) rotate(0deg);border-radius:0px;} |
47 |
50% {-transform: translateX(-20px) translateY(10px) rotate(-180deg); border-radius:20px;background:#2ecc71;} |
48 |
80% {-transform: translateX(0px) translateY(0px) rotate(-360deg);border-radius:0px;} |
49 |
100% {-transform: translateX(0px) translateY(0px) rotate(-360deg); border-radius:0px;} |
50 |
}
|
51 |
|
52 |
|
53 |
@-keyframes preloader_2_4 { |
54 |
0% {-transform: translateX(0px) translateY(0px) rotate(0deg); border-radius:0px;} |
55 |
50% {-transform: translateX(20px) translateY(10px) rotate(180deg); border-radius:20px;background:#e74c3c;} |
56 |
80% {-transform: translateX(0px) translateY(0px) rotate(360deg); border-radius:0px;} |
57 |
100% {-transform: translateX(0px) translateY(0px) rotate(360deg);border-radius:0px;} |
58 |
}
|
Cada um também se movimenta nos eixos X & Y em direções opostas à sua posição atual. A cor de cada span
também é animada e vai do púrpura até a cor definida para cada um. Isso dá a impressão de vários círculos fundindo em um único quadrado.
3. Formas Cruzadas
O pré-carregador de Formas Cruzadas é uma única div
que utiliza os pseudo-elementos :before
e :after
que mencionamos anteriormente.
HTML
1 |
<div id="preloader_3"></div> |
CSS
1 |
#preloader_3{ |
2 |
position:relative; |
3 |
}
|
4 |
#preloader_3:before{ |
5 |
width:20px; |
6 |
height:20px; |
7 |
border-radius:20px; |
8 |
background:blue; |
9 |
content:''; |
10 |
position:absolute; |
11 |
background:#9b59b6; |
12 |
animation: preloader_3_before 1.5s infinite ease-in-out; |
13 |
}
|
14 |
|
15 |
#preloader_3:after{ |
16 |
width:20px; |
17 |
height:20px; |
18 |
border-radius:20px; |
19 |
background:blue; |
20 |
content:''; |
21 |
position:absolute; |
22 |
background:#2ecc71; |
23 |
left:22px; |
24 |
animation: preloader_3_after 1.5s infinite ease-in-out; |
25 |
}
|
26 |
|
27 |
@keyframes preloader_3_before { |
28 |
0% {transform: translateX(0px) rotate(0deg)} |
29 |
50% {transform: translateX(50px) scale(1.2) rotate(260deg); background:#2ecc71;border-radius:0px;} |
30 |
100% {transform: translateX(0px) rotate(0deg)} |
31 |
}
|
32 |
@keyframes preloader_3_after { |
33 |
0% {transform: translateX(0px)} |
34 |
50% {transform: translateX(-50px) scale(1.2) rotate(-260deg);background:#9b59b6;border-radius:0px;} |
35 |
100% {transform: translateX(0px)} |
36 |
}
|
Uma animação é criada para o pseudo-elemento #preloader_3:before
e outra para o pseudo-elemento #preloader_3:after
. Cada animação muda uma cor diferente em tempos distintos. De forma semelhante ao pré-carregador anterior, cada pseudo-elemento sai de um círculo e vira um quadrado, ao animar a propriedade border-radius
.
4. A Cobra
A cobra é criada a partir de um conjunto de span
s, onde cada um é estilizado de forma que virem um círculo.
HTML
Eis o código HTML, mas você poderia, facilmente, criar esse pré-carregador usando, apenas, três círculos, ao usar apenas #preloader_4
com os pseudo-elementos :before
e :after
.
1 |
<div id="preloader_4"> |
2 |
<span></span> |
3 |
<span></span> |
4 |
<span></span> |
5 |
<span></span> |
6 |
<span></span> |
7 |
</div> |
CSS
A animação é criada ao mudar a posição Y de cada animação em -10px e mudar a cor do azul para o amarelo. Para criar o efeito de sombra, adicionamos um sombreamento a cada span
que modifica sua sombra vertical de 0px para 20px.
1 |
#preloader_4{ |
2 |
position:relative; |
3 |
}
|
4 |
#preloader_4 span{ |
5 |
position:absolute; |
6 |
width:20px; |
7 |
height:20px; |
8 |
background:#3498db; |
9 |
opacity:0.5; |
10 |
border-radius:20px; |
11 |
-animation: preloader_4 1s infinite ease-in-out; |
12 |
|
13 |
}
|
14 |
#preloader_4 span:nth-child(2){ |
15 |
left:20px; |
16 |
animation-delay: .2s; |
17 |
}
|
18 |
#preloader_4 span:nth-child(3){ |
19 |
left:40px; |
20 |
animation-delay: .4s; |
21 |
}
|
22 |
#preloader_4 span:nth-child(4){ |
23 |
left:60px; |
24 |
animation-delay: .6s; |
25 |
}
|
26 |
#preloader_4 span:nth-child(5){ |
27 |
left:80px; |
28 |
animation-delay: .8s; |
29 |
}
|
30 |
@keyframes preloader_4 { |
31 |
0% {opacity: 0.3; transform:translateY(0px); box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.1);} |
32 |
50% {opacity: 1; transform: translateY(-10px); background:#f1c40f; box-shadow: 0px 20px 3px rgba(0, 0, 0, 0.05);} |
33 |
100% {opacity: 0.3; transform:translateY(0px); box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.1);} |
34 |
}
|
Semelhante ao pré-carregador 1, ao adicionar animation-delay
a cada span
e atrasar cada uma delas em 2 milisegundos, cria-se o efeito de onda.
5. Disco Giratório
Esse é um disco.. que gira.
HTML
Usaremos uma única div
para o círculo central e o pseudo-elemento :after
para criar as linhas externas.
1 |
<div id="preloader5"></div> |
CSS
Adicionando uma borda às partes superior e inferior, e atribuindo uma border-radius
de 50px, criar-se duas linhas esternas. Adicionamos uma animação à div
principal só para alterar sua cor, e criamos o efeito de rotação adicionando transform: rotate()
. A animação do pseudo-elemento :after
é adicionada para alterar a cor da borda externa.
1 |
#preloader5{ |
2 |
position:relative; |
3 |
width:30px; |
4 |
height:30px; |
5 |
background:#3498db; |
6 |
border-radius:50px; |
7 |
animation: preloader_5 1.5s infinite linear; |
8 |
}
|
9 |
#preloader5:after{ |
10 |
position:absolute; |
11 |
width:50px; |
12 |
height:50px; |
13 |
border-top:10px solid #9b59b6; |
14 |
border-bottom:10px solid #9b59b6; |
15 |
border-left:10px solid transparent; |
16 |
border-right:10px solid transparent; |
17 |
border-radius:50px; |
18 |
content:''; |
19 |
top:-20px; |
20 |
left:-20px; |
21 |
animation: preloader_5_after 1.5s infinite linear; |
22 |
}
|
23 |
@keyframes preloader_5 { |
24 |
0% {transform: rotate(0deg);} |
25 |
50% {transform: rotate(180deg);background:#2ecc71;} |
26 |
100% {transform: rotate(360deg);} |
27 |
}
|
28 |
@keyframes preloader_5_after { |
29 |
0% {border-top:10px solid #9b59b6;border-bottom:10px solid #9b59b6;} |
30 |
50% {border-top:10px solid #3498db;border-bottom:10px solid #3498db;} |
31 |
100% {border-top:10px solid #9b59b6;border-bottom:10px solid #9b59b6;} |
32 |
}
|
6. Janela Brilhante
Nós incorporamos um pouco da Microsoft nessa daqui...
HTML
Esse pré-carregador é criado com uma div
e quatro span
s para cada quadrado.
1 |
<div id="preloader6"> |
2 |
<span></span>
|
3 |
<span></span>
|
4 |
<span></span>
|
5 |
<span></span>
|
6 |
</div>
|
CSS
Esse quadrados são posicionados na forma de grade. A animação é adicionada à div
principal para rotacionar todo o pré-carregador. Outra animação é adicionada às span
s que mudam de tamanho, indo de 100% para 50%. Nós, então, adicionamos animation-delay
a cada span
para criar o efeito de pulsação.
1 |
#preloader6{ |
2 |
position:relative; |
3 |
width: 42px; |
4 |
height: 42px; |
5 |
animation: preloader_6 5s infinite linear; |
6 |
}
|
7 |
#preloader6 span{ |
8 |
width:20px; |
9 |
height:20px; |
10 |
position:absolute; |
11 |
background:red; |
12 |
display:block; |
13 |
animation: preloader_6_span 1s infinite linear; |
14 |
}
|
15 |
#preloader6 span:nth-child(1){ |
16 |
background:#2ecc71; |
17 |
|
18 |
}
|
19 |
#preloader6 span:nth-child(2){ |
20 |
left:22px; |
21 |
background:#9b59b6; |
22 |
animation-delay: .2s; |
23 |
|
24 |
}
|
25 |
#preloader6 span:nth-child(3){ |
26 |
top:22px; |
27 |
background:#3498db; |
28 |
animation-delay: .4s; |
29 |
}
|
30 |
#preloader6 span:nth-child(4){ |
31 |
top:22px; |
32 |
left:22px; |
33 |
background:#f1c40f; |
34 |
animation-delay: .6s; |
35 |
}
|
36 |
@keyframes preloader_6_span { |
37 |
0% { transform:scale(1); } |
38 |
50% { transform:scale(0.5); } |
39 |
100% { transform:scale(1); } |
40 |
}
|
Conculsão
A grande vantagem de usar pré-carregadores em CSS3 ao invés de imagens é que eles são escaláveis e já adaptados para telas retina. Isso significa que, não importa em qual aparelho eles estejam, sempre estarão bem vivos, limpos e preparados para o futuro (contudo, tenha em mente que, nem todos os navegadores antigos dão suporte a animações em CSS).
Compreendendo algumas propriedades e técnicas importantes do CSS3, você deve ser capaz de criar seus próprios pré-carregadores. Eles são bacanas de se criar e, experimentando um pouco, você pode criar várias animações bem legais, que podem evitar que seus usuários deixem seu site.
Se você já criou algum pré-carregador legal, gostaria de vê-los! Sinta-se a vontade de deixar o link deles na área dos comentários.
Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!