Usar recursos de navegadores multiplataforma para criar um formulário de login

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.

  1. Clique em "Remix to edit" para tornar o projeto editável.

  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>
    

    Veja como seu arquivo index.html vai ficar neste ponto:

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

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

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

  2. Clique em Ver app para conferir o formulário de login com o novo estilo.

  3. Clique em Ver origem para voltar ao arquivo style.css.

É bastante código! As principais mudanças são nos tamanhos:

  • padding e margin 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.

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

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

    O teclado de e-mail padrão no iOS.
  4. 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 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. Foque a entrada de e-mail em um dispositivo desktop e digite um texto. Para ver o URL do app, clique em Tela cheia O ícone de 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" e autocomplete="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.

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

  3. Adicione o seguinte JavaScript ao arquivo script.js para ativar/desativar a exibição de senha 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. Confira o app.
    2. Digite um texto no campo de senha.
    3. Clique em Mostrar senha.

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

  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 de baixo 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ários e oferecem suporte à validação com JavaScript.

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

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