<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos before css - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/before-css/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/before-css/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Thu, 22 Oct 2026 03:30:34 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://webzoneware.com/wp-content/uploads/icon-webzoneware-150x150.png</url>
	<title>Arquivos before css - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/before-css/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pseudo-elementos no CSS: ::before e ::after &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:30:34 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[after css]]></category>
		<category><![CDATA[before css]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[marker css]]></category>
		<category><![CDATA[propriedade content]]></category>
		<category><![CDATA[pseudo-elementos]]></category>
		<category><![CDATA[selection css]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29461</guid>

					<description><![CDATA[<p>Uma das marcas distintivas de um desenvolvedor front-end de alto nível é a capacidade de manter o código HTML 100% semântico e enxuto. No passado, para criar uma fita de destaque em um cartão, um sublinhado elegante que se expande ao passar o mouse ou uma bolinha verde pulsante de status, desenvolvedores enchiam o documento [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/">Pseudo-elementos no CSS: ::before e ::after | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  Uma das marcas distintivas de um desenvolvedor front-end de alto nível é a capacidade de manter o código HTML 100% semântico e enxuto. No passado, para criar uma fita de destaque em um cartão, um sublinhado elegante que se expande ao passar o mouse ou uma bolinha verde pulsante de status, desenvolvedores enchiam o documento de tags vazias como <code>&lt;span class="circulo"&gt;&lt;/span&gt;</code>. Os <strong>Pseudo-elementos</strong> (identificados pelo duplo dois-pontos <code>::</code>) revolucionaram esse cenário: eles criam elementos visuais virtuais diretamente na árvore de renderização do CSS, sem poluir uma única linha do seu HTML!
</p>
<h2>1. A Sintaxe Padronizada: Por que Dois Dois-Pontos (<code>::</code>)?</h2>
<p>
  Nas especificações antigas de CSS1 e CSS2, tanto pseudo-classes quanto pseudo-elementos usavam um único caractere <code>:</code>.
</p>
<p>
  A partir do CSS3, a W3C estabeleceu uma fronteira conceitual definitiva:
</p>
<ul>
<li><strong>Pseudo-classe (<code>:</code> com um dois-pontos):</strong> Mira um <em>estado dinâmico</em> do elemento real (ex.: <code>:hover</code>, <code>:focus</code>, <code>:checked</code>).</li>
<li><strong>Pseudo-elemento (<code>::</code> com dois dois-pontos):</strong> Cria um <em>elemento visual virtual</em> ou estiliza uma subparte interna (ex.: <code>::before</code>, <code>::after</code>, <code>::marker</code>, <code>::selection</code>).</li>
</ul>
<div class="wzw-callout wzw-callout-info">
<p><strong>Dica de Boas Práticas:</strong> Os navegadores modernos ainda aceitam a sintaxe antiga de um ponto (<code>:before</code>) por razões de retrocompatibilidade com a década de 1990. No entanto, em código moderno profissional e acessível, use SEMPRE o padrão moderno de dois dois-pontos (<strong><code>::before</code></strong> e <strong><code>::after</code></strong>).</p>
</div>
<h2>2. Onde Nascem <code>::before</code> e <code>::after</code>?</h2>
<p>
  Um dos equívocos mais comuns entre iniciantes é acreditar que <code>::before</code> fica localizado <em>do lado de fora, antes da tag</em>, e que <code>::after</code> fica <em>do lado de fora, depois da tag</em>. Isso é falso!
</p>
<p>
  No modelo de renderização do navegador, os pseudo-elementos são inseridos <strong>INTERNAMENTE</strong> dentro do elemento selecionado:
</p>
<ul>
<li><strong><code>::before</code>:</strong> É renderizado como o <strong>primeiríssimo filho interno</strong> da caixa, logo antes do texto ou de qualquer outro elemento filho.</li>
<li><strong><code>::after</code>:</strong> É renderizado como o <strong>último filho interno</strong> da caixa, logo após todo o conteúdo do elemento.</li>
</ul>
<div class="wzw-callout wzw-callout-warning">
<p><strong>Atenção aos Elementos Vazios (Void Elements):</strong> Como <code>::before</code> e <code>::after</code> são filhos internos, eles <strong>NÃO FUNCIONAM</strong> em tags HTML auto-fechadas que não aceitam conteúdo filho no DOM, como <code>&lt;img&gt;</code>, <code>&lt;input&gt;</code>, <code>&lt;br&gt;</code> e <code>&lt;hr&gt;</code>!</p>
</div>
<h2>3. A Regra de Ouro: A Propriedade <code>content</code></h2>
<p>
  Existe uma lei inegociável para <code>::before</code> e <code>::after</code>: <strong>sem a propriedade <code>content</code>, o pseudo-elemento simplesmente NÃO EXISTE</strong> e o navegador não desenha absolutamente nada na tela!
</p>
<p>
  Mesmo que você queira criar um quadrado geométrico ou uma linha colorida sem nenhum texto dentro, você <strong>deve</strong> declarar <code>content: "";</code> (aspas vazias):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-17488" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">10 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-17488', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-17488', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Cria um indicador visual de status verde antes do texto */</span></span>
<span class="wzw-code-line">.status-online::before {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">content</span>: <span class="wzw-tk-str">&quot;&quot;</span>;            /* OBRIGATÓRIO: Sem isso, o elemento não nasce! */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: inline-block;  /* Por padrão, pseudo-elementos são inline */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#10b981</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: 50%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">margin-right</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Cria um indicador visual de status verde antes do texto */
.status-online::before {
  content: &quot;&quot;;            /* OBRIGATÓRIO: Sem isso, o elemento não nasce! */
  display: inline-block;  /* Por padrão, pseudo-elementos são inline */
  width: 10px;
  height: 10px;
  background-color: #10b981;
  border-radius: 50%;
  margin-right: 8px;
}</textarea>
        </div>
    </div>
    
</div>
<h3>O que a Propriedade <code>content</code> Pode Conter?</h3>
<ul>
<li><strong>Aspas Vazias (<code>content: "";</code>):</strong> O padrão para formas geométricas decorativas, máscaras e overlays.</li>
<li><strong>Texto Fixo ou Emojis:</strong> <code>content: "★ ";</code> ou <code>content: " • ";</code>.</li>
<li><strong>Leitura Dinâmica de Atributos:</strong> <code>content: attr(data-tooltip);</code> permite ler valores de atributos HTML para criar tooltips 100% nativos sem JavaScript!</li>
</ul>
<h2>4. Casos de Uso Clássicos na Indústria</h2>
<h3>1. Sublinhado Animado no Hover (Underline Expandível)</h3>
<p>
  Em vez de usar o velho e rígido <code>text-decoration: underline</code>, criamos uma linha fina com <code>::after</code> que se expande do centro para as pontas suavemente:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-55163" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">23 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-55163', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-55163', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.link-magico {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: relative;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: none;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.link-magico::after {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">content</span>: <span class="wzw-tk-str">&quot;&quot;</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: absolute;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">left</span>: 0;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">bottom</span>: -<span class="wzw-tk-num">4px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: 100%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">2px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: scaleX(0); /* Inicialmente invisível (comprimido a zero) */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: transform <span class="wzw-tk-num">0.3s</span> ease;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform-origin</span>: right;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.link-magico<span class="wzw-tk-kw">:hover</span>::after {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: scaleX(1); /* Expande para 100% da largura no hover */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform-origin</span>: left;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.link-magico {
  position: relative;
  text-decoration: none;
  color: #38bdf8;
}

.link-magico::after {
  content: &quot;&quot;;
  position: absolute;
  left: 0;
  bottom: -4px;
  width: 100%;
  height: 2px;
  background: #38bdf8;
  transform: scaleX(0); /* Inicialmente invisível (comprimido a zero) */
  transition: transform 0.3s ease;
  transform-origin: right;
}

.link-magico:hover::after {
  transform: scaleX(1); /* Expande para 100% da largura no hover */
  transform-origin: left;
}</textarea>
        </div>
    </div>
    
</div>
<h3>2. Máscara Escura sobre Imagens (Overlay)</h3>
<p>
  Para escurecer um cartão com imagem de fundo e garantir que o texto branco seja sempre legível (contraste WCAG):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-16205" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">17 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-16205', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-16205', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.card-com-overlay {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: relative;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">overflow</span>: hidden;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.card-com-overlay::before {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">content</span>: <span class="wzw-tk-str">&quot;&quot;</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: absolute;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">inset</span>: 0; /* Preenche 100% da área do card */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(0, 0, 0, 0.55); /* Máscara semitransparente */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">z-index</span>: 1;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.card-conteudo {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: relative;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">z-index</span>: 2; /* Fica acima da máscara */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.card-com-overlay {
  position: relative;
  overflow: hidden;
}

.card-com-overlay::before {
  content: &quot;&quot;;
  position: absolute;
  inset: 0; /* Preenche 100% da área do card */
  background: rgba(0, 0, 0, 0.55); /* Máscara semitransparente */
  z-index: 1;
}

.card-conteudo {
  position: relative;
  z-index: 2; /* Fica acima da máscara */
}</textarea>
        </div>
    </div>
    
</div>
<h2>5. Outros Pseudo-elementos Modernos Essenciais</h2>
<h3><code>::selection</code> — A Identidade Visual do Texto Selecionado</h3>
<p>
  Quando o usuário arrasta o mouse para copiar um trecho do seu site, você pode trocar o azul genérico do sistema pela cor da marca da sua empresa:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-28225" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-28225', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-28225', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Personaliza o grifo de texto do site inteiro */</span></span>
<span class="wzw-code-line">::selection {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#0b0f19</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Personaliza o grifo de texto do site inteiro */
::selection {
  background-color: #38bdf8;
  color: #0b0f19;
}</textarea>
        </div>
    </div>
    
</div>
<h3><code>::marker</code> — Marcadores de Lista sem Gambiarras</h3>
<p>
  No passado, mudar a cor da bolinha de uma lista <code>&lt;li&gt;</code> exigia remover o estilo nativo e reconstruí-lo do zero. Hoje usamos <strong><code>::marker</code></strong>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-98493" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">4 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-98493', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-98493', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-attr">li</span>::marker {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#10b981</span>; /* A bolinha ou número fica verde sem afetar o texto! */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.1rem</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>li::marker {
  color: #10b981; /* A bolinha ou número fica verde sem afetar o texto! */
  font-size: 1.1rem;
}</textarea>
        </div>
    </div>
    
</div>
<h2>6. Acessibilidade e Leitores de Tela (WCAG 2.2)</h2>
<div class="wzw-callout wzw-callout-warning">
<p><strong>Atenção com Textos em Pseudo-elementos:</strong> Leitores de tela modernos (como VoiceOver e NVDA) <strong>leem em voz alta</strong> o texto colocado dentro de <code>content: "..."</code>! Portanto, nunca insira textos críticos apenas no CSS. Se o pseudo-elemento for puramente decorativo, use <code>content: ""</code> para evitar poluir a leitura de usuários cegos.</p>
</div>
<h2>7. Laboratório Prático: Tooltip Nativo e Efeitos de Pseudo-elementos</h2>
<p>
  No código interativo abaixo, construímos um componente que combina <strong>tooltip nativo via <code>attr()</code></strong>, bolinha de status pulsante, marcador de lista customizado e grifo de texto personalizado:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-50664" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">111 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-50664', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-50664', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;!DOCTYPE</span><span class="wzw-tk-kw"> html</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;html</span> <span class="wzw-tk-attr">lang</span>=<span class="wzw-tk-str">&quot;pt-BR&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;head&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;meta</span> <span class="wzw-tk-attr">charset</span>=<span class="wzw-tk-str">&quot;UTF-8&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;title&gt;</span>Laboratório de Pseudo-elementos CSS<span class="wzw-tk-tag">&lt;/title&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;style&gt;</span></span>
<span class="wzw-code-line">    body {</span>
<span class="wzw-code-line">      font-family: &#039;Inter&#039;, system-ui, sans-serif;</span>
<span class="wzw-code-line">      background: #0b0f19;</span>
<span class="wzw-code-line">      color: #f8fafc;</span>
<span class="wzw-code-line">      padding: 40px;</span>
<span class="wzw-code-line">      margin: 0;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 1. SELEÇÃO DE TEXTO PERSONALIZADA (::selection) */</span></span>
<span class="wzw-code-line">    ::selection {</span>
<span class="wzw-code-line">      background: #f59e0b;</span>
<span class="wzw-code-line">      color: #000;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 2. CARD COM STATUS ONLINE (::before) */</span></span>
<span class="wzw-code-line">    .card-usuario {</span>
<span class="wzw-code-line">      max-width: 440px;</span>
<span class="wzw-code-line">      background: #1e293b;</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">      border-radius: 14px;</span>
<span class="wzw-code-line">      padding: 24px;</span>
<span class="wzw-code-line">      margin-bottom: 30px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .status-badge {</span>
<span class="wzw-code-line">      display: inline-flex;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      font-size: 0.85rem;</span>
<span class="wzw-code-line">      font-weight: 600;</span>
<span class="wzw-code-line">      color: #10b981;</span>
<span class="wzw-code-line">      margin-bottom: 12px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* Bolinha verde desenhada puramente no CSS */</span></span>
<span class="wzw-code-line">    .status-badge::before {</span>
<span class="wzw-code-line">      content: &quot;&quot;;</span>
<span class="wzw-code-line">      width: 8px;</span>
<span class="wzw-code-line">      height: 8px;</span>
<span class="wzw-code-line">      background: #10b981;</span>
<span class="wzw-code-line">      border-radius: 50%;</span>
<span class="wzw-code-line">      margin-right: 8px;</span>
<span class="wzw-code-line">      box-shadow: 0 0 8px #10b981;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 3. TOOLTIP NATIVO SEM JS (::after com attr) */</span></span>
<span class="wzw-code-line">    .tooltip-link {</span>
<span class="wzw-code-line">      position: relative;</span>
<span class="wzw-code-line">      color: #38bdf8;</span>
<span class="wzw-code-line">      text-decoration: underline;</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">      display: inline-block;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .tooltip-link::after {</span>
<span class="wzw-code-line">      content: attr(data-tooltip); /* Lê o texto do atributo HTML! */</span>
<span class="wzw-code-line">      position: absolute;</span>
<span class="wzw-code-line">      bottom: 125%;</span>
<span class="wzw-code-line">      left: 50%;</span>
<span class="wzw-code-line">      transform: translateX(-50%) scale(0.9);</span>
<span class="wzw-code-line">      background: #020617;</span>
<span class="wzw-code-line">      color: #fff;</span>
<span class="wzw-code-line">      font-size: 0.75rem;</span>
<span class="wzw-code-line">      padding: 6px 12px;</span>
<span class="wzw-code-line">      border-radius: 6px;</span>
<span class="wzw-code-line">      white-space: nowrap;</span>
<span class="wzw-code-line">      pointer-events: none;</span>
<span class="wzw-code-line">      opacity: 0;</span>
<span class="wzw-code-line">      transition: opacity 0.2s ease, transform 0.2s ease;</span>
<span class="wzw-code-line">      box-shadow: 0 4px 12px rgba(0,0,0,0.5);</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .tooltip-link:hover::after {</span>
<span class="wzw-code-line">      opacity: 1;</span>
<span class="wzw-code-line">      transform: translateX(-50%) scale(1);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 4. MARCADOR DE LISTA CUSTOMIZADO (::marker) */</span></span>
<span class="wzw-code-line">    ul.lista-recursos li::marker {</span>
<span class="wzw-code-line">      color: #38bdf8;</span>
<span class="wzw-code-line">      font-size: 1.2rem;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/style&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/head&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;body&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;h2</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#f1f5f9; margin-top:0;&quot;</span><span class="wzw-tk-tag">&gt;</span>Demonstração de Pseudo-elementos<span class="wzw-tk-tag">&lt;/h2&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#94a3b8; font-size:0.9rem;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    Selecione qualquer trecho deste texto com o mouse para ver o <span class="wzw-tk-tag">&lt;code&gt;</span>::selection<span class="wzw-tk-tag">&lt;/code&gt;</span> amarelo em ação!</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-usuario&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;status-badge&quot;</span><span class="wzw-tk-tag">&gt;</span>Servidor Ativo<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin:0 0 10px 0;&quot;</span><span class="wzw-tk-tag">&gt;</span>Plataforma WebZoneWare<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#94a3b8; font-size:0.9rem; line-height:1.6;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      Passe o mouse sobre esta <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;tooltip-link&quot;</span> <span class="wzw-tk-attr">data-tooltip</span>=<span class="wzw-tk-str">&quot;⚡ Dica de Engenharia: 100% puro CSS!&quot;</span><span class="wzw-tk-tag">&gt;</span>palavra com tooltip<span class="wzw-tk-tag">&lt;/span&gt;</span> para ver o texto flutuante gerado via <span class="wzw-tk-tag">&lt;code&gt;</span>content: attr()<span class="wzw-tk-tag">&lt;/code&gt;</span>.</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;ul</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;lista-recursos&quot;</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#cbd5e1; font-size:0.9rem;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;li&gt;</span>CSS Grid 2D Completo<span class="wzw-tk-tag">&lt;/li&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;li&gt;</span>Flexbox Unidimensional<span class="wzw-tk-tag">&lt;/li&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;li&gt;</span>Acessibilidade WCAG 2.2<span class="wzw-tk-tag">&lt;/li&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/ul&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/body&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/html&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-BR&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Laboratório de Pseudo-elementos CSS&lt;/title&gt;
  &lt;style&gt;
    body {
      font-family: &#039;Inter&#039;, system-ui, sans-serif;
      background: #0b0f19;
      color: #f8fafc;
      padding: 40px;
      margin: 0;
    }

    /* 1. SELEÇÃO DE TEXTO PERSONALIZADA (::selection) */
    ::selection {
      background: #f59e0b;
      color: #000;
    }

    /* 2. CARD COM STATUS ONLINE (::before) */
    .card-usuario {
      max-width: 440px;
      background: #1e293b;
      border: 1px solid #334155;
      border-radius: 14px;
      padding: 24px;
      margin-bottom: 30px;
    }

    .status-badge {
      display: inline-flex;
      align-items: center;
      font-size: 0.85rem;
      font-weight: 600;
      color: #10b981;
      margin-bottom: 12px;
    }

    /* Bolinha verde desenhada puramente no CSS */
    .status-badge::before {
      content: &quot;&quot;;
      width: 8px;
      height: 8px;
      background: #10b981;
      border-radius: 50%;
      margin-right: 8px;
      box-shadow: 0 0 8px #10b981;
    }

    /* 3. TOOLTIP NATIVO SEM JS (::after com attr) */
    .tooltip-link {
      position: relative;
      color: #38bdf8;
      text-decoration: underline;
      cursor: pointer;
      display: inline-block;
    }

    .tooltip-link::after {
      content: attr(data-tooltip); /* Lê o texto do atributo HTML! */
      position: absolute;
      bottom: 125%;
      left: 50%;
      transform: translateX(-50%) scale(0.9);
      background: #020617;
      color: #fff;
      font-size: 0.75rem;
      padding: 6px 12px;
      border-radius: 6px;
      white-space: nowrap;
      pointer-events: none;
      opacity: 0;
      transition: opacity 0.2s ease, transform 0.2s ease;
      box-shadow: 0 4px 12px rgba(0,0,0,0.5);
      border: 1px solid #334155;
    }

    .tooltip-link:hover::after {
      opacity: 1;
      transform: translateX(-50%) scale(1);
    }

    /* 4. MARCADOR DE LISTA CUSTOMIZADO (::marker) */
    ul.lista-recursos li::marker {
      color: #38bdf8;
      font-size: 1.2rem;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h2 style=&quot;color:#f1f5f9; margin-top:0;&quot;&gt;Demonstração de Pseudo-elementos&lt;/h2&gt;
  &lt;p style=&quot;color:#94a3b8; font-size:0.9rem;&quot;&gt;
    Selecione qualquer trecho deste texto com o mouse para ver o &lt;code&gt;::selection&lt;/code&gt; amarelo em ação!
  &lt;/p&gt;

  &lt;div class=&quot;card-usuario&quot;&gt;
    &lt;div class=&quot;status-badge&quot;&gt;Servidor Ativo&lt;/div&gt;
    &lt;h3 style=&quot;margin:0 0 10px 0;&quot;&gt;Plataforma WebZoneWare&lt;/h3&gt;
    &lt;p style=&quot;color:#94a3b8; font-size:0.9rem; line-height:1.6;&quot;&gt;
      Passe o mouse sobre esta &lt;span class=&quot;tooltip-link&quot; data-tooltip=&quot;⚡ Dica de Engenharia: 100% puro CSS!&quot;&gt;palavra com tooltip&lt;/span&gt; para ver o texto flutuante gerado via &lt;code&gt;content: attr()&lt;/code&gt;.
    &lt;/p&gt;

    &lt;ul class=&quot;lista-recursos&quot; style=&quot;color:#cbd5e1; font-size:0.9rem;&quot;&gt;
      &lt;li&gt;CSS Grid 2D Completo&lt;/li&gt;
      &lt;li&gt;Flexbox Unidimensional&lt;/li&gt;
      &lt;li&gt;Acessibilidade WCAG 2.2&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste passar o cursor sobre a palavra com tooltip e selecionar o texto para comprovar a elegância dos pseudo-elementos:
</p>
<p style="text-align: center; margin: 35px 0;">
  <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;</a>
</p>
<h2>8. Resumo e Próximos Passos</h2>
<ul>
<li>Pseudo-elementos (usando <code>::</code>) criam nós virtuais ou estilizam subpartes sem alterar o código HTML.</li>
<li><code>::before</code> e <code>::after</code> são inseridos como o primeiro e o último filho <strong>interno</strong> da caixa selecionada.</li>
<li>A propriedade <code>content: ""</code> é estritamente obrigatória; sem ela, o pseudo-elemento não é renderizado.</li>
<li><code>content: attr(nome)</code> permite ler dados de atributos HTML dinamicamente (como data-tooltips).</li>
<li><code>::marker</code> estiliza as bolinhas e numerações de listas de forma nativa e limpa.</li>
<li><code>::selection</code> customiza as cores do texto grifado pelo cursor do usuário.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> Agora que você pode criar elementos visuais no CSS, como movê-los, girá-los, esticá-los e criar sensações de profundidade em 3D? Na <strong>Lição 42</strong>, desvendaremos as <strong>Transformações 2D e 3D no CSS (translate, rotate, scale, skew e perspective)</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/">Pseudo-elementos no CSS: ::before e ::after | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
