Por que usar CSS 3D em vez de JavaScript puro?
Antes de bibliotecas pesadas ou engines, o CSS já oferece tudo o que precisamos para criar um flip convincente:
- Hardware acceleration (usa a GPU)
- Suavidade natural com
transitionetransform - Pouquíssimo impacto na performance
- Fácil de manter e depurar
A base do efeito está em três propriedades:
transform-style: preserve-3dbackface-visibility: hiddentransform: rotateY(180deg)
Estrutura HTML ideal da carta
Cada carta precisa de um container e duas faces (frente e verso):
<div class="card" data-card-id="1">
<div class="card-inner">
<div class="card-face card-front">
<!-- Conteúdo da frente (verso da carta) -->
<span class="card-pattern">?</span>
</div>
<div class="card-face card-back">
<!-- Conteúdo do verso (imagem ou ícone do par) -->
<img src="/assets/cards/star.svg" alt="Estrela" />
</div>
</div>
</div>A classe .card controla o estado (flipped ou não). O .card-inner é quem realmente gira.
CSS essencial do flip 3D
.card {
width: 120px;
height: 160px;
perspective: 1000px;
cursor: pointer;
}
.card-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.6s cubic-bezier(0.4, 0.2, 0.2, 1);
transform-style: preserve-3d;
}
.card.flipped .card-inner {
transform: rotateY(180deg);
}
.card-face {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.card-front {
background: linear-gradient(145deg, #4a6cf7, #3b5bdb);
color: white;
font-size: 2rem;
}
.card-back {
background: #ffffff;
transform: rotateY(180deg); /* Já começa virada */
}Pontos importantes da implementação
- perspective no container pai cria a sensação de profundidade. Valores entre 800px e 1200px costumam ficar naturais.
- backface-visibility: hidden esconde a face de trás quando ela não está visível — sem isso a animação fica “fantasma”.
- A face de trás (
.card-back) já receberotateY(180deg)no estado inicial. Assim, quando o container gira 180°, ela fica corretamente orientada para o jogador. - Use cubic-bezier em vez de ease para um movimento mais “orgânico” (começa rápido e desacelera suavemente).
Controlando o flip com JavaScript
O CSS faz a animação. O JavaScript só gerencia o estado:
function flipCard(cardElement) {
// Impede virar carta já encontrada ou enquanto anima
if (cardElement.classList.contains('matched') ||
cardElement.classList.contains('flipping')) {
return;
}
cardElement.classList.add('flipped', 'flipping');
// Remove a classe de animação após o tempo da transition
setTimeout(() => {
cardElement.classList.remove('flipping');
}, 600);
}Boas práticas de controle
- Bloqueie cliques durante a animação (flipping).
- Só permita virar no máximo 2 cartas por vez.
- Quando o par for encontrado, adicione a classe
matchede desabilite o clique. - Quando o par estiver errado, espere a animação terminar e remova a classe
flipped.
Melhorias avançadas que usamos
Efeito de elevação no hover
.card:not(.flipped):hover .card-inner {
transform: translateY(-6px) scale(1.03);
}Sombra dinâmica durante o giro
Você pode animar a box-shadow junto com o transform para dar mais realismo.
Suporte a redução de movimento (acessibilidade)
@media (prefers-reduced-motion: reduce) {
.card-inner {
transition: none;
}
}Performance em dispositivos móveis
- Evite
filterebox-shadowmuito complexos durante a animação. - - Prefira
transformeopacity(propriedades que a GPU acelera bem). - - Use
will-change: transformcom cuidado (apenas enquanto a carta está sendo interagida).
Conclusão
A animação de virar cartas com CSS 3D é um excelente exemplo de como técnicas relativamente simples podem gerar uma experiência polida e profissional. Com preserve-3d, backface-visibility e um controle de estado bem feito no JavaScript, conseguimos um efeito leve, performático e acessível — ideal para jogos de memória que rodam direto no navegador.
Essa é a base que utilizamos em nossos jogos de memória no portal. A partir daqui você pode evoluir adicionando sons de flip, partículas ou até diferentes eixos de rotação (rotateX para um flip vertical).
Se quiser ver a técnica em ação, experimente os jogos de memória disponíveis no Guima Games Portal.

