<?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 steps css - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/steps-css/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/steps-css/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Thu, 22 Oct 2026 03:42:26 +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 steps css - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/steps-css/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Animações Profissionais com @keyframes no CSS &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:42:26 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[animacoes css]]></category>
		<category><![CDATA[animation shorthand]]></category>
		<category><![CDATA[animation-fill-mode]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[keyframes css]]></category>
		<category><![CDATA[steps css]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29467</guid>

					<description><![CDATA[<p>Na lição anterior, você aprendeu que as transições são perfeitas para suavizar a passagem entre dois estados quando o usuário interage com a página. No entanto, muitas interfaces exigem experiências cinematográficas contínuas: indicadores de carregamento que giram sem parar, notificações que entram suavemente na tela assim que o documento abre, ou ilustrações que flutuam em [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/">Animações Profissionais com @keyframes no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  Na lição anterior, você aprendeu que as transições são perfeitas para suavizar a passagem entre dois estados quando o usuário interage com a página. No entanto, muitas interfaces exigem experiências cinematográficas contínuas: indicadores de carregamento que giram sem parar, notificações que entram suavemente na tela assim que o documento abre, ou ilustrações que flutuam em ciclos infinitos de respiração. Para coreografar múltiplos estágios temporais sem depender de ações do mouse, o CSS nos entrega o poderoso motor de <strong><code>@keyframes</code> e a propriedade <code>animation</code></strong>.
</p>
<h2>1. A Linha do Tempo: Criando Regras com <code>@keyframes</code></h2>
<p>
  Uma animação em CSS é dividida em duas partes: a <strong>linha do tempo (Timeline)</strong>, declarada com a regra-arroba <code>@keyframes</code>, e a <strong>aplicação da animação</strong>, configurada no seletor do elemento.
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-30098" 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">20 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-30098', 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-30098', 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. DEFINIÇÃO DA LINHA DO TEMPO */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> pulsarBrilho {</span>
<span class="wzw-code-line">  0% {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: scale(1);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 0.6;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">  50% {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: scale(1.12);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 1;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">  100% {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: scale(1);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 0.6;</span>
<span class="wzw-code-line">  }</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. APLICAÇÃO NO ELEMENTO */</span></span>
<span class="wzw-code-line">.badge-alerta {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: pulsarBrilho <span class="wzw-tk-num">2s</span> ease-in-out infinite;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* 1. DEFINIÇÃO DA LINHA DO TEMPO */
@keyframes pulsarBrilho {
  0% {
    transform: scale(1);
    opacity: 0.6;
  }
  50% {
    transform: scale(1.12);
    opacity: 1;
  }
  100% {
    transform: scale(1);
    opacity: 0.6;
  }
}

/* 2. APLICAÇÃO NO ELEMENTO */
.badge-alerta {
  animation: pulsarBrilho 2s ease-in-out infinite;
}</textarea>
        </div>
    </div>
    
</div>
<p>
  Você pode usar as palavras-chave <code>from</code> (equivalente a <code>0%</code>) e <code>to</code> (equivalente a <code>100%</code>) para animações simples, ou declarar quantos marcos percentuais intermediários desejar (<code>0%</code>, <code>25%</code>, <code>60%</code>, <code>100%</code>) para coreografias ricas.
</p>
<h2>2. As 8 Subpropriedades do <code>animation</code></h2>
<p>
  A propriedade abreviada <code>animation</code> encapsula 8 controles cirúrgicos:
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Propriedade</th>
<th>Valores Principais</th>
<th>Função na Animação</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>animation-name</code></td>
<td>Nome da regra <code>@keyframes</code></td>
<td>Conecta o elemento à sua linha do tempo.</td>
</tr>
<tr>
<td><code>animation-duration</code></td>
<td>Tempo (ex.: <code>1.5s</code>, <code>400ms</code>)</td>
<td>Duração de exatamente 1 ciclo da animação.</td>
</tr>
<tr>
<td><code>animation-timing-function</code></td>
<td><code>ease</code>, <code>linear</code>, <code>cubic-bezier</code>, <code>steps()</code></td>
<td>Curva de aceleração do movimento.</td>
</tr>
<tr>
<td><code>animation-delay</code></td>
<td>Tempo positivo ou negativo (ex.: <code>-0.5s</code>)</td>
<td>Tempo de espera antes do início do primeiro ciclo.</td>
</tr>
<tr>
<td><code>animation-iteration-count</code></td>
<td>Número inteiro ou <strong><code>infinite</code></strong></td>
<td>Quantas vezes a animação repetirá o ciclo.</td>
</tr>
<tr>
<td><code>animation-direction</code></td>
<td><code>normal</code>, <code>reverse</code>, <code>alternate</code></td>
<td><code>alternate</code> cria o efeito de ping-pong (vai e volta suavemente).</td>
</tr>
<tr>
<td><strong><code>animation-fill-mode</code></strong></td>
<td><code>none</code>, <code>forwards</code>, <code>backwards</code>, <code>both</code></td>
<td>Controla como os estilos persistem antes e após a execução.</td>
</tr>
<tr>
<td><code>animation-play-state</code></td>
<td><code>running</code>, <code>paused</code></td>
<td>Permite pausar ou retomar a animação (ex.: no <code>:hover</code>).</td>
</tr>
</tbody>
</table>
</div>
<h2>3. <code>animation-fill-mode</code>: O Fim dos Saltos Bruscos</h2>
<p>
  O maior pesadelo dos iniciantes é animar um card surgindo de baixo para cima com fade-in: a animação roda lindamente e, no instante em que chega a 100%, <strong>o card desaparece ou salta bruscamente de volta para o estado inicial</strong>!
</p>
<p>
  Isso acontece porque, por padrão (<code>animation-fill-mode: none</code>), o navegador descarta todos os estilos do <code>@keyframes</code> assim que a animação termina.
</p>
<div class="wzw-callout wzw-callout-info">
<p><strong>A Solução Definitiva com <code>forwards</code> e <code>both</code>:</strong></p>
<ul>
<li><strong><code>forwards</code>:</strong> Ordena ao navegador que <strong>mantenha permanentemente os estilos do último frame (100%)</strong> na tela após o término. O elemento nunca mais salta de volta!</li>
<li><strong><code>backwards</code>:</strong> Aplica os estilos do primeiro frame (0%) durante o período do <code>animation-delay</code> (evita que o elemento apareça antes da hora).</li>
<li><strong><code>both</code>:</strong> O padrão ouro! Aplica tanto <code>forwards</code> quanto <code>backwards</code>, garantindo entradas de tela impecáveis.</li>
</ul>
</div>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-67018" 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">15 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-67018', 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-67018', 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">/* Animação de Entrada Perfeita e Sem Saltos */</span></span>
<span class="wzw-code-line">.card-entrada {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: deslizarParaCima <span class="wzw-tk-num">0.6s</span> cubic-bezier(0.16, 1, 0.3, 1) both;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> deslizarParaCima {</span>
<span class="wzw-code-line">  from {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 0;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: translateY(<span class="wzw-tk-num">30px</span>);</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">  to {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 1;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: translateY(0);</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Animação de Entrada Perfeita e Sem Saltos */
.card-entrada {
  animation: deslizarParaCima 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;
}

@keyframes deslizarParaCima {
  from {
    opacity: 0;
    transform: translateY(30px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}</textarea>
        </div>
    </div>
    
</div>
<h2>4. Pausando Loops no Hover: <code>animation-play-state</code></h2>
<p>
  Se você tem uma fita de marcas correndo na tela (<em>marquee</em> infinito) ou um disco girando, o usuário pode querer pausar a animação para ler com calma ao passar o mouse:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-49423" 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">7 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-49423', 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-49423', 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">.disco-giratorio {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: girar <span class="wzw-tk-num">8s</span> linear infinite;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.disco-giratorio<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation-play-state</span>: paused; /* Congela o giro exatamente no frame atual! */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.disco-giratorio {
  animation: girar 8s linear infinite;
}

.disco-giratorio:hover {
  animation-play-state: paused; /* Congela o giro exatamente no frame atual! */
}</textarea>
        </div>
    </div>
    
</div>
<h2>5. Animações em Degraus com <code>steps()</code>: O Efeito Máquina de Escrever</h2>
<p>
  Em vez de uma transição fluida e suave, a função <strong><code>steps(n)</code></strong> quebra a interpolação em um número fixo de &#8220;degraus&#8221; discretos. É a base para animar spritesheets de jogos retrô e criar o efeito de digitação mecânica (Typewriter):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-30773" 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">11 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-30773', 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-30773', 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">.texto-maquina {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">overflow</span>: hidden;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">white-space</span>: nowrap;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: 22ch; /* Largura exata de 22 caracteres */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: digitar <span class="wzw-tk-num">3s</span> steps(22) infinite alternate;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> digitar {</span>
<span class="wzw-code-line">  from { width: 0; }</span>
<span class="wzw-code-line">  to { width: 22ch; }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.texto-maquina {
  overflow: hidden;
  white-space: nowrap;
  width: 22ch; /* Largura exata de 22 caracteres */
  animation: digitar 3s steps(22) infinite alternate;
}

@keyframes digitar {
  from { width: 0; }
  to { width: 22ch; }
}</textarea>
        </div>
    </div>
    
</div>
<h2>6. Acessibilidade e Performance Gráfica (WCAG 2.2)</h2>
<div class="wzw-callout wzw-callout-warning">
<p><strong>Blindagem de Performance e Saúde:</strong></p>
<ul>
<li><strong>Performance:</strong> Anime preferencialmente <strong><code>transform</code></strong> e <strong><code>opacity</code></strong>. Evite animar <code>width</code>, <code>height</code>, <code>top</code> ou <code>margin</code> em loops infinitos, sob pena de travar a CPU e descarregar baterias de celulares.</li>
<li><strong>Acessibilidade:</strong> Elementos piscantes ou que se movem continuamente podem desencadear convulsões ou tonturas severas. É obrigatório incluir:
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-43238" 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-43238', 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-43238', 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-kw">@media</span> (prefers-reduced-motion: reduce) {</span>
<span class="wzw-code-line">  * {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">animation-duration</span>: <span class="wzw-tk-num">0.01ms</span> <span class="wzw-tk-kw">!important</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">animation-iteration-count</span>: 1 <span class="wzw-tk-kw">!important</span>;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
  }
}</textarea>
        </div>
    </div>
    </div>
</li>
</ul>
</div>
<h2>7. Laboratório Prático: 3 Animações de Produção em Ação</h2>
<p>
  No código interativo abaixo, construímos três animações do mundo real: um <strong>Spinner de Carregamento Infinito</strong>, um <strong>Efeito Máquina de Escrever com Cursor Piscante</strong> e um <strong>Card com Entrada Suave (Fade &#038; Slide)</strong> usando <code>animation-fill-mode: both</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-49136" 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">113 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-49136', 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-49136', 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 Animações @keyframes 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">    .painel-grid {</span>
<span class="wzw-code-line">      display: grid;</span>
<span class="wzw-code-line">      grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));</span>
<span class="wzw-code-line">      gap: 24px;</span>
<span class="wzw-code-line">      margin-top: 24px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .card-animacao {</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">      display: flex;</span>
<span class="wzw-code-line">      flex-direction: column;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      justify-content: center;</span>
<span class="wzw-code-line">      min-height: 200px;</span>
<span class="wzw-code-line">      text-align: center;</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. SPINNER DE CARREGAMENTO (LOOP INFINITO) */</span></span>
<span class="wzw-code-line">    .spinner-radar {</span>
<span class="wzw-code-line">      width: 48px;</span>
<span class="wzw-code-line">      height: 48px;</span>
<span class="wzw-code-line">      border: 4px solid #334155;</span>
<span class="wzw-code-line">      border-top-color: #38bdf8;</span>
<span class="wzw-code-line">      border-radius: 50%;</span>
<span class="wzw-code-line">      animation: girar 1s linear infinite;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes girar {</span>
<span class="wzw-code-line">      to { transform: rotate(360deg); }</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. EFEITO TYPEWRITER COM STEPS() */</span></span>
<span class="wzw-code-line">    .typewriter-box {</span>
<span class="wzw-code-line">      display: inline-block;</span>
<span class="wzw-code-line">      font-family: monospace;</span>
<span class="wzw-code-line">      font-size: 1.1rem;</span>
<span class="wzw-code-line">      color: #10b981;</span>
<span class="wzw-code-line">      white-space: nowrap;</span>
<span class="wzw-code-line">      overflow: hidden;</span>
<span class="wzw-code-line">      border-right: 3px solid #10b981;</span>
<span class="wzw-code-line">      width: 17ch; /* 17 caracteres */</span>
<span class="wzw-code-line">      animation: </span>
<span class="wzw-code-line">        escrever 3.5s steps(17) infinite alternate,</span>
<span class="wzw-code-line">        piscarCursor 0.7s step-end infinite;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes escrever {</span>
<span class="wzw-code-line">      from { width: 0; }</span>
<span class="wzw-code-line">      to { width: 17ch; }</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes piscarCursor {</span>
<span class="wzw-code-line">      50% { border-color: transparent; }</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. CARD COM ENTRADA CINEMATOGRÁFICA (FILL-MODE: BOTH) */</span></span>
<span class="wzw-code-line">    .card-entrada-suave {</span>
<span class="wzw-code-line">      animation: surgirComFade 1s cubic-bezier(0.16, 1, 0.3, 1) both;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes surgirComFade {</span>
<span class="wzw-code-line">      0% {</span>
<span class="wzw-code-line">        opacity: 0;</span>
<span class="wzw-code-line">        transform: translateY(24px) scale(0.95);</span>
<span class="wzw-code-line">      }</span>
<span class="wzw-code-line">      100% {</span>
<span class="wzw-code-line">        opacity: 1;</span>
<span class="wzw-code-line">        transform: translateY(0) scale(1);</span>
<span class="wzw-code-line">      }</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>Animações Avançadas com @keyframes<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">    Observe três cenários de produção controlados exclusivamente pelo motor gráfico do CSS:</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;painel-grid&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;card-animacao&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;spinner-radar&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/div&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;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;</span><span class="wzw-tk-tag">&gt;</span>Spinner Infinito (linear infinite)<span class="wzw-tk-tag">&lt;/p&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;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-animacao&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;typewriter-box&quot;</span><span class="wzw-tk-tag">&gt;</span>Web-ZoneWare 2026<span class="wzw-tk-tag">&lt;/div&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;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;</span><span class="wzw-tk-tag">&gt;</span>Typewriter com <span class="wzw-tk-tag">&lt;code&gt;</span>steps()<span class="wzw-tk-tag">&lt;/code&gt;</span><span class="wzw-tk-tag">&lt;/p&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;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-animacao card-entrada-suave&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;h4</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin:0 0 8px 0; color:#38bdf8;&quot;</span><span class="wzw-tk-tag">&gt;</span>Entrada Blindada<span class="wzw-tk-tag">&lt;/h4&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;margin:0; font-size:0.85rem; color:#94a3b8;&quot;</span><span class="wzw-tk-tag">&gt;</span>Retém o estado com <span class="wzw-tk-tag">&lt;code&gt;</span>animation-fill-mode: both<span class="wzw-tk-tag">&lt;/code&gt;</span><span class="wzw-tk-tag">&lt;/p&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;/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 Animações @keyframes 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;
    }

    .painel-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
      gap: 24px;
      margin-top: 24px;
    }

    .card-animacao {
      background: #1e293b;
      border: 1px solid #334155;
      border-radius: 14px;
      padding: 24px;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      min-height: 200px;
      text-align: center;
    }

    /* 1. SPINNER DE CARREGAMENTO (LOOP INFINITO) */
    .spinner-radar {
      width: 48px;
      height: 48px;
      border: 4px solid #334155;
      border-top-color: #38bdf8;
      border-radius: 50%;
      animation: girar 1s linear infinite;
    }

    @keyframes girar {
      to { transform: rotate(360deg); }
    }

    /* 2. EFEITO TYPEWRITER COM STEPS() */
    .typewriter-box {
      display: inline-block;
      font-family: monospace;
      font-size: 1.1rem;
      color: #10b981;
      white-space: nowrap;
      overflow: hidden;
      border-right: 3px solid #10b981;
      width: 17ch; /* 17 caracteres */
      animation: 
        escrever 3.5s steps(17) infinite alternate,
        piscarCursor 0.7s step-end infinite;
    }

    @keyframes escrever {
      from { width: 0; }
      to { width: 17ch; }
    }

    @keyframes piscarCursor {
      50% { border-color: transparent; }
    }

    /* 3. CARD COM ENTRADA CINEMATOGRÁFICA (FILL-MODE: BOTH) */
    .card-entrada-suave {
      animation: surgirComFade 1s cubic-bezier(0.16, 1, 0.3, 1) both;
    }

    @keyframes surgirComFade {
      0% {
        opacity: 0;
        transform: translateY(24px) scale(0.95);
      }
      100% {
        opacity: 1;
        transform: translateY(0) scale(1);
      }
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h2 style=&quot;color:#f1f5f9; margin-top:0;&quot;&gt;Animações Avançadas com @keyframes&lt;/h2&gt;
  &lt;p style=&quot;color:#94a3b8; font-size:0.9rem;&quot;&gt;
    Observe três cenários de produção controlados exclusivamente pelo motor gráfico do CSS:
  &lt;/p&gt;

  &lt;div class=&quot;painel-grid&quot;&gt;
    &lt;div class=&quot;card-animacao&quot;&gt;
      &lt;div class=&quot;spinner-radar&quot;&gt;&lt;/div&gt;
      &lt;p style=&quot;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;&gt;Spinner Infinito (linear infinite)&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class=&quot;card-animacao&quot;&gt;
      &lt;div class=&quot;typewriter-box&quot;&gt;Web-ZoneWare 2026&lt;/div&gt;
      &lt;p style=&quot;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;&gt;Typewriter com &lt;code&gt;steps()&lt;/code&gt;&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class=&quot;card-animacao card-entrada-suave&quot;&gt;
      &lt;h4 style=&quot;margin:0 0 8px 0; color:#38bdf8;&quot;&gt;Entrada Blindada&lt;/h4&gt;
      &lt;p style=&quot;margin:0; font-size:0.85rem; color:#94a3b8;&quot;&gt;Retém o estado com &lt;code&gt;animation-fill-mode: both&lt;/code&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste alterar a curva de aceleração ou a direção da animação para <code>alternate</code> para comprovar a versatilidade do <code>@keyframes</code>:
</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><code>@keyframes</code> define uma linha do tempo autônoma através de porcentagens (<code>0%</code> a <code>100%</code>).</li>
<li>A propriedade <code>animation</code> conecta o elemento à timeline e dita duração, repetições e velocidade.</li>
<li><code>animation-fill-mode: forwards</code> ou <code>both</code> impede que a animação sofra saltos bruscos ao terminar.</li>
<li><code>animation-direction: alternate</code> cria loops suaves de ida e volta (ping-pong).</li>
<li>A função <code>steps()</code> divide a interpolação em degraus rígidos, ideal para sprites e efeitos de digitação.</li>
<li>Priorize animar <code>transform</code> e <code>opacity</code> para manter 60fps acelerados pela placa de vídeo.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> Como organizar paletas de cores globais, alternar entre Modo Claro e Escuro dinamicamente e evitar valores mágicos repetidos no CSS? Na <strong>Lição 45</strong>, desvendaremos as <strong>CSS Variables (Custom Properties) &#038; Dark Mode Dinâmico</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/">Animações Profissionais com @keyframes no CSS | 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/animacoes-keyframes-css/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
