Este codelab ensina a criar um formulário de login seguro, acessível e fácil de usar.
1. Usar HTML significativo
Use estes elementos criados para o job:
<form>
<section>
<label>
<button>
Como você vai ver, esses elementos ativam a funcionalidade integrada do navegador, melhoram a acessibilidade e adicionam significado à sua marcação.
Clique em "Remix to edit" para tornar o projeto editável.
Adicione o seguinte código ao elemento
<body>
:<form action="#" method="post"> <h1>Sign in</h1> <section> <label>Email</label> <input> </section> <section> <label>Password</label> <input> </section> <button>Sign in</button> </form>
Veja como seu arquivo
index.html
vai ficar neste ponto:Clique em Ver app para conferir uma prévia do formulário de login. O HTML adicionado é válido e correto, mas o estilo padrão do navegador faz com que ele pareça terrível e difícil de usar, especialmente em dispositivos móveis.
Clique em Ver origem para voltar ao código-fonte.
2. Design para dedos e polegares
Ajuste o padding, as margens e os tamanhos de fonte para garantir que as entradas funcionem bem em dispositivos móveis.
Copie o seguinte CSS e cole no arquivo
style.css
:Clique em Ver app para conferir o formulário de login com o novo estilo.
Clique em Ver origem para voltar ao arquivo
style.css
.
É bastante código! As principais mudanças são nos tamanhos:
padding
emargin
são adicionados às entradas.font-size
é diferente para dispositivos móveis e computadores.
O seletor :invalid
é usado para indicar quando uma entrada tem um valor inválido.
Isso ainda não funciona.
O layout CSS é mobile-first:
- O CSS padrão é para janelas de visualização com menos de 450 pixels de largura.
- A seção de consultas de mídia define substituições para janelas de visualização com pelo menos 450 pixels de largura.
Ao criar seu próprio formulário como este, é muito importante nesta etapa do processo testar seu código em dispositivos reais em computadores e dispositivos móveis:
- O rótulo e o texto de entrada são legíveis, principalmente para pessoas com baixa visão?
- Os campos de entrada e o botão Fazer login são grandes o suficiente para serem usados como áreas de toque com os polegares?
3. Adicionar atributos de entrada para ativar recursos integrados do navegador
Permite que o navegador armazene e preencha automaticamente valores de entrada e dá acesso a recursos integrados de gerenciamento de senhas.
Adicione atributos ao HTML do formulário para que ele fique assim:
<form action="#" method="post"> <h1>Sign in</h1> <section> <label for="email">Email</label> <input id="email" name="email" type="email" autocomplete="username" required autofocus> </section> <section> <label for="password">Password</label> <input id="password" name="password" type="password" autocomplete="current-password" required> </section> <button id="sign-in">Sign in</button> </form>
Veja o app novamente e clique em E-mail.
Observe como o foco se move para a entrada de e-mail. Isso acontece porque o rótulo está associado à entrada pelo atributo
for="email"
. Os leitores de tela também anunciam o texto do marcador quando o marcador ou a entrada associada a ele recebe o foco.Foque a entrada de e-mail em um dispositivo móvel.
Observe como o teclado é otimizado para digitar um endereço de e-mail. Por exemplo, os caracteres
@
e.
podem aparecer no teclado principal, e o sistema operacional pode mostrar e-mails armazenados acima do teclado. Tudo isso acontece porque o atributotype="email"
é aplicado a um elemento<input>
.Digite um texto na entrada de senha.
O texto fica oculto por padrão porque o atributo
type="password"
foi aplicado ao elemento.
- Os atributos
autocomplete
,name
,id
etype
ajudam os navegadores a entender a função das entradas para armazenar dados que podem ser usados posteriormente para preenchimento automático.
- Foque a entrada de e-mail em um dispositivo desktop e digite um texto.
Para ver o URL do app, clique em Tela cheia
. Se você armazenou endereços de e-mail no navegador, provavelmente vai aparecer uma caixa de diálogo para selecionar entre eles. Isso acontece porque o atributo
autocomplete="username"
foi aplicado à entrada de e-mail.
autocomplete="username"
eautocomplete="current-password"
ajudam os navegadores a usar valores armazenados para preencher automaticamente as entradas.
Navegadores diferentes usam técnicas diferentes para determinar a função das entradas de formulário e fornecer preenchimento automático para vários sites diferentes.
Adicione e remova atributos para testar.
É extremamente importante testar o comportamento em várias plataformas. Insira valores e envie o formulário em navegadores e dispositivos diferentes. É fácil testar em várias plataformas com o BrowserStack, que é sem custo financeiro para projetos de código aberto. Confira!
Veja como seu arquivo index.html
vai ficar neste ponto:
4. Adicionar interface para alternar a exibição de senha
Especialistas em usabilidade recomendam muito a adição de um ícone ou botão que permita aos usuários ver o texto inserido no campo Senha. Não há uma maneira integrada de fazer isso. Portanto, você precisa implementar por conta própria com JavaScript.
O código para adicionar essa funcionalidade é simples. Este exemplo usa texto, não um ícone.
Atualize os arquivos index.html
, style.css
e script.js
da seguinte forma.
Adicione uma chave à seção de senha no arquivo
index.html
:<section> <label for="password">Password</label> <button id="toggle-password" type="button" aria-label="Show password as plain text. Warning: this will display your password on the screen.">Show password</button> <input id="password" name="password" type="password" autocomplete="current-password" required> </section>
Adicione o seguinte CSS à parte de baixo do arquivo
style.css
:button#toggle-password { background: none; border: none; cursor: pointer; font-weight: 300; padding: 0; position: absolute; top: -4px; right: -2px; }
Isso faz com que o botão Mostrar senha pareça um texto simples e o exibe no canto superior direito da seção de senha.
Adicione o seguinte JavaScript ao arquivo
script.js
para ativar/desativar a exibição de senha e definir oaria-label
apropriado:const passwordInput = document.getElementById('password'); const togglePasswordButton = document.getElementById('toggle-password'); togglePasswordButton.addEventListener('click', togglePassword); function togglePassword() { if (passwordInput.type === 'password') { passwordInput.type = 'text'; togglePasswordButton.textContent = 'Hide password'; togglePasswordButton.setAttribute('aria-label', 'Hide password.'); } else { passwordInput.type = 'password'; togglePasswordButton.textContent = 'Show password'; togglePasswordButton.setAttribute('aria-label', 'Show password as plain text. ' + 'Warning: this will display your password on the screen.'); } }
Teste a lógica de mostrar senha agora.
- Confira o app.
- Digite um texto no campo de senha.
- Clique em Mostrar senha.
Repita a quarta etapa em vários navegadores em diferentes sistemas operacionais.
Pense no design de UX: os usuários vão notar e entender a opção Mostrar senha? Há uma maneira melhor de oferecer essa funcionalidade? Este é um bom momento para testar a usabilidade de descontos com um pequeno grupo de amigos ou colegas.
Para entender como essa funcionalidade funciona com leitores de tela, instale a extensão ChromeVox Classic e navegue pelo formulário. Os valores de aria-label
funcionam conforme o esperado?
Alguns sites, como o Gmail, usam ícones, não texto, para ativar ou desativar a exibição de senhas. Quando terminar este codelab, implemente isso com imagens SVG. O Material Design oferece ícones de alta qualidade que podem ser baixados sem custo financeiro.
Veja como seu código vai ficar neste ponto:
5. Adicionar validação de formulário
Você pode ajudar os usuários a inserir os dados corretamente permitindo que eles validem as informações antes de enviar o formulário e mostrando o que precisa ser mudado.
Os elementos e atributos de formulário HTML têm recursos integrados para validação básica, mas também é recomendável usar JavaScript para fazer uma validação mais robusta enquanto os usuários inserem dados e quando tentam enviar o formulário.
Esta etapa usa a API Constraint Validation, que tem amplo suporte, para adicionar validação personalizada com uma interface do navegador integrada que define o foco e mostra solicitações.
Informe aos usuários as restrições de senhas e outras entradas. Não deixe que eles adivinhem!
Atualize a seção de senha do arquivo
index.html
:<section> <label for="password">Password</label> <button id="toggle-password" type="button" aria-label="Show password as plain text. Warning: this will display your password on the screen.">Show password</button> <input id="password" name="password" type="password" autocomplete="current-password" aria-describedby="password-constraints" required> <div id="password-constraints">At least eight characters, with at least one lowercase and one uppercase letter.</div> </section>
Isso adiciona dois novos recursos:
- Informações sobre restrições de senha
- Um atributo
aria-describedby
para a entrada de senha. Os leitores de tela leem o texto do rótulo, o tipo de entrada (senha) e a descrição.
Adicione o seguinte CSS à parte de baixo do arquivo
style.css
:div#password-constraints { margin: 5px 0 0 0; font-size: 16px; }
Adicione o seguinte JavaScript ao arquivo
script.js
:passwordInput.addEventListener('input', resetCustomValidity); function resetCustomValidity() { passwordInput.setCustomValidity(''); } // A production site would use more stringent password testing. function validatePassword() { let message= ''; if (!/.{8,}/.test(passwordInput.value)) { message = 'At least eight characters. '; } if (!/.*[A-Z].*/.test(passwordInput.value)) { message += 'At least one uppercase letter. '; } if (!/.*[a-z].*/.test(passwordInput.value)) { message += 'At least one lowercase letter.'; } passwordInput.setCustomValidity(message); } const form = document.querySelector('form'); const signinButton = document.querySelector('button#sign-in'); form.addEventListener('submit', handleFormSubmission); function handleFormSubmission(event) { event.preventDefault(); validatePassword(); form.reportValidity(); if (form.checkValidity() === false) { } else { // On a production site do form submission. alert('Logging in!') signinButton.disabled = 'true'; } }
Confira!
Todos os navegadores recentes têm recursos integrados para validação de formulários e oferecem suporte à validação com JavaScript.
- Insira um endereço de e-mail inválido e clique em Fazer login. O navegador mostra um aviso. Não é necessário JavaScript.
- Digite um endereço de e-mail válido, mas clique em Fazer login sem uma senha. O navegador avisa que você esqueceu um valor obrigatório e define o foco na entrada de senha.
- Digite uma senha inválida e clique em Fazer login. Agora você vê mensagens diferentes dependendo do que está errado.
Tente diferentes maneiras de ajudar os usuários a inserir endereços de e-mail e senhas. Campos de formulário de senha melhores oferece algumas sugestões inteligentes.
Veja como seu código vai ficar neste ponto:
Vá além
Eles não são mostrados neste codelab, mas você ainda precisa destes quatro recursos cruciais do formulário de login:
Adicione Esqueceu a senha?, um botão que facilita a redefinição de senhas pelos usuários.
Inclua um link para os documentos dos Termos de Serviço e da Política de Privacidade para que os usuários saibam como você protege os dados deles.
Considere o estilo e a marca e verifique se esses recursos adicionais correspondem ao restante do seu site.
Adicione Analytics e RUM para testar e monitorar o desempenho e a usabilidade do design do formulário.