Imagem post: Introdução ao CSS 3D – Flip Card
Client-Side

Introdução ao CSS 3D – Flip Card

Entenda como funciona o CSS 3D e suas aplicações.

Por
13

O CSS 3D é sem dúvida uma das features do CSS mais aguardadas por todas as crianças do Brasil. Fala a verdade! Fazer efeitozinhos com sombra, gradientes, transparências e etc já foi um dia na vida do desenvolvimento algo bacana. Hoje é muito fora de moda. Carne de vaca, sabe? Por isso o CSS 3D é tão esperado. Ele trará para a web efeitos visuais para layout que antes só viamos em sistemas que rodam em smartphones, tipo um iPhone ou nos sistemas operacionais mais populares como Linux e OSX.

Mas não se anime muito. Eu sei que você está ansioso para sair por aí colocando efeitos 3D de CSS em tudo quanto é aplicação. Mas calma… entenda que o CSS foi feito para estilizar documentos. Você o utiliza para melhorar a experiência dos usuários nos diversos dispositivos e não para enfeitar seu website como se fosse uma penteadeira. Lembra-se dos websites cheios de gifs animados? Pois é, cuidado para não cair no mesmo erro. Você estará utilizando o CSS 3D da maneira certa se seus efeitos passarem desapercebidos pelo usuário ao utilizar seu sistema. Encher seu sistema com efeitos a cada clique ou a cada ação pode fazer com que o usuário perca tempo e a paciência.

Mas vamos ao que interessa.

O suporte

Infelizmente isso ainda está restrito para browsers. O Internet Explorer não tem suporte ainda e nem tem data para tal. Todos os exercícios que você ver neste post são feitos para browsers que tem WebKit como motor de renderização. Por isso teste em seu Chrome ou no seu Safari. Eu testei no Chrome porque o Safari mostrou algumas inconsistências. O Opera está esperando as especificações de CSS Transforms amadurecerem para adicionar este recurso. Testei no Firefox 8.0.1 e o exercício não funcionou.

A degradação do CSS 3D para os browsers que não o suportam é um pouco infeliz. Sugiro que se você for utilizar essas features, tente fazê-lo em projetos restritos para que não haja problemas com usuários de browsers antigos. Se ainda assim você quiser arriscar, crie soluções especifica para seu projeto, fazendo com que a experiência do seu cliente não seja muito prejudicada.
Sugiro que utilize a biblioteca Modernizr para identificar os browsers que não entendem o CSS 3D.

Tudo é uma questão de perspectiva

Para falar de 3D, precisamos falar sobre perspectiva. Para ativar uma área 3D o elemento precisará de perspectiva.
Você pode aplicar a perspectiva ao elemento de duas formas: utilizando diretamente a propriedade perspective ou adicionando um valor perspective() na propriedade transform.

[cc lang="css"]
div {
-webkit-perspective: 600;
}
[/cc]

Ou:

[cc lang="css"]
div {
-webkit-transform: perspective(600);
}
[/cc]

Estes dois formatos são os gatilhos que ativam a área 3D onde o elemento irá trabalhar.

O valor da perspectiva determina a intensidade do efeito. Imagine como se fosse a distância de onde vemos o objeto. Quanto maior o valor, mais perto o elemento estará, logo, menos intenso será o visual 3D. Logo, se colocarmos um valor de 2000, o objeto não terá tantas mudanças visuais e o efeito 3D será suave. Se colocarmos 100, o efeito 3D será muito visível, como se fosse um inseto olhando um objeto gigante.

Você também precisa entender sobre o ponto de fuga. O ponto de fuga por padrão está posicionado no centro. Você pode modificar essa posição com a propriedade perspective-origin, que é muito parecido com a propriedade transform-origin, que define onde a ação de transformação do objeto acontecerá, nesse caso quando falamos de ações 2D. A propriedade perspective-origin afeta os eixos X e Y do elemento filho.

Veja um exemplo com dois elementos: um com pouca perspectiva e outra com muita perspectiva.

CSS 3D Transforms

Se você ainda não leu sobre CSS Transforms você pode ler algo aqui e ver em ação aqui. As propriedades são praticamente iguais, mas aplicadas para os princípios de 3D e não 2D.

Você deve estar acostumado a trabalhar com os eixos X e Y no CSS padrão. No CSS 3D podemos manipular também o eixo Z, que representa a profundidade.
Veja um exemplo utilizando os valores rotateY, rotateX e translateZ. Perceba que no translateZ eu utilizei valores negativos e positivos. Quando utilizo o valor negativo, o objeto fica “mais longe”, se coloco valores positivos, o objeto fica “mais perto”.

Abaixo segue uma imagem do resultado do exemplo:

Nós podemos utilizar também alguns atalhos para estes valores onde podemos definir as três dimensões de uma vez:

  • translate3d(x,y,z)
  • scale3d(x,y,z)
  • rotate3d(x,y,z,angle)

Muito importante: ao utilizar as propriedades resumidas, os browsers ativam automaticamente a aceleração por hardware no Safari para que as animações tenham uma melhor performance.

Fazendo o efeito de Card Flip

O efeito de Card Flip é muito conhecido entre os usuários de iPhone. Para ter ideia de como é o efeito veja o exemplo final.

A estrutura HTML é esta:

[cc lang="html"]

[/cc]

O elemento .geral é onde iniciaremos o ambiente 3D. O elemento .carta age como container dos objetos 3D. Cada face da carta está separada por um elemento figure, com uma imagem.

Para começar, precisamos aplicar a perspectiva para o elemento .geral iniciar o espaço 3D.

[cc lang="css]
.geral {
width: 200px;
height: 293px;
position: relative;
margin:10% auto 0;
-webkit-perspective: 500;
}
[/cc]

Defini uma largura e altura, coloquei um position: relative; para que os elementos dentro dele sejam posicionados se referenciando por ele. Coloquei uma margem só para separá-lo do topo do body a fim de conseguirmos ver melhor os efeitos.
Por fim, coloquei a propriedade -webkit-perspective: 500; para aplicarmos o efeito 3D. O valor de 500 faz uma boa perspectiva.

Agora definiremos as dimensões da carta e suas propriedades.

[cc lang="css]
.carta {
width: 100%;
height: 100%;
position: absolute;
-webkit-transition: -webkit-transform 1s;
}
[/cc]

Largura e altura precisam ser de 100% para definir a área que o 3D irá aplicar. O position: absolute; é necessário para que as cartas fiquem relativas ao elemento .geral. A propriedade -webkit-transition: -webkit-transform 1s; define o tempo de transição do efeito, neste caso ele vai durar 1 segundo.

Formatando as cartas:
[cc lang="css"]
.carta figure {
margin:0;
display: block;
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden;
}
[/cc]

Vamos direto para a propriedade -webkit-backface-visibility: hidden; já que as outras dispensam comentários. Essa propriedade faz com que a face de trás da carta não apareça e nem se sobreponha no momento do efeito.
E finalmente, para fazer com que a parte de trás da carta apareça no verso correto, nós temos que rotacioná-la.

[cc lang="css"]
.atras{-webkit-transform: rotateY(180deg);}
[/cc]

E feito se completa com o trigger para fazer a animação acontecer. Nesse caso farei com um hover no elemento .carta, onde iremos rotacioná-lo em -180 graus.

[cc lang="css"]
.carta:hover {
-webkit-transform: rotateY(-180deg);
}
[/cc]

E Voilá! Se quiser brincar um pouco, modifique a origem da transformação com a propriedade -webkit-transform-origin. Adicionando essa linha, a transformação acontece para a direita em vez de ser pelo centro, como é o padrão:

[cc lang="css"]
.carta:hover {
-webkit-transform: rotateY(-180deg);
-webkit-transform-origin: right center;
}
[/cc]

3Drollover.css

Encontrei uma biblioteca muito interessante que nos permite fazer estes efeitos de forma fácil e de acordo com os princípios do OOCSS. É necessário apenas estruturar da forma correta e trocar as classes de acordo com o efeito que você quer fazer. Coisa muito simples.

O nome da biblioteca é 3Drollover. Clone no seu computador e divirta-se. Dá para usar em projetos facilmente. Veja abaixo um vídeo que mostra os efeitos:

Para ler mais

13

Por Diego Eis

Diego Eis criou o Tableless para disseminar os padrões web no Brasil. Como consultor já treinou equipes de empresas como Nokia, Globo.com, Yahoo! e iG. É palestrante e empreendedor.

http://about.me/diegoeis/

Mais posts do autor

  • joao henrique

    Muito legal, mas prevejo o uso massivo e desnecessário disso nos sites.

    Semelhante ao que ocorre hoje com algums sites em relação a plugins de jquery, algums “desenvolvedores” no primeiro obstáculo que encontram já correm para por um qualquer. Já esbarrei em sites de mais de 1mb só de jquery.

  • Luizz

    Muito bom

  • http://twitter.com/alexsandro_xpt Alexsandro

    Animal em…… adorei…

  • Carneiro

    Diego, você faz um trabalho danado de bom com boa vontade notável. Muito engraçada a recomendação de não enfeitar o website como penteadeira. Bom trabalho, mais uma vez. Obrigado.

  • Kevin Couto

    É com gratidão que a comunidade de desenvolvedores recebe um post com tanta qualidade.

  • Anônimo

    Para aprender fiz um exemplo no Dabblet com cartas também. É uma pena o Safari não mostrar corretamente. Mas segue o meu teste ;)
    http://dabblet.com/gist/1511371

  • http://heverex.wordpress.com Heverson Damasceno

    Fenomenal esses efeitos do CSS3

  • Lucas Taylor

    Muito irado, realmente muito irado.

  • Julio Cezar Giacobbo

    Olá, vou testar esses códigos CSS3 e ver como fica. 
    Valeu pelo post DiegoAbs,Julio Giacobbo http:\www.stocksites.com.br

  • Julio Cezar Giacobbo

    Valeu  Kevin Couto!!!
    Qualquer dúvida estou a disposição para esclarecer. 

    Um grande abraço em nome de todos os desenvolvedores!
    Fique com Deus.
    Julio

  • Arash

    Mas tem um problema no seu código, tenta tirar na parte .carta figure o -webkit-backface-visibility:hidden;
    ai funciona no safari tambem!

  • Victornpb

    funciona perfeito aki no safari 6 no Lion

  • Arthur Ferreira

    Eu preciso de ajuda. Eu gostaria de aplicar um efeito flip ou de rotação 3d em uma imagem png, mas não consigo. Não sei se devo ter duas páginas de código (html e outra css). A única coisa que consigo é puxar a imagem (através do html) de um site de hospedagem de imagens. Pode me dar uma mão?

Mais artigos