<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anilson Lopes</title>
    <description>The latest articles on DEV Community by Anilson Lopes (@quila).</description>
    <link>https://dev.to/quila</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F172424%2F7edf83fc-9058-4eeb-a38c-27801e5ed984.jpeg</url>
      <title>DEV Community: Anilson Lopes</title>
      <link>https://dev.to/quila</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quila"/>
    <language>en</language>
    <item>
      <title>Overlay com cor sobre imagem no CSS: pseudo-element ou element? Analisando os métodos</title>
      <dc:creator>Anilson Lopes</dc:creator>
      <pubDate>Sun, 27 Oct 2019 21:07:56 +0000</pubDate>
      <link>https://dev.to/quila/overlay-com-cor-sobre-imagem-no-css-pseudo-element-ou-element-analisando-os-metodos-41o3</link>
      <guid>https://dev.to/quila/overlay-com-cor-sobre-imagem-no-css-pseudo-element-ou-element-analisando-os-metodos-41o3</guid>
      <description>&lt;p&gt;Como fazer um &lt;strong&gt;&lt;em&gt;overlay sobre uma imagem, mas por baixo de um texto, e que altere a opacidade no hover&lt;/em&gt;&lt;/strong&gt;? Talvez com &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/Pseudo-elementos"&gt;pseudo-elements&lt;/a&gt;, se o HTML já estiver montado, sendo necessário apenas alterar o CSS ou usando elementos básicos.&lt;/p&gt;

&lt;p&gt;A primeira vista, usar :pseudo-elements me parece mais prático, já que preciso mexer apenas no CSS do projeto, evitando qualquer modificação no HTML. Mas sabemos que é possível obter o mesmo resultado usando &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element"&gt;elementos básicos&lt;/a&gt;, e com o mesmo (quase o mesmo) CSS obter visualmente o mesmo resultado.&lt;/p&gt;

&lt;p&gt;Mira:&lt;br&gt;
&lt;a href="https://i.giphy.com/media/dCRfG9DMrN8O4JcnIU/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/dCRfG9DMrN8O4JcnIU/giphy.gif" alt="resultado final" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vale ressaltar que esse post não faz um comparativo de performance &lt;em&gt;(mas poderia)&lt;/em&gt;, tão pouco irá apontar a melhor maneira ou a correta de resolver esse problema. Esse comparativo é apenas para fins didáticos.&lt;/p&gt;


&lt;h2&gt;
  
  
  Ponto de partida
&lt;/h2&gt;

&lt;p&gt;A partir de dois &lt;em&gt;cards&lt;/em&gt; idênticos, onde o &lt;em&gt;card&lt;/em&gt; recebe uma imagem de fundo e comporta apenas duas &lt;em&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/div"&gt;div&lt;/a&gt;&lt;/em&gt;, sendo respectivamente título e subtitulo.&lt;br&gt;
&lt;em&gt;O texto no rodapé do card com a cor branca é apenas para ficar elegante&lt;/em&gt; :)&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/quilamcz/embed/ExxXGXx?height=600&amp;amp;default-tab=html,result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Veremos então como fazer um &lt;strong&gt;&lt;em&gt;overlay sobre uma imagem, mas por baixo de um texto, e que altere a opacidade no hover...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Pseudo-element
&lt;/h2&gt;

&lt;p&gt;O pseudo-element &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/::before"&gt;:before&lt;/a&gt; e &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/::after"&gt;:after&lt;/a&gt; para ser visível é necessário especificar um conteúdo, sendo essa a dificuldade mais corriqueira, já que é bem fácil esquece-lo.&lt;/p&gt;

&lt;p&gt;Nesse caso, como não precisamos de conteúdo, adicionamos uma &lt;em&gt;string&lt;/em&gt; vazia apenas para o mesmo ser inserido no DOM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;''&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para estilizar e posicionar afim de obter o overlay, é necessário aplicar o pseudo-element no próprio card, além de alterar a posição do mesmo para &lt;em&gt;relative&lt;/em&gt;, dessa maneira:&lt;/p&gt;

&lt;p&gt;Acrescentei uma classe modificadora no primeiro card chamada &lt;strong&gt;card--pseudo-elements&lt;/strong&gt;, para diferencia-lo do padrão.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card--pseudo-elements&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card--pseudo-elements&lt;/span&gt;&lt;span class="nd"&gt;:before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* requerido */&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* estilo de preto quase transparente */&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* posiciona nos limites do elemento pai */&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* suavização básica */&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, para fazer o efeito de escurecer o overlay, é necessário apenas aplicar o hover no card, e manipular o pseudo-element, assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card--pseudo-elements&lt;/span&gt;&lt;span class="nd"&gt;:hover:before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estaria pronto se não fosse por um problema: o overlay cobre todo o conteúdo do card. Isso ocorre por quê &lt;em&gt;(de modo resumido)&lt;/em&gt; o elemento com posição absoluta fica numa camada superior &lt;a href="https://www.devmedia.com.br/css-z-index-entendendo-sobre-o-eixo-z-na-web/28698"&gt;(z-index)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Z9u4gq0eVwBQ9x9fhz/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Z9u4gq0eVwBQ9x9fhz/giphy.gif" alt="aplicando :pseudo-element" width="480" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contornamos isso apenas definindo o z-index dos elementos, dentro do card:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card--pseudo-elements&lt;/span&gt; &lt;span class="nc"&gt;.card__title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.card--pseudo-elements&lt;/span&gt; &lt;span class="nc"&gt;.card__subtitle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Nesse estágio você pode ter se questionado ou tentado aplicar um z-index negativo para o seu :pseudo-element, afim de empurra-lo para trás do texto, mas isso não funciona. Veja mais sobre &lt;a href="https://www.google.com/search?q=z-index"&gt;z-index&lt;/a&gt; para entender melhor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O resultado final com :pseudo-elements você confere abaixo:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/quilamcz/embed/MWWoxeE?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Elemento
&lt;/h2&gt;

&lt;p&gt;Neste método, precisamos acrescentar um &lt;strong&gt;elemento&lt;/strong&gt; no HTML. Além da classe módificadora &lt;em&gt;card--element&lt;/em&gt; para diferenciar do outro método. O código fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card__title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Maceió
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card__subtitle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Alagoas
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card__overlay"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- div overlay vazia --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Você pode inserir no início ou no final do card, &lt;strong&gt;pessoalmente&lt;/strong&gt; prefiro inserir no final e como span visando reduzir o risco de interferência no layout atual.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No CSS o código é quase idêntico, mudando apenas os seletores, e a não obrigatoriedade do content. Veja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card--element&lt;/span&gt; &lt;span class="nc"&gt;.card__overlay&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200ms&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* aplicando o hover */&lt;/span&gt;
&lt;span class="nc"&gt;.card--element&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="nc"&gt;.card__overlay&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui encontramos o mesmo problema do :pseudo-element, o overlay sobrepõe todo o conteúdo do card, sendo assim a solução é a mesma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card--element&lt;/span&gt; &lt;span class="nc"&gt;.card__title&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.card--element&lt;/span&gt; &lt;span class="nc"&gt;.card__subtitle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abaixo você confere o resultado final com elemento básico:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/quilamcz/embed/YzzQgOP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Nota-se que a diferença entre os métodos é mínima, como o seletor diferente para o CSS e, de modo geral, uma linha a mais de código para ambos.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Se com o :pseudo-element é necessário adicionar o content à sua regra de estilo e dispensa a marcação HTML, com elemento básico não precisamos do content, mas é necessário adicionar o elemento ao HTML. &lt;strong&gt;O estilo e posicionamento do overlay é feito exatamente da mesma maneira.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Abaixo deixo o resultado final com os dois métodos:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/quilamcz/embed/ExxXOme?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Não esqueça de comentar com suas dúvidas e/ou sugestões. Obrigado.&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Talvez continue com a parte 2, abordando acessibilidade e performance.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
    </item>
  </channel>
</rss>
