{"componentChunkName":"component---src-templates-blog-post-index-js","path":"/resposta-do-desafio-como-cropar-uma-foto-com-css/","result":{"data":{"markdownRemark":{"fields":{"slug":"/resposta-do-desafio-como-cropar-uma-foto-com-css/"},"frontmatter":{"category":"CSS","date":"26/06/2007","description":"","featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAQAF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABykCiP//EABgQAQEBAQEAAAAAAAAAAAAAAAEAEQIQ/9oACAEBAAEFAo52TInz/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAGBABAAMBAAAAAAAAAAAAAAAAAQAQETH/2gAIAQEAAT8hDYvCRVjTqv/aAAwDAQACAAMAAAAQ+w//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAEAAgIDAAAAAAAAAAAAAAABABEhYRBBcf/aAAgBAQABPxCgZoi6PrdSqmdNzMevGA4f/9k=","aspectRatio":1.5384615384615385,"src":"/static/fcd30c8735ee8c71261d0e79b7ee5c47/86e90/css.jpg","srcSet":"/static/fcd30c8735ee8c71261d0e79b7ee5c47/17b1e/css.jpg 240w,\n/static/fcd30c8735ee8c71261d0e79b7ee5c47/2d331/css.jpg 480w,\n/static/fcd30c8735ee8c71261d0e79b7ee5c47/86e90/css.jpg 960w","srcWebp":"/static/fcd30c8735ee8c71261d0e79b7ee5c47/c30ee/css.webp","srcSetWebp":"/static/fcd30c8735ee8c71261d0e79b7ee5c47/e8667/css.webp 240w,\n/static/fcd30c8735ee8c71261d0e79b7ee5c47/87b7f/css.webp 480w,\n/static/fcd30c8735ee8c71261d0e79b7ee5c47/c30ee/css.webp 960w","sizes":"(max-width: 960px) 100vw, 960px"}}},"photographer":"","title":"Resposta do Desafio: Como \"cropar\" uma foto com CSS"},"timeToRead":5,"html":"<p>Como prometido, estou aqui pra postar a \"resposta\" do \"desafio\" que <a href=\"/desafio-como-cropar-uma-foto-com-css\">postei ontem aqui</a> no Blog.</p>\n<p>Algumas sugestões, soluções, bem próximas da que eu arrumei e achei melhor. Vou tentar explicar detalhadamente porque não utilizei tal solução, porque fiz dessa forma, o que não rola, suporte, etc.</p>\n<h2>Sugestões</h2>\n<p>O juliano postou uma solução com background, mas como eu disse depois, não é possível, pois o conteúdo é dinâmico, portanto, não rola colocar como background.</p>\n<p>A do Michael ficou um pouco extensa, com um span como se fosse uma \"máscara\", mostrando somente a área necessária. Mas como sabemos, o IE não nos ajuda quase nunca :P e não funciona a pseudo-classe :hover, somente em link, mas somente alguns atributos são suportados.</p>\n<p>Sobral e Mico citaram o clip, mas como citei acima, o IE não suporta a pseudo-classe e somente alguns atributos são suportados, o que não é o caso do clip, infelizmente. Fora que o clip só funciona em elementos com position absolute ou fixed.</p>\n<p>A do Alisson ficou +ou- parecido com a que eu implementei, mas faltaram alguns detalhes, algumas mudanças, para que funcionasse perfeitamente.</p>\n<h2>Primeira Solução</h2>\n<p>Chega de conversa e vamos para a primeira solução. Nessa eu utilizei o clip, como o mico e o sobral citaram, mas como falei, preciso da pseudo-classe :hover funcionando perfeitamente no IE, com isso, tive que utilizar <a href=\"http://www.xs4all.nl/~peterned/csshover.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">um arquivo .htc</a>, que faz com que o IE aceite o hover em qualquer tag.</p>\n<h3>Código HTML</h3>\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\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>fotos<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>a</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>#<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">title</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span><span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>cropFoto<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>img</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>thumb.jpg<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">alt</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Foto<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>a</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<h3>Código CSS</h3>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">*</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 20px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">ul</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">list-style</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">img</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">#fotos</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 186px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">#fotos *</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">#fotos .cropFoto</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> #e70202<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 116px<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 punctuation\">}</span>\n<span class=\"token selector\">#fotos .cropFoto img</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 punctuation\">}</span>\n<span class=\"token selector\">#fotos .cropFoto:hover img</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">clip</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rect</span><span class=\"token punctuation\">(</span>3px 183px 113px 3px<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Um código simples e curto. Não vou ficar detalhando coisas desnecessárias, somente o que eu acho relevante para o entendimento para um desenvolvedor intermediário, etc.</p>\n<p>O link recebe a classe cropFoto, com a cor de background que eu quero que fique a \"borda\" em volta da imagem. Recebe o valor de altura igual a altura da imagem e recebe um position relative.</p>\n<p>A imagem dentro do link recebe um position absolute, lembram que o clip só funciona em elementos com position absolute e fixed? Por isso que também tive que colocar o position relative dentro do link, para a imagem não se basear de acordo com o body, etc.</p>\n<p>Veja o exemplo funcionando.</p>\n<p>Para mais infos sobre position, <a href=\"http://www.imasters.com.br/artigo/3606/webstandards/posicionamento_e_layouts/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">visite o artigo que escrevi no imasters</a> sobre o assunto.</p>\n<h3>Tá Bruno, mas não funcionou no IE</h3>\n<p>Exatamente. Graças a ele, precisamos utilizar a gambiarra que falei anteriormente, pra funcionar a pseudo-classe :hover. Percebam que só funciona em link, e estou utilizando em um link, mas mesmo assim não funcionou o clip. Ele só aceita alguns atributos no :hover</p>\n<p>É só anexarmos o csshover.htc no html, que funciona no IE. <a href=\"http://www.xs4all.nl/~peterned/htc/csshover.htc\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Baixe o arquivo .htc aqui</a> e cole o código abaixo entre as tags <code class=\"language-text\">&lt;head&gt;</code> e <code class=\"language-text\">&lt;/head&gt;</code>:</p>\n<h3>Código HTML</h3>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!--[if IE]>\n  &lt;style type=\"text/css\">\n    body {\n      behavior: url(csshover.htc);\n    }\n  &lt;/style>\n&lt;![endif]--></span></code></pre></div>\n<p>Veja o exemplo correto funcionando</p>\n<h2>Legal, Bruno, funcionou direitinho...</h2>\n<p>Exatamente, mas sempre existe um porém. Temos vantagens em utilizar esse htc, pois teremos hover em todas as tags, mas, como nem tudo é perfeito, temos alguns problemas:</p>\n<ul>\n<li>Esse é um projeto grande, com muito volume de informação, conteúdo, etc. Teremos uma quantidade considerável de imagens com esse efeito no hover;</li>\n<li>Necessita que o servidor tenha o mime type configurado para ele: text/x-component</li>\n<li>Ele faz uma busca por :hover em TODO o stylesheet da página. Onde ele achar o :hover, vai adicionar um evento javascript onmouseover para que o elemento se comporte da forma correta.</li>\n<li>O problema é que esse processamento é no cliente e o tempo que ele leva para fazer isso vai depender do tamanho do CSS, do HTML, além do poder do computador do cara, ou seja, quanto maior o CSS e HTML, mais tempo para execução o efeito vai levar, e como o projeto é grande, queremos sempre a melhor forma, otimizar, etc.</li>\n</ul>\n<p>Por essas e outras, tive que buscar uma outra opção, modo, de implementar esse efeito, somente por CSS, sem colocar htc, js, nem nada.</p>\n<h2>Segunda Solução</h2>\n<p>Eis que surge uma idéia no início, meio bizarra pra utilizar como solução. E não é que deu certo? :D O código HTML utilizado foi o mesmo do exemplo anterior. Abaixo segue o CSS:</p>\n<h3>Código CSS</h3>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">*</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 20px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">ul</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">list-style</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">img</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">#fotos</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 186px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">#fotos \\*</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">#fotos .cropFoto</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">overflow</span><span class=\"token punctuation\">:</span> hidden<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 116px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 186px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token selector\">#fotos .cropFoto:hover</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 3px solid #e70202<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 110px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 180px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Veja este exemplo funcionando.</p>\n<h3>Legal, Bruno... Funcionou só com CSS né?</h3>\n<p>Então, +ou-. Ainda não está 100%, porque dá um efeito que a imagem se move por causa da borda colocada no link.</p>\n<p>É um código bem simples, de fácil entendimento. A imagem o link estão como block, o link está com a largura e altura setada de acordo com o tamanho da imagem. Esse tamanho pode variar, dependendo da imagem, é só modificar no CSS pro tamanho da imagem.</p>\n<p>No hover do link, ele diminui 6px de altura e largura e ganha 3px de borda em volta dele, totalizando a mesma largura e altura.</p>\n<p>O overflow hidden do link serve pra que mesmo que a imagem seja maior que o link, o que é o caso no estado :hover, ela fique oculta, não quebrando o layout, etc.</p>\n<h3>Entendi Bruno. E como resolvo pra ficar 100%, sem parecer que a imagem se move?</h3>\n<p>Simples, apenas uma linha de CSS, colocando uma margem pra imagem, no hover do link:</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">#fotos .cropFoto:hover img</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> -3px 0 0 -3px<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Veja o exemplo final funcionando.</p>\n<p>Agora sim hein :D Graças a Deus, o IE aceita o atributo margin na pseudo-classe hover do link no CSS. ;)</p>\n<h2>Conclusões</h2>\n<p>Bom, é uma solução simples, tranquila, mas que nem sempre vem a cabeça facilmente, rápido. Testei no IE 6, IE 7, Firefox, Opera, Firefox Mac, Safari e todos funcionaram perfeitamente, sem nenhuma diferença.</p>\n<p>Algumas coisas precisam de alguns detalhes pra funcionar, por exemplo, o display: block no link, na imagem também pra ficar correto, se fosse usar o clip, lembrar do position: absolute, lembrar do overflow: hidden, etc, etc, etc.</p>\n<p>Sempre tem essas pequenas coisas que são essenciais saber no CSS, que você pega com a prática.</p>\n<h2>Finalizando</h2>\n<p>Bom, é isso. Qualquer dúvida, correção ou solução melhor, é só comentar que eu posto aqui ;)</p>\n<p>Aquele abraço.</p>"}},"pageContext":{"nextPost":{"fields":{"slug":"/quando-foi-a-primeira-vez-que-ouviu-falar-de-web-standards/"},"frontmatter":{"title":"Quando foi a primeira vez que ouviu falar de web standards?"}},"previousPost":{"fields":{"slug":"/desafio-como-cropar-uma-foto-com-css/"},"frontmatter":{"title":"Desafio: Como \"cropar\" uma foto com CSS"}},"slug":"/resposta-do-desafio-como-cropar-uma-foto-com-css/"}},"staticQueryHashes":["1271460761","2963127411","3623170217","764694655"]}