Use os recursos do navegador em várias plataformas para criar um formulário de login

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.

  1. Clique em Remixar para editar o projeto.

  2. 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:

  3. 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.

  4. 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.

  1. Copie o seguinte CSS e cole-o no seu arquivo style.css:

  2. Clique em Ver aplicativo para conferir seu novo formulário de login.

  3. 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 e margin 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.

  1. 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>
    
  2. 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.

  3. 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 atributo type="email" é aplicado a um elemento <input>.

    O teclado de e-mail padrão no iOS.
  4. 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 e type ajudam os navegadores a entender a função das entradas para armazenar dados que podem ser usados posteriormente para preenchimento automático.
  1. Focar a entrada de e-mail em um computador e digitar algum texto. Para conferir o URL do app, clique em Tela cheia O ícone &quot;Tela cheia&quot;. 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" e autocomplete="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.

  1. 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>
    
  2. 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.

  3. Adicione o seguinte JavaScript ao arquivo script.js para alternar a exibição de senhas e definir o aria-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.');
      }
    }
    
  4. Teste a lógica de mostrar senha agora.

    1. Visualize seu app.
    2. Digite um texto no campo da senha.
    3. Clique em Mostrar senha.

  5. 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!

  1. 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).
  1. Adicione o seguinte CSS à parte inferior do arquivo style.css:

    div#password-constraints {
      margin: 5px 0 0 0;
      font-size: 16px;
    }
    
  2. 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';
      }
    }
    
  3. Confira!

    Todos os navegadores recentes têm recursos integrados para validação de formulário e validação de com JavaScript.

    1. Insira um endereço de e-mail inválido e clique em Fazer login. O navegador exibe um aviso: não é necessário JavaScript.
    2. 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.
    3. Digite uma senha inválida e clique em Fazer login. Agora você verá mensagens diferentes dependendo do que está errado.

  4. 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.