{"componentChunkName":"component---src-templates-blog-post-js","path":"/como-fazer-cartoes-giratorios-usando-somente-html-e-css/","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://guilhermeramos.dev"}},"markdownRemark":{"fields":{"slug":"/como-fazer-cartoes-giratorios-usando-somente-html-e-css/"},"frontmatter":{"category":"Front-end","date":"11 de junho, 2019","thumbnail":"assets/img/como-fazer-cartões-giratórios-usando-somente-html-e-css.jpeg","title":"Como fazer cartões giratórios usando somente HTML e CSS","description":"Aprenda a criar o efeito de cartões giratórios, usando apenas HTML e CSS."},"html":"<p>Fala galera, tudo bem?</p>\n<p>Recentemente eu fiz o site de uma clínica odontológica que pediu um recurso bem legal: um cartão giratório para cada tratamento. A face da frente (inicialmente voltada para cima) exibe o nome do tratamento e, com o mouse sobre um cartão, ele gira e exibe uma descrição daquele tratamento. <a href=\"https://doutordental.com.br/#home-areasdeatuacao\">Veja como ficou o resultado final.</a></p>\n<p>A solução foi simples e usei somente HTML e CSS. Porém, com um pouco de criatividade, dá pra fazer muita coisa legal só com isso. Bora aprender?</p>\n<h1>O HTML</h1>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>cartao<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>cartao-container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>cartao-front<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>cartao-back<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>O HTML é a parte mais simples. Como é um cartão com as faces da frente e do verso, vamos precisar de duas div’s irmãs: <strong>.cartao-front</strong> e <strong>.cartao-back</strong>, elas serão as faces da frente e de trás do cartão. Essas duas div’s estarão dentro da div agregadora <strong>.cartao-container</strong>: futuramente, é essa a div que girará. Por fim, tudo isso estará dentro da div <strong>. cartao</strong>: ela será responsável definir as configurações gerais do cartão, o tamanho, comprimento e a perspectiva das transformações 3D.</p>\n<h1>O CSS</h1>\n<p>Agora a mágica começa a acontecer.</p>\n<h2>.cartao</h2>\n<p>Primeiramente, vamos definir as configurações gerais do cartão: tamanho e perspectiva. A div responsável por isso é a <strong>.cartao</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.cartao</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 200px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 200px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">perspective</span><span class=\"token punctuation\">:</span> 1000px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Como o efeito giratório possui uma perspectiva 3D, precisamos adicionar aqui a propriedade <strong>perspective: 1000px.</strong></p>\n<h2>.cartao-container</h2>\n<p>Com o tamanho do cartão já definido, vamos para o container.</p>\n<p>A div <strong>.cartao-container</strong> é a que comportará as duas faces, mas exibirá uma por vez. Quando o mouse passar sobre o cartão, é o container que gira e mostrará a face de trás.</p>\n<p>Primeira coisa: vamos definir o <strong>position: relative</strong>, para, futuramente, posicionar as faces. Em seguida, a altura, ocupando 100% da altura do cartão.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.cartao-container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> relative<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Agora entra a parte das transformações: como é o <strong>.cartao-container</strong> quem girará, vamos definir duas coisas: o <strong>tempo de duração</strong> da transformação e o <strong>estilo</strong> da transformação.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.cartao-container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> relative<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">transition</span><span class=\"token punctuation\">:</span> transform .4s<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">transform-style</span><span class=\"token punctuation\">:</span> preserve-3d<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O <strong>transform-style: preserve-3d</strong> garante que a transformação mantenha o estilo 3D, o que é essencial para ter um efeito mais realista (e mais legal).</p>\n<p>Por fim, precisamos chamar a animação, não é mesmo? Como queremos chamá-la quando o mouse estiver sobre o cartão, fazemos o seguinte:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.cartao:hover .cartao-container</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rotateY</span><span class=\"token punctuation\">(</span>180deg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Quando o mouse passar sobre a div <strong>.cartao</strong>, o <strong>.cartao-container</strong> (filho dela) girará 180° (metade de uma volta completa) sobre o eixo Y (eixo vertical).</p>\n<p>Mas, apesar de já termos um bom código, parece que não está acontecendo nada. Isso porque ainda não configuramos as faces do nosso cartão. Vamos fazer isso agora!</p>\n<h2><strong>.cartao-front e .cartao-back</strong></h2>\n<p>Para começar, vamos fazer com que ambas as faces ocupem todo o espaço disponível para elas:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.cartao-front, .cartao-back</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> absolute<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">backface-visibility</span><span class=\"token punctuation\">:</span> hidden<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">z-index</span><span class=\"token punctuation\">:</span> 1<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A propriedade <strong>backface-visibility</strong> garante que a face de trás de cada div não apareça (já que a costa de cada face é a outra).</p>\n<p>Por fim, basta aplicar um background-color para cada face.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">.cartao-front</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> green<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.cartao-back</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">transform</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rotateY</span><span class=\"token punctuation\">(</span>180deg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> red<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Você deve estar se perguntando sobre o <strong>transform: rotateY(180deg)</strong> no <strong>.cartao-back</strong>, não é mesmo? Essa propriedade faz com que você deixe a face de trás, inicialmente, voltada para trás. Sem ela, ambas as faces estariam voltadas para frente e, quando o cartão girar, não mostraria nada.</p>\n<h2>Resultado</h2>\n<p>Por fim, com tudo isso configurado, já devemos ter nosso resultado final.</p>\n<p><a href=\"https://codepen.io/ramosht/full/agbbrN\">https://codepen.io/ramosht/full/agbbrN</a></p>\n<h1>Personalizando</h1>\n<p>Como eu disse, o legal desse elemento é que, com um pouco de criatividade, dá pra fazer muita coisa bacana. Basta adicionar o conteúdo da face da frente na div <strong>.cartao-front</strong> e o conteúdo da parte de trás na div <strong>.cartao-back</strong>. Um exemplo é o site do dentista, que eu postei acima.</p>\n<p>Outro exemplo, onde eu uso um pouco mais de código, segue abaixo:</p>\n<p><a href=\"https://codepen.io/ramosht/full/WqNJwP\">https://codepen.io/ramosht/full/WqNJwP</a></p>\n<hr>\n<p>E aí, o que acharam do texto? Esse foi o meu primeiro artigo, então espero que tenham gostado.</p>\n<p>Dúvidas, críticas, sugestões e ideias são sempre bem-vindas, então pode comentar aqui embaixo. Abraço!</p>"}},"pageContext":{"slug":"/como-fazer-cartoes-giratorios-usando-somente-html-e-css/","nextPost":null,"previousPost":{"frontmatter":{"title":"Três práticas que adotei para melhorar a UX dos meus projetos"},"fields":{"slug":"/tres-praticas-que-adotei-para-melhorar-a-ux-dos-meus-projetos/"}}}},"staticQueryHashes":["2563868181","3014040303","3054600814","764694655","96473684"]}