<?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 focus css - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/focus-css/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/focus-css/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Thu, 22 Oct 2026 03:18:11 +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 focus css - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/focus-css/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pseudo-classes no CSS: hover, focus e visible &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/pseudo-classes-hover-focus-visible/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/pseudo-classes-hover-focus-visible/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:18:11 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[acessibilidade web]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[focus css]]></category>
		<category><![CDATA[focus-visible]]></category>
		<category><![CDATA[focus-within]]></category>
		<category><![CDATA[hover css]]></category>
		<category><![CDATA[pseudo-classes]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29457</guid>

					<description><![CDATA[<p>Uma página web onde os elementos não reagem às ações do usuário parece estática e desprovida de vida. No CSS, o que transforma um simples documento de marcação em uma interface digital tátil e responsiva são as Pseudo-classes (identificadas por um único caractere de dois pontos :). Elas permitem aplicar regras de estilo condicionadas ao [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/pseudo-classes-hover-focus-visible/">Pseudo-classes no CSS: hover, focus e visible | 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 página web onde os elementos não reagem às ações do usuário parece estática e desprovida de vida. No CSS, o que transforma um simples documento de marcação em uma interface digital tátil e responsiva são as <strong>Pseudo-classes</strong> (identificadas por um único caractere de dois pontos <code>:</code>). Elas permitem aplicar regras de estilo condicionadas ao estado dinâmico de um elemento: passar o cursor por cima, pressionar um botão, selecionar um campo com a tecla Tab ou validar um formulário. Nesta lição, você dominará o ciclo de vida dos links (regra LVHA), a revolução de acessibilidade do <code>:focus-visible</code> e os estados de formulário modernos.
</p>
<h2>1. O que é uma Pseudo-classe?</h2>
<p>
  Enquanto um seletor comum (como <code>.botao</code>) mira o elemento em seu estado estático padrão, uma <strong>pseudo-classe</strong> visa o elemento em uma circunstância temporal ou comportamental transitória.
</p>
<div class="wzw-callout wzw-callout-info">
<p><strong>Diferença Essencial de Sintaxe:</strong></p>
<ul>
<li><strong>Pseudo-classe (1 caractere <code>:</code>):</strong> Reflete um <em>estado dinâmico</em> do elemento inteiro (ex.: <code>:hover</code>, <code>:focus</code>, <code>:checked</code>).</li>
<li><strong>Pseudo-elemento (2 caracteres <code>::</code>):</strong> Cria ou estiliza uma <em>parte interna específica</em> do elemento (ex.: <code>::before</code>, <code>::after</code>, <code>::placeholder</code>).</li>
</ul>
</div>
<h2>2. O Ciclo de Vida dos Links e a Regra LVHA (LoVe HAte)</h2>
<p>
  Ao estilizar links de navegação, a ordem em que você escreve as regras no arquivo CSS não é opcional — ela é ditada pela cascata de especificidade do navegador. Se você inverter a ordem, um estado pode anular o outro silenciosamente.
</p>
<p>
  Para nunca errar, memorize o mnemônico mundial da web: <strong>LoVe HAte</strong> (Link, Visited, Hover, Active):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-44387" 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">21 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-44387', 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-44387', 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">/* 1. L (Link): Estado virgem (não visitado) */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">a</span>:link {</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 class="wzw-tk-attr">text-decoration</span>: none;</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. V (Visited): Link já clicado pelo usuário anteriormente */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">a</span>:visited {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#a855f7</span>;</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. H (Hover): O ponteiro do mouse repousa sobre o link */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">a</span><span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#60a5fa</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: underline;</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. A (Active): O exato instante em que o clique está pressionado */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">a</span>:active {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#ef4444</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* 1. L (Link): Estado virgem (não visitado) */
a:link {
  color: #38bdf8;
  text-decoration: none;
}

/* 2. V (Visited): Link já clicado pelo usuário anteriormente */
a:visited {
  color: #a855f7;
}

/* 3. H (Hover): O ponteiro do mouse repousa sobre o link */
a:hover {
  color: #60a5fa;
  text-decoration: underline;
}

/* 4. A (Active): O exato instante em que o clique está pressionado */
a:active {
  color: #ef4444;
}</textarea>
        </div>
    </div>
    
</div>
<h2>3. O Duelo de Acessibilidade: <code>:focus</code> vs. <code>:focus-visible</code></h2>
<p>
  Durante décadas, designers gráficos e desenvolvedores cometeram o maior crime contra a acessibilidade na web: aplicar <code>outline: none;</code> ou <code>outline: 0;</code> para eliminar a borda azul nativa do navegador que aparecia quando um botão era clicado com o mouse.
</p>
<p>
  O efeito colateral foi devastador: <strong>milhões de pessoas com deficiência motora que navegam exclusivamente pela tecla <code>Tab</code> ficaram cegas</strong>, sem saber onde o cursor estava na tela!
</p>
<h3>A Salvação: A Pseudo-classe <code>:focus-visible</code></h3>
<p>
  A W3C resolveu esse conflito histórico criando a pseudo-classe <strong><code>:focus-visible</code></strong>:
</p>
<ul>
<li>Se o usuário clicar no botão com o mouse ou tocar na tela do celular: <strong>nenhum anel de foco é exibido</strong> (design limpo!).</li>
<li>Se o usuário navegar usando a tecla <strong><code>Tab</code> do teclado</strong> ou um leitor de tela: o navegador ativa <code>:focus-visible</code> e exibe um anel de foco destacado!</li>
</ul>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-29967" 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">6 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-29967', 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-29967', 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">/* Padrão de Alta Acessibilidade e Design Impecável */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">button</span><span class="wzw-tk-kw">:focus</span>-visible,</span>
<span class="wzw-code-line"><span class="wzw-tk-attr">a</span><span class="wzw-tk-kw">:focus</span>-visible {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">outline</span>: <span class="wzw-tk-num">2px</span> solid <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">outline-offset</span>: <span class="wzw-tk-num">4px</span>; /* Afasta o anel das bordas arredondadas com elegância */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Padrão de Alta Acessibilidade e Design Impecável */
button:focus-visible,
a:focus-visible {
  outline: 2px solid #38bdf8;
  outline-offset: 4px; /* Afasta o anel das bordas arredondadas com elegância */
}</textarea>
        </div>
    </div>
    
</div>
<h2>4. O Efeito Cascata do <code>:focus-within</code></h2>
<p>
  A pseudo-classe <strong><code>:focus-within</code></strong> possui um comportamento genial: ela seleciona um elemento contêiner pai se <strong>qualquer elemento filho dentro dele receber foco</strong>!
</p>
<p>
  É a técnica perfeita para acender a borda de um cartão de formulário ou escurecer o fundo quando o usuário clica em qualquer campo de texto interno:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-14934" 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-14934', 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-14934', 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">/* O cartão inteiro ganha uma borda azul e sombra quando o usuário foca no input */</span></span>
<span class="wzw-code-line">.cartao-login<span class="wzw-tk-kw">:focus</span>-within {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 0 <span class="wzw-tk-num">20px</span> rgba(56, 189, 248, 0.2);</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* O cartão inteiro ganha uma borda azul e sombra quando o usuário foca no input */
.cartao-login:focus-within {
  border-color: #38bdf8;
  box-shadow: 0 0 20px rgba(56, 189, 248, 0.2);
}</textarea>
        </div>
    </div>
    
</div>
<h2>5. Estados Interativos de Formulários</h2>
<p>
  O CSS moderno permite validar e reagir a campos de formulário sem precisar de uma única linha de JavaScript:
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Pseudo-classe</th>
<th>Condição de Ativação</th>
<th>Exemplo de Uso</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong><code>:disabled</code></strong></td>
<td>O elemento possui o atributo <code>disabled</code>.</td>
<td>Botões cinzas sem clique (<code>cursor: not-allowed; opacity: 0.5</code>).</td>
</tr>
<tr>
<td><strong><code>:checked</code></strong></td>
<td>Caixa de seleção (checkbox) ou rádio marcada.</td>
<td>Criação de botões toggle e switches personalizados no CSS.</td>
</tr>
<tr>
<td><strong><code>:valid</code></strong></td>
<td>O valor digitado atende aos requisitos do campo.</td>
<td>Exibir uma borda verde suave quando o e-mail for válido.</td>
</tr>
<tr>
<td><strong><code>:invalid</code></strong></td>
<td>O valor viola regras de tipo, formato ou <code>required</code>.</td>
<td>Borda vermelha e aviso quando o campo estiver incorreto.</td>
</tr>
<tr>
<td><strong><code>:placeholder-shown</code></strong></td>
<td>O texto do placeholder ainda está visível.</td>
<td>Efeito de rótulo flutuante (<em>Floating Label</em>) ao digitar.</td>
</tr>
</tbody>
</table>
</div>
<h2>6. Laboratório Prático: Formulário Reativo e Foco Acessível</h2>
<p>
  No código interativo abaixo, experimente navegar usando a tecla <strong><code>Tab</code></strong> para ver o anel do <code>:focus-visible</code> com <code>outline-offset</code>, observe o cartão reagindo com <code>:focus-within</code> e teste digitar um e-mail para ver a validação em tempo real com <code>:valid</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-73223" 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">112 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-73223', 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-73223', 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-classes 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. O PAI REAGE COM :focus-within */</span></span>
<span class="wzw-code-line">    .formulario-card {</span>
<span class="wzw-code-line">      max-width: 420px;</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">      transition: border-color 0.3s ease, box-shadow 0.3s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .formulario-card:focus-within {</span>
<span class="wzw-code-line">      border-color: #38bdf8;</span>
<span class="wzw-code-line">      box-shadow: 0 8px 30px rgba(56, 189, 248, 0.15);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .campo-grupo {</span>
<span class="wzw-code-line">      margin-bottom: 20px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    label {</span>
<span class="wzw-code-line">      display: block;</span>
<span class="wzw-code-line">      font-size: 0.85rem;</span>
<span class="wzw-code-line">      color: #94a3b8;</span>
<span class="wzw-code-line">      margin-bottom: 8px;</span>
<span class="wzw-code-line">      font-weight: 600;</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. ESTADOS DO INPUT (:valid e :invalid) */</span></span>
<span class="wzw-code-line">    .input-texto {</span>
<span class="wzw-code-line">      width: 100%;</span>
<span class="wzw-code-line">      background: #0f172a;</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">      border-radius: 8px;</span>
<span class="wzw-code-line">      padding: 12px 14px;</span>
<span class="wzw-code-line">      color: #f8fafc;</span>
<span class="wzw-code-line">      font-size: 1rem;</span>
<span class="wzw-code-line">      box-sizing: border-box;</span>
<span class="wzw-code-line">      outline: none;</span>
<span class="wzw-code-line">      transition: border-color 0.2s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .input-texto:focus {</span>
<span class="wzw-code-line">      border-color: #38bdf8;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .input-texto:not(:placeholder-shown):valid {</span>
<span class="wzw-code-line">      border-color: #10b981; /* Borda verde quando válido! */</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .input-texto:not(:placeholder-shown):invalid {</span>
<span class="wzw-code-line">      border-color: #ef4444; /* Borda vermelha se formato inválido! */</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. BOTÃO COM :hover, :active E :focus-visible */</span></span>
<span class="wzw-code-line">    .btn-enviar {</span>
<span class="wzw-code-line">      width: 100%;</span>
<span class="wzw-code-line">      background: #2563eb;</span>
<span class="wzw-code-line">      color: #fff;</span>
<span class="wzw-code-line">      border: none;</span>
<span class="wzw-code-line">      border-radius: 8px;</span>
<span class="wzw-code-line">      padding: 14px;</span>
<span class="wzw-code-line">      font-size: 1rem;</span>
<span class="wzw-code-line">      font-weight: 700;</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">      transition: background 0.2s ease, transform 0.1s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .btn-enviar:hover {</span>
<span class="wzw-code-line">      background: #1d4ed8;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .btn-enviar:active {</span>
<span class="wzw-code-line">      transform: scale(0.98); /* Feedback tátil ao clicar */</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* ACESSIBILIDADE POR TECLADO (TAB) */</span></span>
<span class="wzw-code-line">    .btn-enviar:focus-visible {</span>
<span class="wzw-code-line">      outline: 2px solid #38bdf8;</span>
<span class="wzw-code-line">      outline-offset: 4px;</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;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;formulario-card&quot;</span><span class="wzw-tk-tag">&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-top:0; color:#f1f5f9;&quot;</span><span class="wzw-tk-tag">&gt;</span>Acesso ao Portal<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:#64748b; font-size:0.85rem; margin-bottom:20px;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      Navegue usando o <span class="wzw-tk-tag">&lt;kbd&gt;</span>Tab<span class="wzw-tk-tag">&lt;/kbd&gt;</span> do teclado para ver o <span class="wzw-tk-tag">&lt;code&gt;</span>:focus-visible<span class="wzw-tk-tag">&lt;/code&gt;</span> 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;campo-grupo&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;label</span> <span class="wzw-tk-attr">for</span>=<span class="wzw-tk-str">&quot;email&quot;</span><span class="wzw-tk-tag">&gt;</span>E-mail Corporativo<span class="wzw-tk-tag">&lt;/label&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;input</span> <span class="wzw-tk-attr">type</span>=<span class="wzw-tk-str">&quot;email&quot;</span> <span class="wzw-tk-attr">id</span>=<span class="wzw-tk-str">&quot;email&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;input-texto&quot;</span> <span class="wzw-tk-attr">placeholder</span>=<span class="wzw-tk-str">&quot;seu@email.com&quot;</span> <span class="wzw-tk-attr">required</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">type</span>=<span class="wzw-tk-str">&quot;button&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-enviar&quot;</span><span class="wzw-tk-tag">&gt;</span>Entrar no Ambiente →<span class="wzw-tk-tag">&lt;/button&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-classes 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. O PAI REAGE COM :focus-within */
    .formulario-card {
      max-width: 420px;
      background: #1e293b;
      border: 1px solid #334155;
      border-radius: 14px;
      padding: 24px;
      transition: border-color 0.3s ease, box-shadow 0.3s ease;
    }

    .formulario-card:focus-within {
      border-color: #38bdf8;
      box-shadow: 0 8px 30px rgba(56, 189, 248, 0.15);
    }

    .campo-grupo {
      margin-bottom: 20px;
    }

    label {
      display: block;
      font-size: 0.85rem;
      color: #94a3b8;
      margin-bottom: 8px;
      font-weight: 600;
    }

    /* 2. ESTADOS DO INPUT (:valid e :invalid) */
    .input-texto {
      width: 100%;
      background: #0f172a;
      border: 1px solid #334155;
      border-radius: 8px;
      padding: 12px 14px;
      color: #f8fafc;
      font-size: 1rem;
      box-sizing: border-box;
      outline: none;
      transition: border-color 0.2s ease;
    }

    .input-texto:focus {
      border-color: #38bdf8;
    }

    .input-texto:not(:placeholder-shown):valid {
      border-color: #10b981; /* Borda verde quando válido! */
    }

    .input-texto:not(:placeholder-shown):invalid {
      border-color: #ef4444; /* Borda vermelha se formato inválido! */
    }

    /* 3. BOTÃO COM :hover, :active E :focus-visible */
    .btn-enviar {
      width: 100%;
      background: #2563eb;
      color: #fff;
      border: none;
      border-radius: 8px;
      padding: 14px;
      font-size: 1rem;
      font-weight: 700;
      cursor: pointer;
      transition: background 0.2s ease, transform 0.1s ease;
    }

    .btn-enviar:hover {
      background: #1d4ed8;
    }

    .btn-enviar:active {
      transform: scale(0.98); /* Feedback tátil ao clicar */
    }

    /* ACESSIBILIDADE POR TECLADO (TAB) */
    .btn-enviar:focus-visible {
      outline: 2px solid #38bdf8;
      outline-offset: 4px;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;formulario-card&quot;&gt;
    &lt;h3 style=&quot;margin-top:0; color:#f1f5f9;&quot;&gt;Acesso ao Portal&lt;/h3&gt;
    &lt;p style=&quot;color:#64748b; font-size:0.85rem; margin-bottom:20px;&quot;&gt;
      Navegue usando o &lt;kbd&gt;Tab&lt;/kbd&gt; do teclado para ver o &lt;code&gt;:focus-visible&lt;/code&gt; em ação!
    &lt;/p&gt;

    &lt;div class=&quot;campo-grupo&quot;&gt;
      &lt;label for=&quot;email&quot;&gt;E-mail Corporativo&lt;/label&gt;
      &lt;input type=&quot;email&quot; id=&quot;email&quot; class=&quot;input-texto&quot; placeholder=&quot;seu@email.com&quot; required&gt;
    &lt;/div&gt;

    &lt;button type=&quot;button&quot; class=&quot;btn-enviar&quot;&gt;Entrar no Ambiente →&lt;/button&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste clicar no formulário para comprovar o <code>:focus-within</code> no contêiner e a validação de e-mail dinâmica sem JavaScript:
</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>7. Resumo e Próximos Passos</h2>
<ul>
<li>Pseudo-classes (com <code>:</code>) estilizam elementos com base no seu estado dinâmico ou comportamental.</li>
<li>A ordem dos links deve seguir estritamente o mnemônico <strong>LVHA</strong>: <code>:link</code>, <code>:visited</code>, <code>:hover</code> e <code>:active</code>.</li>
<li>Nunca use <code>outline: none</code> sem fornecer um substituto de alta visibilidade!</li>
<li><code>:focus-visible</code> exibe anéis de foco exclusivamente na navegação por teclado (Tab) e leitores de tela, mantendo cliques de mouse limpos.</li>
<li><code>:focus-within</code> estiliza o elemento pai quando qualquer nó filho recebe foco.</li>
<li><code>:valid</code> e <code>:invalid</code> permitem criar feedbacks visuais imediatos em formulários HTML5.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>A Conclusão do Módulo 4 Está Próxima:</strong> Além dos estados do usuário, como selecionar o primeiro filho de uma lista, zebrar tabelas alternadas a cada duas linhas ou ignorar certos nós? Na <strong>Lição 40</strong>, fecharemos o Módulo 4 dominando as <strong>Pseudo-classes Estruturais (:nth-child, :first-child, :last-child, :not e :empty)</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/pseudo-classes-hover-focus-visible/">Pseudo-classes no CSS: hover, focus e visible | 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-classes-hover-focus-visible/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
