O que o transform faz
transform muda como um elemento é desenhado: deslocado, redimensionado, girado ou inclinado. Os contornos tracejados abaixo mostram onde cada caixa estaria sem o transform:
translate(20px, 10px) desloca a caixa azul 20px para o lado e 10px para baixo. scale(1.3) deixa a verde 30% maior em volta do centro. rotate(20deg) gira a âmbar no sentido horário, e skewX(-20deg) inclina a escura. Em todos os casos, o espaço tracejado, que é o lugar que o elemento ocupa no layout, fica exatamente onde estava.
Funções de transform
| Função | Faz | Exemplo |
|---|---|---|
translate(x, y) | desloca | translate(20px, -10px), translate(-50%, -50%) |
translateX(x) / translateY(y) | desloca em um eixo | translateY(-4px) |
scale(s) / scale(x, y) | redimensiona (1 = original, 0.5 = metade, negativo espelha) | scale(1.1), scale(-1, 1) |
scaleX(s) / scaleY(s) | redimensiona em um eixo | scaleX(0.5) |
rotate(angle) | gira no sentido horário (negativo = anti-horário) | rotate(45deg), rotate(0.25turn) |
skew(x, y) / skewX(a) / skewY(a) | inclina | skewX(-15deg) |
matrix(a, b, c, d, e, f) | tudo isso em uma matriz, quase sempre o que o navegador devolve | |
none | sem transform |
As porcentagens em translate() são relativas ao tamanho do próprio elemento, não ao do pai. A rotação tem página própria, com graus, voltas e giro contínuo: rotate no CSS.
Playground de transform
Mexa nos controles deslizantes. A primeira linha é o valor de transform que você montou; a segunda é a matriz que o navegador calculou a partir dele, que é o que o getComputedStyle devolve para qualquer transform:
Transforms não mexem no layout
Um elemento com transform é desenhado em outro lugar, mas a página é montada como se ele não tivesse transform. Os vizinhos mantêm as posições. É isso que torna os transforms bons para efeitos de hover e animação: nada em volta é refeito.
As duas caixas do meio parecem 1.5 vez maiores. A que usa scale fica por cima dos vizinhos e C não se move; a que cresceu com width e height empurra C 40px para o lado.
Vários transforms e a ordem deles
Coloque várias funções em um único transform, separadas por espaços. A ordem muda o resultado porque, lendo da esquerda para a direita, cada função trabalha no sistema de coordenadas deixado pelas funções anteriores:
A caixa azul se deslocou 120px em linha reta e depois girou no lugar. A verde girou primeiro, então o "eixo x" dela aponta na diagonal, e translateX(120px) a desloca ao longo da diagonal. As mesmas funções, em um lugar diferente.
A outra armadilha: uma segunda declaração transform substitui a primeira. Se um card tem transform: rotate(-2deg) e a regra de hover diz transform: scale(1.05), a rotação some no hover. Repita as duas (rotate(-2deg) scale(1.05)) ou use as propriedades individuais abaixo.
transform-origin
Redimensionar, girar e inclinar acontecem em volta de um ponto fixo, a origem do transform, que por padrão é o centro. Mude com palavras-chave, comprimentos ou porcentagens:
As três caixas giram 25 graus. A primeira gira em torno do meio, a segunda mantém o canto superior esquerdo preso ao canto do espaço reservado, a terceira o canto inferior direito. Um menu dropdown que cresce a partir do botão usa transform-origin: top com scale().
As propriedades translate, scale e rotate
Os navegadores modernos também têm três propriedades separadas que fazem o mesmo que as funções, mas podem ser definidas e animadas de forma independente:
.card {
rotate: -2deg;
transition: scale 0.2s ease-out;
}
.card:hover {
scale: 1.05; /* the rotation stays, because it is a different property */
}
Elas sempre se combinam como se estivessem escritas transform: translate(...) rotate(...) scale(...) antes de qualquer valor de transform, seja qual for a ordem em que você as declara. Repare na sintaxe: translate: 10px 20px e scale: 1.2 recebem os valores sem os parênteses de função.
Centralizar com translate(-50%, -50%)
Como as porcentagens de translate() se referem ao tamanho do próprio elemento, top: 50%; left: 50%; transform: translate(-50%, -50%) centraliza no pai um elemento absolute de qualquer tamanho. A página de como centralizar uma div compara isso com flexbox e grid.
Erros comuns
- Duas declarações
transform. A posterior vence por inteiro. Combine as funções ou use as propriedadesrotate,scaleetranslate. - Aplicar transform em um elemento inline. Um
<span>ou<a>simples ignora otransform. Transforme-o eminline-block. - Esperar que os vizinhos se movam. Transforms nunca mudam o layout. Para abrir espaço, mude
width,marginougap. - Ordem errada das funções.
rotate()antes detranslate()desloca ao longo do eixo girado. - Surpresas com filhos
position: fixed. Um elemento com transform vira o bloco que contém os descendentes com posição fixa, então um cabeçalho fixo dentro dele rola junto. Ele também cria um novo stacking context para oz-index.
Perguntas frequentes
O que o transform faz no CSS?
Muda como um elemento é desenhado: deslocado (translate), redimensionado (scale), girado (rotate) ou inclinado (skew). O elemento mantém o lugar original no layout, então os elementos em volta não se movem.
Como aplicar vários transforms no CSS?
Liste-os em um único valor de transform, separados por espaços: transform: translateX(50px) rotate(20deg) scale(1.2);. Escrever uma segunda declaração transform substitui a primeira em vez de somar a ela.
A ordem das funções de transform importa?
Sim. Lendo da esquerda para a direita, cada função trabalha nos eixos que as anteriores deixaram, então rotate(45deg) translateX(100px) move o elemento ao longo de um eixo girado, enquanto translateX(100px) rotate(45deg) o move em linha reta e depois o gira.
O que é transform-origin?
O ponto fixo em volta do qual acontecem o redimensionamento, a rotação e a inclinação. O padrão é o centro (50% 50%). transform-origin: top left faz um elemento crescer a partir do canto superior esquerdo, ou girar em volta dele.
Por que o transform não funciona no meu span?
Os transforms não se aplicam a elementos inline não substituídos, como um <span> ou <a> simples. Dê ao elemento display: inline-block ou block e o transform funciona.