<?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 constraint validation api - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/constraint-validation-api/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/constraint-validation-api/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Wed, 21 Oct 2026 03:22:32 +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 constraint validation api - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/constraint-validation-api/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Validação de Formulários no HTML5: Atributos &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-html/atributos-de-validacao-formulario-html5/</link>
					<comments>https://webzoneware.com/web-academy/curso-html/atributos-de-validacao-formulario-html5/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 03:21:04 +0000</pubDate>
				<category><![CDATA[Curso de HTML & HTML5]]></category>
		<category><![CDATA[atributo pattern]]></category>
		<category><![CDATA[atributo required]]></category>
		<category><![CDATA[constraint validation api]]></category>
		<category><![CDATA[html5 formulários]]></category>
		<category><![CDATA[validação de formulário]]></category>
		<category><![CDATA[validação nativa html]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29328</guid>

					<description><![CDATA[<p>Antes da chegada do HTML5, qualquer verificação de dados em páginas web exigia scripts pesados de JavaScript ou viagens lentas de ida e volta ao servidor para validar um simples campo obrigatório. Com a introdução do sistema nativo de Constraint Validation, o próprio navegador assume a responsabilidade de verificar os dados no momento da digitação [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/atributos-de-validacao-formulario-html5/">Validação de Formulários no HTML5: Atributos | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Antes da chegada do HTML5, qualquer verificação de dados em páginas web exigia scripts pesados de JavaScript ou viagens lentas de ida e volta ao servidor para validar um simples campo obrigatório. Com a introdução do sistema nativo de <strong>Constraint Validation</strong>, o próprio navegador assume a responsabilidade de verificar os dados no momento da digitação e do envio, bloqueando dados inválidos instantaneamente com mensagens acessíveis e sem sobrecarregar a sua aplicação.
</p>
<h2>1. Como Funciona a Validação Nativa de Formulários</h2>
<p>
    A validação client-side nativa funciona como uma catraca inteligente de transporte público: ela confere se o bilhete é compatível antes mesmo de girar a roleta. Quando o usuário clica em um botão de envio (<code>&lt;button type="submit"&gt;</code>), o navegador avalia todos os controles associados ao <code>&lt;form&gt;</code>.
</p>
<p>
    Se qualquer campo estiver em desacordo com as regras declaradas em seus atributos HTML:
</p>
<ul>
<li>O evento de submissão (<code>submit</code>) é automaticamente cancelado.</li>
<li>O primeiro campo inválido recebe o foco do teclado de forma imediata.</li>
<li>Um balão explicativo (<em>tooltip nativo</em>) surge na tela orientando o usuário sobre o que precisa ser corrigido.</li>
</ul>
<h2>2. Catálogo de Atributos de Validação do HTML5</h2>
<p>
    O HTML5 disponibiliza um conjunto de atributos declarativos que podem ser aplicados diretamente às tags <code>&lt;input&gt;</code>, <code>&lt;select&gt;</code> e <code>&lt;textarea&gt;</code>:
</p>
<div class="wzw-table-responsive">
<table class="wzw-tech-table">
<thead>
<tr>
<th>Atributo</th>
<th>Inputs Compatíveis</th>
<th>Sintaxe de Exemplo</th>
<th>Finalidade &#038; Comportamento</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>required</code></td>
<td>text, email, password, radio, checkbox, select, textarea</td>
<td><code>&lt;input type="text" required&gt;</code></td>
<td>Impede que o formulário seja enviado se o campo estiver vazio ou sem opção selecionada.</td>
</tr>
<tr>
<td><code>pattern</code></td>
<td>text, search, url, tel, email, password</td>
<td><code>&lt;input pattern="[0-9]{5}-[0-9]{3}"&gt;</code></td>
<td>Valida o valor contra uma Expressão Regular (Regex). Já é ancorado nativamente do início ao fim (<code>^(regex)$</code>).</td>
</tr>
<tr>
<td><code>min</code> / <code>max</code></td>
<td>number, range, date, time, datetime-local, month, week</td>
<td><code>&lt;input type="number" min="1" max="10"&gt;</code></td>
<td>Define o limite numérico ou temporal mínimo e máximo aceito pelo campo.</td>
</tr>
<tr>
<td><code>minlength</code> / <code>maxlength</code></td>
<td>text, search, url, tel, email, password, textarea</td>
<td><code>&lt;input minlength="8" maxlength="32"&gt;</code></td>
<td>Restringe a quantidade mínima e máxima de caracteres permitidos na digitação.</td>
</tr>
<tr>
<td><code>step</code></td>
<td>number, range, date, time, datetime-local</td>
<td><code>&lt;input type="number" step="0.5"&gt;</code></td>
<td>Determina a granularidade ou intervalo de incremento válido (ex: decimais ou múltiplos).</td>
</tr>
<tr>
<td><code>novalidate</code></td>
<td>Elemento <code>&lt;form&gt;</code></td>
<td><code>&lt;form novalidate&gt;</code></td>
<td>Atributo booleano que desativa a validação nativa do navegador para o formulário inteiro.</td>
</tr>
<tr>
<td><code>formnovalidate</code></td>
<td>Botões <code>&lt;button&gt;</code> ou <code>&lt;input type="submit"&gt;</code></td>
<td><code>&lt;button formnovalidate&gt;Rascunho&lt;/button&gt;</code></td>
<td>Permite submeter o formulário sem validação apenas ao clicar naquele botão específico.</td>
</tr>
</tbody>
</table>
</div>
<h2>3. Implementação Prática: Cadastro Robusto com Validações Nativas</h2>
<p>
    No exemplo abaixo, combinamos regras obrigatórias, expressões regulares brasileiras (CEP e CPF) e limites de idade, além de um botão especial para salvar rascunho sem validação:
</p>
    <div class="wzw-ide-card" id="wzw-code-86218" 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">62 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-86218', 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-86218', 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;form</span> <span class="wzw-tk-attr">action</span>=<span class="wzw-tk-str">&quot;/api/cadastro&quot;</span> <span class="wzw-tk-attr">method</span>=<span class="wzw-tk-str">&quot;POST&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;wzw-modern-form&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">&lt;!-- Campo de Nome Obrigatório com Tamanho Mínimo --&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;form-group&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;nome&quot;</span><span class="wzw-tk-tag">&gt;</span>Nome Completo *<span class="wzw-tk-tag">&lt;/label&gt;</span></span>
<span class="wzw-code-line">        &lt;input </span>
<span class="wzw-code-line">            type=&quot;text&quot; </span>
<span class="wzw-code-line">            id=&quot;nome&quot; </span>
<span class="wzw-code-line">            name=&quot;nome&quot; </span>
<span class="wzw-code-line">            required </span>
<span class="wzw-code-line">            minlength=&quot;3&quot; </span>
<span class="wzw-code-line">            maxlength=&quot;80&quot;</span>
<span class="wzw-code-line">            placeholder=&quot;Ex: Ana Maria Silva&quot;</span>
<span class="wzw-code-line">            autocomplete=&quot;name&quot;&gt;</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-comment">&lt;!-- Campo de E-mail com Validação Sintática Nativa --&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;form-group&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 Profissional *<span class="wzw-tk-tag">&lt;/label&gt;</span></span>
<span class="wzw-code-line">        &lt;input </span>
<span class="wzw-code-line">            type=&quot;email&quot; </span>
<span class="wzw-code-line">            id=&quot;email&quot; </span>
<span class="wzw-code-line">            name=&quot;email&quot; </span>
<span class="wzw-code-line">            required </span>
<span class="wzw-code-line">            placeholder=&quot;voce@empresa.com&quot;</span>
<span class="wzw-code-line">            autocomplete=&quot;email&quot;&gt;</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-comment">&lt;!-- Campo de CPF com Regex no Atributo pattern --&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;form-group&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;cpf&quot;</span><span class="wzw-tk-tag">&gt;</span>CPF (somente números ou formatado) *<span class="wzw-tk-tag">&lt;/label&gt;</span></span>
<span class="wzw-code-line">        &lt;input </span>
<span class="wzw-code-line">            type=&quot;text&quot; </span>
<span class="wzw-code-line">            id=&quot;cpf&quot; </span>
<span class="wzw-code-line">            name=&quot;cpf&quot; </span>
<span class="wzw-code-line">            required</span>
<span class="wzw-code-line">            pattern=&quot;\d{3}\.?\d{3}\.?\d{3}-?\d{2}&quot;</span>
<span class="wzw-code-line">            title=&quot;Digite um CPF válido no formato 000.000.000-00 ou 11 números.&quot;</span>
<span class="wzw-code-line">            placeholder=&quot;000.000.000-00&quot;</span>
<span class="wzw-code-line">            inputmode=&quot;numeric&quot;&gt;</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-comment">&lt;!-- Campo de Data com Limites Históricos --&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;form-group&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;nascimento&quot;</span><span class="wzw-tk-tag">&gt;</span>Data de Nascimento *<span class="wzw-tk-tag">&lt;/label&gt;</span></span>
<span class="wzw-code-line">        &lt;input </span>
<span class="wzw-code-line">            type=&quot;date&quot; </span>
<span class="wzw-code-line">            id=&quot;nascimento&quot; </span>
<span class="wzw-code-line">            name=&quot;nascimento&quot; </span>
<span class="wzw-code-line">            required </span>
<span class="wzw-code-line">            min=&quot;1920-01-01&quot; </span>
<span class="wzw-code-line">            max=&quot;2008-01-01&quot;&gt;</span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;small</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;help-text&quot;</span><span class="wzw-tk-tag">&gt;</span>Idade mínima permitida: 18 anos.<span class="wzw-tk-tag">&lt;/small&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-comment">&lt;!-- Ações do Formulário --&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;form-actions&quot;</span><span class="wzw-tk-tag">&gt;</span></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;submit&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-primary&quot;</span><span class="wzw-tk-tag">&gt;</span>Finalizar Cadastro<span class="wzw-tk-tag">&lt;/button&gt;</span></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;submit&quot;</span> <span class="wzw-tk-attr">name</span>=<span class="wzw-tk-str">&quot;acao&quot;</span> <span class="wzw-tk-attr">value</span>=<span class="wzw-tk-str">&quot;rascunho&quot;</span> <span class="wzw-tk-attr">formnovalidate</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-secondary&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">            Salvar Rascunho</span>
<span class="wzw-code-line">        <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;/form&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;form action=&quot;/api/cadastro&quot; method=&quot;POST&quot; class=&quot;wzw-modern-form&quot;&gt;
    &lt;!-- Campo de Nome Obrigatório com Tamanho Mínimo --&gt;
    &lt;div class=&quot;form-group&quot;&gt;
        &lt;label for=&quot;nome&quot;&gt;Nome Completo *&lt;/label&gt;
        &lt;input 
            type=&quot;text&quot; 
            id=&quot;nome&quot; 
            name=&quot;nome&quot; 
            required 
            minlength=&quot;3&quot; 
            maxlength=&quot;80&quot;
            placeholder=&quot;Ex: Ana Maria Silva&quot;
            autocomplete=&quot;name&quot;&gt;
    &lt;/div&gt;

    &lt;!-- Campo de E-mail com Validação Sintática Nativa --&gt;
    &lt;div class=&quot;form-group&quot;&gt;
        &lt;label for=&quot;email&quot;&gt;E-mail Profissional *&lt;/label&gt;
        &lt;input 
            type=&quot;email&quot; 
            id=&quot;email&quot; 
            name=&quot;email&quot; 
            required 
            placeholder=&quot;voce@empresa.com&quot;
            autocomplete=&quot;email&quot;&gt;
    &lt;/div&gt;

    &lt;!-- Campo de CPF com Regex no Atributo pattern --&gt;
    &lt;div class=&quot;form-group&quot;&gt;
        &lt;label for=&quot;cpf&quot;&gt;CPF (somente números ou formatado) *&lt;/label&gt;
        &lt;input 
            type=&quot;text&quot; 
            id=&quot;cpf&quot; 
            name=&quot;cpf&quot; 
            required
            pattern=&quot;\d{3}\.?\d{3}\.?\d{3}-?\d{2}&quot;
            title=&quot;Digite um CPF válido no formato 000.000.000-00 ou 11 números.&quot;
            placeholder=&quot;000.000.000-00&quot;
            inputmode=&quot;numeric&quot;&gt;
    &lt;/div&gt;

    &lt;!-- Campo de Data com Limites Históricos --&gt;
    &lt;div class=&quot;form-group&quot;&gt;
        &lt;label for=&quot;nascimento&quot;&gt;Data de Nascimento *&lt;/label&gt;
        &lt;input 
            type=&quot;date&quot; 
            id=&quot;nascimento&quot; 
            name=&quot;nascimento&quot; 
            required 
            min=&quot;1920-01-01&quot; 
            max=&quot;2008-01-01&quot;&gt;
        &lt;small class=&quot;help-text&quot;&gt;Idade mínima permitida: 18 anos.&lt;/small&gt;
    &lt;/div&gt;

    &lt;!-- Ações do Formulário --&gt;
    &lt;div class=&quot;form-actions&quot;&gt;
        &lt;button type=&quot;submit&quot; class=&quot;btn-primary&quot;&gt;Finalizar Cadastro&lt;/button&gt;
        &lt;button type=&quot;submit&quot; name=&quot;acao&quot; value=&quot;rascunho&quot; formnovalidate class=&quot;btn-secondary&quot;&gt;
            Salvar Rascunho
        &lt;/button&gt;
    &lt;/div&gt;
&lt;/form&gt;</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer testar a validação nativa e regex agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>4. Estilização Visual com Pseudo-classes CSS Modernas</h2>
<p>
    O navegador informa o estado de validação de cada campo por meio de pseudo-classes CSS dinâmicas. Dominar a diferença entre <code>:invalid</code> e a nova especificação <code>:user-invalid</code> é essencial para não estressar os usuários com bordas vermelhas antes mesmo de digitarem:
</p>
    <div class="wzw-ide-card" id="wzw-code-60867" 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">26 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-60867', 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-60867', 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">/* Destaca campos obrigatórios com asterisco ou cor sutil */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">input</span>:required {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-left</span>: <span class="wzw-tk-num">3px</span> solid <span class="wzw-tk-num">#3b82f6</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">/* ⚠️ ATENÇÃO: :invalid puro aplica erro imediatamente ao carregar a página */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Prefira a pseudo-classe moderna :user-invalid (suportada em todos os navegadores atuais) */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">input</span>:user-invalid,</span>
<span class="wzw-code-line"><span class="wzw-tk-attr">select</span>:user-invalid,</span>
<span class="wzw-code-line"><span class="wzw-tk-attr">textarea</span>:user-invalid {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#ef4444</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#fef2f2</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">/* Quando o usuário preenche corretamente */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">input</span>:user-valid {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#10b981</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">/* Exibe a mensagem de ajuda ou erro associada */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">input</span>:user-invalid + .error-message {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">display</span>: block;</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 class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.85rem</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">margin-top</span>: <span class="wzw-tk-num">4px</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Destaca campos obrigatórios com asterisco ou cor sutil */
input:required {
    border-left: 3px solid #3b82f6;
}

/* ⚠️ ATENÇÃO: :invalid puro aplica erro imediatamente ao carregar a página */
/* Prefira a pseudo-classe moderna :user-invalid (suportada em todos os navegadores atuais) */
input:user-invalid,
select:user-invalid,
textarea:user-invalid {
    border-color: #ef4444;
    background-color: #fef2f2;
}

/* Quando o usuário preenche corretamente */
input:user-valid {
    border-color: #10b981;
}

/* Exibe a mensagem de ajuda ou erro associada */
input:user-invalid + .error-message {
    display: block;
    color: #ef4444;
    font-size: 0.85rem;
    margin-top: 4px;
}</textarea>
        </div>
    </div>
    
<h2>5. Conectando o HTML ao JavaScript: Constraint Validation API</h2>
<p>
    Além do comportamento automático, o HTML5 expõe uma poderosa API no JavaScript para inspeção e controle fino das regras de negócio:
</p>
    <div class="wzw-ide-card" id="wzw-code-20448" data-lang="javascript">
        <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">JavaScript</span>
                                <span class="wzw-ide-lines-count">19 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-20448', 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-20448', 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">const</span> campoCpf = document.<span class="wzw-tk-fn">querySelector</span>(<span class="wzw-tk-str">&#039;#cpf&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// 1. Verifica se o campo cumpre todas as regras declaradas</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">if</span> (!campoCpf.<span class="wzw-tk-fn">checkValidity</span>()) {</span>
<span class="wzw-code-line">    console.<span class="wzw-tk-fn">log</span>(<span class="wzw-tk-str">&#039;Motivo da falha:&#039;</span>, campoCpf.validity);</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. Personaliza a mensagem de erro do navegador</span></span>
<span class="wzw-code-line">campoCpf.<span class="wzw-tk-fn">addEventListener</span>(<span class="wzw-tk-str">&#039;input&#039;</span>, () =&gt; {</span>
<span class="wzw-code-line">    <span class="wzw-tk-kw">if</span> (campoCpf.validity.patternMismatch) {</span>
<span class="wzw-code-line">        campoCpf.<span class="wzw-tk-fn">setCustomValidity</span>(<span class="wzw-tk-str">&#039;Por favor, informe os 11 dígitos do seu CPF.&#039;</span>);</span>
<span class="wzw-code-line">    } <span class="wzw-tk-kw">else</span> {</span>
<span class="wzw-code-line">        <span class="wzw-tk-comment">// Obrigatório limpar a mensagem vazia para o campo voltar a ser válido!</span></span>
<span class="wzw-code-line">        campoCpf.<span class="wzw-tk-fn">setCustomValidity</span>(<span class="wzw-tk-str">&#039;&#039;</span>);</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">// 3. Força a exibição do balão de erro nativo programaticamente</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// campoCpf.reportValidity();</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>const campoCpf = document.querySelector(&#039;#cpf&#039;);

// 1. Verifica se o campo cumpre todas as regras declaradas
if (!campoCpf.checkValidity()) {
    console.log(&#039;Motivo da falha:&#039;, campoCpf.validity);
}

// 2. Personaliza a mensagem de erro do navegador
campoCpf.addEventListener(&#039;input&#039;, () =&gt; {
    if (campoCpf.validity.patternMismatch) {
        campoCpf.setCustomValidity(&#039;Por favor, informe os 11 dígitos do seu CPF.&#039;);
    } else {
        // Obrigatório limpar a mensagem vazia para o campo voltar a ser válido!
        campoCpf.setCustomValidity(&#039;&#039;);
    }
});

// 3. Força a exibição do balão de erro nativo programaticamente
// campoCpf.reportValidity();</textarea>
        </div>
    </div>
    
<div class="wzw-pro-tip">
<h4>💡 Dica Pro: A Regra de Ouro da Segurança Web</h4>
<p>
        A validação com atributos no HTML5 e JavaScript é voltada <strong>exclusivamente para a Experiência do Usuário (UX)</strong>, garantindo feedback imediato e evitando envios acidentais.
    </p>
<p>
        <strong>Ela nunca substitui a validação no Back-End!</strong> Qualquer usuário pode desativar o JavaScript, alterar os atributos no DevTools do navegador ou disparar requisições maliciosas diretamente via cURL ou ferramentas de API. Sempre revalide e higienize todos os dados no servidor antes de gravar no banco de dados.
    </p>
</div>
<h2>6. Ferramentas Relacionadas &#038; Próximos Passos</h2>
<p>
    Aprofunde seus conhecimentos práticos explorando as ferramentas gratuitas e tutoriais da nossa plataforma:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/central-dev/">Central do Desenvolvedor Web</a>: Teste expressões regulares, valide códigos e gere hashes instantaneamente.</li>
<li><a href="https://webzoneware.com/web-ferramentas/limpador-formatador-html/">Limpador e Formatador HTML</a>: Mantenha a indentação e os atributos dos seus formulários 100% semânticos e organizados.</li>
<li><a href="https://webzoneware.com/web-academy/html/formularios-html-campos-acoes/">Lição 18: Formulários HTML: Campos &#038; Ações</a>: Revise a anatomia de botões, métodos GET/POST e estruturas de envio.</li>
<li><a href="https://webzoneware.com/web-academy/html/novos-tipos-de-input-html5/">Lição 31: Novos Tipos de Input do HTML5</a>: Conheça todas as variações de campos com teclados móveis dedicados.</li>
</ul>
<h2>7. Referências Técnicas &#038; Especificações Oficiais</h2>
<ul>
<li><a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#constraints" target="_blank" rel="noopener">WHATWG HTML Living Standard: Form Constraints &#038; Validation API</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation" target="_blank" rel="noopener">MDN Web Docs: Client-side Form Validation Guide</a></li>
<li><a href="https://www.w3.org/WAI/tutorials/forms/notifications/" target="_blank" rel="noopener">W3C Web Accessibility Initiative (WAI): Accessible Form Notifications</a></li>
</ul>
<p><!-- Schema.org TechArticle JSON-LD --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "Validação de Formulários no HTML5: Atributos e Boas Práticas",
  "description": "Domine a validação nativa de formulários no HTML5 com required, pattern, min, max e a API de Constraint Validation.",
  "url": "https://webzoneware.com/web-academy/html/atributos-de-validacao-formulario-html5/",
  "inLanguage": "pt-BR",
  "proficiencyLevel": "Intermediate",
  "articleSection": "Web Academy - Curso de HTML & HTML5 Completo",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "url": "https://webzoneware.com"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Web-ZoneWare",
    "logo": {
      "@type": "ImageObject",
      "url": "https://webzoneware.com/wp-content/themes/astra-child/assets/images/logo.png"
    }
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-html/atributos-de-validacao-formulario-html5/">Validação de Formulários no HTML5: Atributos | 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-html/atributos-de-validacao-formulario-html5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
