Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Diferença de layout conforme a ordem de utilização das transformações skew e rotate

Olá pessoal!

Na resposta do instrutor o código da resposta é:

transform:  rotate(-5deg) skew(-10deg);

Porém na explicação diz: "fazemos primeiro o skew para depois fazer o rotate. Se fizermos na ordem inversa, ficaremos com um resultado estranho, apesar de a diferença ser sutil.", ou seja, existe esta divergência entre código e texto.

Além disso existe ordem certa (padrão) para utilização destas tranformações? Se sim, qual seria e porque acontece esta diferença?

Desde já obrigado! Atte., Elías.

4 respostas
solução!

Boa noite, Elías! Como vai?

A divergência entre o texto e o código se dá pq foi definido pela W3C que as transformações seriam aplicadas da direita para a esquerda como pode ser visto nesse link da documentação. Mais precisamento nesse trecho que diz que o entendimento do impacto da aplicação é feito na ordem reversa:

The impact on the rendering of the element can be intepreted as an application of these transforms in reverse order: the elements is rotated, then scaled, then translated.

Por isso, a leitura é feita da direita para a esquerda.

Agora, para entender o motivo de haver uma ordem correta na aplicação das funções e pq a alteração na ordem influência o resultado final, vc precisará ter um pouco de conhecimento de álgebra linear e aplicação de funções matemáticas.

Então vamos lá!

A primeira coisa que vc precisa entender é que rotate, skew, translate, scale e as demais transformações possíveis de serem usadas no CSS são funções! Então vamos pegar o seu caso de exemplo, e imagina que eu tenha um elemento HTML sobre o qual eu queira primeiro aplicar um cisalhamento (distorção) e depois um rotação, como eu descreveria isso matematicamente?

  1. skew(elemento) = resultadoFinal
  2. rotate(resultadoFinal)

Ou de forma abreviada:

rotate(skew(elemento))

OPA!! Nesse momento vc já entende o motivo das transformações aparecerem em ordem inversa à que lemos! É pq o CSS está seguindo a notação matemática!

Mas vc deve estar pensando aí que ainda falta uma pergunta a ser respondida! E realmente há! Falta responder pq a ordem com que as transformações são escritas altera o resultado! E é aqui que entra a álgebra linear!

Essas funções de transformação por baixo dos panos são representadas por matrizes! Ou seja, rotate é representada por uma matriz padrão (aqui vamos chamar essa matriz de R) e skew tbm tem uma matriz padrão (que aqui vamos chamar de S). Nosso elemento HTML tbm será representado por uma matriz que chamaremos de E.

Então, a álgebra linear diz que para aplicarmos uma função de transformação devemos multiplicar a matriz padrão da transformação pela matriz na qual queremos aplicar a mudança. Sendo assim, na prática, se queremos aplicar primeiro um cisalhamento e depois um rotação, devemos fazer:

  1. Multiplicar a matriz de skew (S) pela matriz do elemento HTML (E). Isso dá como resultado uma nova matriz Resultado.
    S * E = Resultado
  2. Multiplicar a matriz de rotate (R) pela matriz do resultado anterior (Resultado). Isso dá como resultado uma nova matriz ResultadoFinal.
    R * Resultado = ResultadoFinal

Ou de forma simplificada:

R * S * E = ResultadoFinal

E novamente podemos ver que a ordem é igual à que aparece no CSS (rotate e depois skew).

Por fim, o motivo da ordem em que se declara as funções faz diferença pq a multiplicação de matrizes não é comutativa! Ou seja, em geral:

Matriz1 * Matriz2 != Matriz2 * Matriz1

Por esse motivo a ordem importa!

E a ordem em que vc vai declarar as funções de transformação no CSS vai depender do que vc quer fazer!

Mas como eu não deixo as pessoas nas trevas, sempre tenho uma dica na manga para levá-las para a luz! E a dica é: ordene mentalmente o que vc deseja fazer! Depois declare o CSS na ordem inversa!

Exemplo prático:

Questão: Quero expandir e depois rotacionar.

Resultado no CSS:

transform: rotate(...) scale(...);

Qualquer coisa é só falar!

Grande abraço e bons estudos!

Em tempo: A álgebra linear é um assunto bem vasto e dentro dela o assunto de transformações lineares como essas aplicadas no CSS é usada em larga escala na computação gráfica e criação de jogos.

Quer saber pq os jogos precisam de uma placa de vídeo sinistra pra rodar o jogo com gráficos realista? A resposta tá aí! Cada imagem que vc vê no jogo é a multiplicação de matrizes imensas que precisam ser calculadas de maneira rápida o suficiente para que tenhamos uma experiência o mais próximo da realidade.

Como diria o Flávio Almeida:

É muita emoção!

Olá Gabriel, tudo certo e contigo?

Cara, é uma pena ter aprendido apenas superficialmente esse conteúdo na escola (na faculdade não lembro de ter visto). Claro que isso não é desculpa para não ir atrás e aprender, mas o foco no momento é outro.

Enfim, ótima explicação, que ao mesmo tempo é engraçada e super didática! Consegui ter uma ideia geral* das transformações e sanou minhas dúvidas!

*ideia geral devido à minha falta de conhecimento, não tem nada a ver com a tua explicação, que foi espetacular.

Muito obrigado, abraço! Atte.

Opa, tudo ótimo! Que bom que ficou claro!

Nunca é tarde para aprendermos coisas novas que desejamos, então, se um dia tiver interesse pelo assunto manda bala!

E sempre que tiver qualquer dúvida é só recorrer ao pessoal aqui no fórum!

Grande abraço e bons estudos!