Dinâmica Do Espelho Com Texto Reflexivo - Dinâmica Do Espelho Com Texto Reflexivo - RETOEDU
Dinâmica Do Espelho Com Texto Reflexivo - RETOEDU

O que essa técnica faz no navegador

Você provavelmente já viu aquele efeito onde o texto parece estar refletido numa superfície brilhante, tipo uma tabela de polimento ou água parada. A dinâmica do espelho com texto reflexivo é basicamente isso: pega um bloco de conteúdo e gera uma versão invertida abaixo dele, com fade gradual até sumir. Funciona em CSS puro com pseudo-elementos, mas também pode ser feito via JavaScript quando você precisa de compatibilidade mais ampla ou efeitos mais complexos.

A implementação mais comum usa ::after ou ::before com transform: scaleY(-1), depois aplica gradiente de transparência e um overflow: hidden no container pai. O resultado depende de três variáveis principais: a altura do fade, o ângulo de inclinação (quando existe) e a opacidade do reflexo.

Implementando a dinâmica do espelho com texto reflexivo

Aqui vai o esqueleto mínimo que funciona na maioria dos navegadores modernos: ```css .reflexo-container { position: relative; overflow: hidden; display: inline-block; } .reflexo-container::after { content: attr(data-text); position: absolute; bottom: 0; left: 0; transform: scaleY(-1); -webkit-transform: scaleY(-1); background: linear-gradient(to bottom, transparent 50%, rgba(255,255,255,0.8) 100%); -webkit-background-clip: text; background-clip: text; color: transparent; mask-image: linear-gradient(to bottom, black 0%, transparent 60%); -webkit-mask-image: linear-gradient(to bottom, black 0%, transparent 60%); } ```

O HTML correspondente seria um simples <div class="reflexo-container" data-text="Seu texto aqui">Seu texto aqui</div>. O atributo data-text é o que alimenta o pseudo-elemento. Sem ele, o conteúdo duplicado não aparece. Existem dois problemas que todo mundo encontra na primeira implementação. O primeiro é que o texto no reflexo fica espelhado horizontalmente também se você usar apenas scaleX(-1) junto com scaleY(-1). A solução é aplicar a transformação só no eixo Y e garantir que o container pai corte o que extravasa com overflow: hidden. O segundo problema é que textos longos quebram o efeito visualmente porque o gradiente de fade não cobre a área correta. Nesses casos, eu gosto de limitar a altura do container e usar text-overflow: ellipsis no conteúdo original.

Um detalhe que muita gente esquece: o mask-image não funciona no Internet Explorer, então se seu público usa Edge antigo ou IE, você precisa de um fallback. No meu caso, num projeto interno de 2023, tínhamos usuários ainda com Edge Legacy e o reflexo simplesmente não aparecia para eles. A solução foi detectar o navegador com feature detection em vez de user agent string, e nesse cenário aplicar uma classe CSS que usa opacity decrescente num segundo elemento <div> posicionado absolutamente em vez de pseudo-elemento.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Variantes que valem a pena testar

O reflexo horizontal (scaleX(-1)) cria um efeito diferente, mais parecido com uma imagem refletida numa superfície vertical como vidro ou espelho de banheiro. Isso é útil para headlines em páginas de produto. O reflexo diagonal com skew dá a sensação de piso brilhante, que era bastante usado em templates dos anos 2010 e ainda aparece em sites de restaurante e moda.

Para o reflexo horizontal, a técnica muda levemente. Você inverte o eixo X no pseudo-elemento e reposiciona com left: 0 e top negativo para alinhar com a base do texto original. O gradiente de fade precisa ir da esquerda para a direita nessa configuração, não de cima para baixo. O reflexo diagonal usa transform: skewY(-20deg) scaleY(0.5) ou valores similares, e o gradiente se ajusta conforme a inclinação. Eu costumo usar -webkit-mask-composite: destination-out para ter controle mais fino sobre a transição de opacidade do que apenas relying no gradiente de mask.

Quando não usar isso

A principal desvantagem prática é performance. Renderizar reflexos com pseudo-elementos e máscaras exige do GPU do navegador. Em dispositivos móveis mais antigos, isso pode causar stuttering se houver vários elementos na página usando a técnica simultaneamente. Eu já vi páginas de e-commerce com oito seções de produto, cada uma com seu reflexo de texto, e o scroll travava em um Galaxy S9. A saída foi desativar o efeito via @media (prefers-reduced-motion) e também fazer um media query por capacidade de hardware quando possível.

Outro problema é acessibilidade. O texto no reflexo é conteúdo duplicado visual, mas do ponto de vista do screen reader ele aparece como leitura repetida. Isso irrita usuários de leitores de tela. A solução é garantir que o pseudo-elemento não seja encontrado por assistivos — o que já acontece naturalmente com ::after e ::before, mas você precisa verificar se algum JavaScript do projeto não está injetando o conteúdo de forma diferente. Também tem o problema de legibilidade em fundos escuros. O gradiente padrão que eu mostrei acima funciona bem em fundo claro. Em fundo escuro, você inverte os stops do gradiente e usa color com valor semi-transparente no lugar de transparent com background-clip: text. Se não ajustar isso, o reflexo simplesmente não aparece ou fica com aparência de erro de renderização.

Alternativas quando o CSS puro não basta

Se você precisa de reflexos que acompanhem animações de movimento 3D, o caminho CSS puro entra num limite rápido. Nesse caso, bibliotecas como Three.js ou até SVG com <use> e transformações permitem reflexos mais realistas. Para a maioria dos casos, porém, o CSS com pseudo-elemento resolve em menos de dez minutos de implementação, contra vinte ou trinta para um setup WebGL.

Existe também a abordagem de Canvas, que é útil quando o texto é dinâmico e vem de uma API em tempo real. Desenhar o reflexo frame a frame no Canvas dá mais controle sobre a física da reflexão, mas exige muito mais código e manutenção. Eu recomendo só quando o projeto realmente precisa de algo além de um efeito estático. O ponto central é que a dinâmica do espelho com texto reflexivo é uma técnica simples na teoria, mas com detalhes de implementação que importam. Teste no dispositivo-alvo antes de considerar o job pronto, verifique o fallback para navegadores mais antigos e não esqueça de verificar se o efeito não quebra a experiência de quem usa tecnologias assistivas.