Este codelab ensina como criar um formulário de login seguro, acessível e fácil de usar.
1. Use um HTML significativo
Use estes elementos criados para o trabalho:
<form>
<section>
<label>
<button>
Como você verá, esses elementos ativam funcionalidades integradas do navegador, melhoram a acessibilidade e dão significado à sua marcação.
Clique em Remixar para editar o projeto.
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>
O arquivo
index.html
ficará assim:Clique em Ver aplicativo para visualizar seu formulário de login. O HTML que você adicionou é 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 Exibir código-fonte para retornar 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-o no seu arquivo
style.css
:Clique em Ver aplicativo para conferir seu novo formulário de login.
Clique em View Source para retornar ao arquivo
style.css
.
É uma grande quantidade de código. As principais coisas a serem observadas são as mudanças nos tamanhos:
padding
emargin
são adicionados às entradas.- O
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 do CSS prioriza dispositivos móveis:
- O CSS padrão é para janelas de visualização com menos de 450 pixels de largura.
- A seção de consulta 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 dessa forma, é muito importante testar o código em dispositivos reais nesse ponto do processo:
- O rótulo e o texto de entrada são legíveis, especialmente para pessoas com baixa visão?
- As entradas e o botão Fazer login são grandes o suficiente para serem usados como áreas de toque de dedos?
3. Adicione atributos de entrada para ativar os recursos integrados do navegador
Ative o navegador para armazenar e preencher automaticamente valores de entrada e conceder acesso a recursos integrados de gerenciamento de senhas.
Adicione atributos ao HTML do formulário para que 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 ocorre porque o rótulo é associado à entrada pelo atributo
for="email"
. Os leitores de tela também anunciam o texto do rótulo quando ele ou a entrada associada a ele recebe o foco.Focar 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 os e-mails armazenados acima do teclado. Tudo isso acontece porque o atributotype="email"
é aplicado a um elemento<input>
.Digite algum 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.
- Focar a entrada de e-mail em um computador e digitar algum texto.
Para conferir o URL do app, clique em Tela cheia . Se você armazenou endereços de e-mail no navegador, provavelmente verá uma caixa de diálogo para selecionar esses e-mails armazenados. Isso acontece porque o atributo
autocomplete="username"
é aplicado à entrada do e-mail.
autocomplete="username"
eautocomplete="current-password"
ajudam os navegadores a usar valores armazenados para preencher automaticamente as entradas.
Cada navegador usa técnicas distintas para definir o papel das entradas de formulário e fornecer o preenchimento automático para vários sites.
Adicione e remova atributos para tentar fazer isso por conta própria.
É muito importante testar o comportamento entre plataformas. Insira os valores e envie o formulário em navegadores e dispositivos diferentes. É fácil fazer testes em várias plataformas com o BrowserStack, que é sem custo financeiro para projetos de código aberto. Confira!
O arquivo index.html
ficará assim:
4. Adicionar interface para alternar a exibição de senhas
Os especialistas em usabilidade recomendam fortemente a adição de um ícone ou botão que permita aos usuários ver o texto digitado no campo Senha. Não existe uma maneira integrada de fazer isso, então você precisa fazer a implementação usando 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
desta forma.
Adicione um botão de alternância à 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 inferior 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 alternar a exibição de senhas 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.
- Visualize seu app.
- Digite um texto no campo da senha.
- Clique em Mostrar senha.
Repita a quarta etapa em vários navegadores em diferentes sistemas operacionais.
Pense no design da experiência do usuário: os usuários vão notar e entender a opção Mostrar senha? Existe uma maneira melhor de oferecer essa funcionalidade? Esse é um bom momento para testar o teste de usabilidade de descontos com um pequeno grupo de amigos ou colegas.
Para entender como essa funcionalidade funciona para leitores de tela, instale a extensão ChromeVox Classic e navegue pelo formulário. Os valores aria-label
funcionam conforme o esperado?
Alguns sites, como o Gmail, usam ícones, não texto, para alternar a exibição de senhas. Ao terminar este codelab, implemente-o com imagens SVG. O Material Design oferece ícones de alta qualidade para download sem custo financeiro.
O código vai ficar assim:
5. Adicionar validação do formulário
Você pode ajudar os usuários a inserir os dados corretamente ao permitir que eles validem as informações antes do envio do formulário e mostrar o que precisam ser alterados.
Elementos e atributos de formulários HTML possuem recursos integrados para validação básica, mas você também deve 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 interface integrada do navegador que define o foco e mostra solicitações.
Informe aos usuários as restrições para senhas e outras entradas. Não os faça adivinhar!
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 inferior 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ário e validação de com JavaScript.
- Insira um endereço de e-mail inválido e clique em Fazer login. O navegador exibe um aviso: não é necessário JavaScript.
- Insira um endereço de e-mail válido, mas clique em Fazer login sem um valor de senha. O navegador avisa que você perdeu um valor obrigatório e define o foco na entrada de senha.
- Digite uma senha inválida e clique em Fazer login. Agora você verá mensagens diferentes dependendo do que está errado.
Teste várias formas de ajudar os usuários a inserir endereços de e-mail e senhas. Campos de formulário de senha melhores oferecem algumas sugestões inteligentes.
O código vai ficar assim:
Vá além
Eles não são mostrados neste codelab, mas você ainda precisa destes quatro recursos essenciais do formulário de login:
Adicione Esqueceu sua senha?, um botão que facilita a redefinição de senhas para os usuários.
Vincule seus Termos de Serviço e os documentos 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 seu formulário.