Todo campo de formulário precisa ter um rótulo (<label>) associado programaticamente via for/id ou aria-label/aria-labelledby. Placeholder não substitui label.
Impacto por tipo de deficiência
Leitor de tela não anuncia o nome do campo ao receber foco — usuário não sabe o que deve preencher.
Sem label visível, usuários com dificuldades cognitivas podem esquecer o propósito do campo ao digitar.
Label clicável aumenta a área de clique do campo (especialmente para checkboxes e radio buttons).
<!-- ❌ Placeholder como único rótulo -->
<input type="text" placeholder="Nome completo">
<!-- ❌ Label visualmente próxima mas não associada -->
<p>E-mail:</p>
<input type="email">
<!-- ❌ Label sem atributo for -->
<label>Senha</label>
<input type="password" id="senha"><!-- ✓ Label associada via for/id -->
<label for="nome">Nome completo</label>
<input type="text" id="nome" name="nome" autocomplete="name">
<!-- ✓ Label envolvendo o campo (implicit label) -->
<label>
E-mail
<input type="email" name="email" autocomplete="email">
</label>
<!-- ✓ Visualmente oculto mas acessível -->
<label for="busca" class="sr-only">Buscar</label>
<input type="search" id="busca" placeholder="Digite um termo...">Técnicas ARIA relevantes
aria-labelaria-labelledbyaria-requiredaria-describedby