Interação

Dispositivos de tela pequena, como smartphones, geralmente têm touchscreens. Dispositivos de tela grande, como laptops e computadores desktop, geralmente vêm com hardware como um mouse ou um trackpad. É tentador equilibrar telas pequenas ao toque e telas grandes a ponteiros.

Mas a realidade é mais sutil. Alguns laptops têm recursos de touchscreen. Os usuários podem interagir com uma tela touchscreen, um trackpad ou ambos. Da mesma forma, é possível usar um teclado ou mouse externo com um dispositivo touchscreen, como um tablet.

Em vez de tentar inferir o mecanismo de entrada do tamanho da tela, use os recursos de mídia em CSS.

Apontador

É possível testar três valores possíveis com o recurso de mídia pointer: none, coarse e fine.

Se um navegador informar um valor pointer de none, talvez o usuário esteja usando um teclado para interagir com o site.

Se um navegador informar um valor pointer de coarse, isso significa que o mecanismo de entrada principal não é muito preciso. Um dedo na tela touchscreen é um ponteiro grosso.

Se um navegador informa um valor pointer de fine, isso significa que o mecanismo de entrada principal é capaz de ter um controle refinado. Um mouse ou uma stylus são ótimos ponteiros.

Você pode ajustar o tamanho dos elementos da interface para se adequar ao valor de pointer. Acesse este site em diferentes tipos de dispositivos para ver como a interface se adapta.

Neste exemplo, os botões ficam maiores para ponteiros aproximados:

button {
  padding: 0.5em 1em;
}
@media (pointer: coarse) {
  button {
    padding: 1em 2em;
  }
}

Também é possível reduzir o tamanho dos elementos para ponteiros finos, mas tenha cuidado ao fazer isso:

O que não fazer
@media (pointer: fine) {
  button {
    padding: 0.25em 0.5em;
  }
}

Mesmo que alguém tenha um mecanismo de entrada principal capaz de controlar minuciosamente, pense bem antes de reduzir o tamanho dos elementos interativos. A Lei de Fitts ainda se aplica. Um alvo menor exige mais concentração, mesmo com um ponteiro fino. Uma área-alvo maior beneficia a todos, independentemente do dispositivo apontador.

Qualquer ponteiro

O recurso de mídia pointer informa a nitidez do mecanismo de entrada principal. No entanto, muitos dispositivos têm mais de um mecanismo de entrada. É possível que alguém esteja interagindo com seu site usando uma tela touchscreen e um mouse ao mesmo tempo.

A any-pointer é diferente do recurso de mídia pointer, porque informa se algum dispositivo apontador foi aprovado no teste.

Um valor any-pointer de none significa que nenhum dispositivo apontador está disponível.

Um valor any-pointer de coarse significa que pelo menos um dispositivo apontador não é muito preciso. Mas esse pode não ser o mecanismo de entrada principal.

Um valor any-pointer de fine significa que pelo menos um dispositivo apontador pode ter um controle refinado. Mas, novamente, esse pode não ser o mecanismo de entrada principal.

Como a consulta de mídia any-pointer vai informar um resultado positivo se qualquer um dos mecanismos de entrada for aprovado no teste, é possível que um navegador informe um resultado para any-pointer: fine e também um resultado para any-pointer: coarse. Nesse caso, a ordem das consultas de mídia é importante. A última será priorizada.

Nesse exemplo, se o dispositivo tiver um mecanismo de entrada refinado e um aproximado, os estilos aproximados serão aplicados.

@media (any-pointer: fine) {
  button {
    padding: 0.5em 1em;
  }
}
@media (any-pointer: coarse) {
  button {
    padding: 1em 2em;
  }
}

Passar cursor

O recurso de mídia hover informa se o mecanismo de entrada principal pode passar o cursor sobre os elementos. Isso geralmente significa que há algum tipo de cursor na tela sendo controlado por um mouse ou um trackpad.

Ao contrário do recurso de mídia pointer, que diferencia ponteiros finos e aproximados, o recurso de mídia hover é binário. Se o dispositivo de entrada principal conseguir passar o cursor sobre os elementos, ele vai informar o valor hover. Caso contrário, o valor será none.

Nesse exemplo, alguns ícones complementares ficam disponíveis ao passar o cursor, mas somente se o dispositivo de entrada principal puder passar o cursor sobre um elemento.

button .extra {
  visibility: visible;
}
@media (hover: hover) {
  button .extra {
    visibility: hidden;
  }
  button:hover .extra {
    visibility: visible;
  }
}

Se você passar o mouse sobre esse botão, o ícone será exibido. Porém, se você usar o teclado para avançar até o botão, o ícone permanecerá invisível. Ao usar o teclado, você foca em vez de passar o cursor. Um computador com um mouse conectado informa que o mecanismo de entrada principal é capaz de passar o cursor, o que é verdade. No entanto, nenhum usuário que usar o teclado com o mouse conectado vai aproveitar os benefícios dos estilos :hover. Por isso, é uma boa ideia combinar os estilos de :hover e :focus para abranger as duas interações.

button .extra {
  visibility: visible;
}
@media (hover: hover) {
  button .extra {
    visibility: hidden;
  }
  button:is(:hover, :focus) .extra {
    visibility: visible;
  }
}

Mesmo que o dispositivo de entrada principal seja capaz de passar o cursor sobre os elementos, tenha cuidado ao ocultar informações atrás de uma interação de passar o cursor. As informações se tornam menos detectáveis. Não use o recurso de passar o cursor para ocultar informações ou elementos importantes da interface.

Qualquer pessoa ao passar o cursor

A consulta de mídia hover gera relatórios apenas sobre o mecanismo de entrada principal. Alguns dispositivos têm vários mecanismos de entrada: touchscreen, mouse, teclado e trackpad.

Assim como any-pointer gera relatórios sobre qualquer um dos mecanismos de entrada, any-hover será verdadeiro se algum dos mecanismos de entrada disponíveis puder passar o cursor sobre os elementos.

Se você tiver decidido inverter a lógica no exemplo anterior, poderá definir os estilos de passagem de cursor como padrão e removê-los se o valor de any-hover for none.

button .extra {
  visibility: hidden;
}
button:hover .extra,
button:focus .extra {
  visibility: visible;
}
@media (any-hover: none) {
  button .extra {
    visibility: visible;
  }
}

Em um dispositivo que não tem um mecanismo de entrada capaz de passar o cursor, o ícone extra está sempre visível.

Teclados virtuais

As pessoas usam cursores e dedos para explorar interfaces, mas, na hora de inserir informações, elas precisam de um teclado. Tudo bem se houver um teclado físico conectado ao dispositivo, mas se eles estiverem usando um dispositivo touchscreen, o processo será um pouco mais complicado. Esses dispositivos oferecem teclados virtuais na tela.

Tipos de entrada

Ao contrário de um teclado físico, os teclados virtuais podem ser adaptados para corresponder à entrada esperada. Se você fornecer informações sobre a entrada esperada, os dispositivos poderão exibir o teclado virtual mais adequado.

Os tipos de entrada HTML5 são uma ótima maneira de descrever seus elementos input. O atributo type aceita valores como email, number, tel, url e outros.

  <label for="email">Email</label>
  <input type="email" id="email">
  <label for="number">Number</label>
  <input type="number" id="number">
  <label for="tel">Tel</label>
  <input type="tel" id="tel">
  <label for="url">URL</label>
  <input type="url" id="url">

Modos de entrada

Compatibilidade com navegadores

  • 66
  • 79
  • 95
  • x

Origem

O atributo inputmode oferece controle detalhado sobre teclados virtuais. Por exemplo, embora exista um type input com um valor de number, é possível usar o atributo inputmode para diferenciar números inteiros e decimais.

Para pedir um número inteiro, como a idade de alguém, use inputmode="numeric".

<label for="age">Age</label>
<input type="number" id="age" inputmode="numeric">

Se você estiver pedindo um número que inclua casas decimais, como um preço, use inputmode="decimal".

<label for="price">Price</label>
<input type="number" id="price" inputmode="decimal">

Preenchimento automático

Compatibilidade com navegadores

  • 14
  • ≤79
  • 4
  • 6

Origem

Ninguém gosta de preencher formulários. Como designer, você pode melhorar a experiência dos usuários permitindo que eles preencham automaticamente os campos do formulário. O atributo autocomplete oferece várias opções para melhorar formulários de contato, de login e de finalização de compra.

<label for="name">Name</label>
<input type="text" id="name" autocomplete="name">
<label for="country">Country</label>
<input type="text" id="country" autocomplete="country">
<label for="email">Email</label>
<input type="email" id="email" autocomplete="email">

Esses atributos HTML (type, inputmode e autocomplete) são pequenas adições aos campos do formulário, mas podem fazer uma grande diferença na experiência do usuário. Ao antecipar e responder aos recursos do dispositivo dos usuários, você os capacita. Para informações mais detalhadas, há um curso dedicado a ajudar você a aprender a usar formulários.

A seguir, neste curso, vamos examinar alguns padrões comuns de interface.

Teste seu conhecimento

Teste seus conhecimentos sobre interações

Qual recurso você deve usar em vez de tentar inferir o tipo de entrada de um usuário pelo tamanho da tela?

Recursos de mídia CSS
Semelhantes a @media (pointer: coarse) ou @media (-any-pointer: coarse)
Perguntar ao usuário com o prompt() do JavaScript
Não é ideal para perguntar diretamente.
Tipo de mídia CSS handheld
Essa função foi descontinuada nas Consultas de mídia 4.

Qual é a diferença entre @media (pointer) e @media (any-pointer)?

Qualquer ponteiro inclui itens como seu dedo como ponteiro.
O ponteiro já inclui o toque como um tipo de entrada.
Os ponteiros não incluem itens como um mouse.
Os ponteiros incluem um mouse como dispositivo de entrada.
Qualquer ponteiro vai informar "true" quando outras entradas não primárias, como uma stylus, forem aprovadas no teste.
any-pointer consulta todos os tipos de entrada do dispositivo para encontrar qualquer correspondência.

Quais tipos de entrada mostram um teclado virtual mais adequado para os usuários?

type="url"
O teclado vai oferecer botões para oferecer suporte à digitação de URLs.
type="tel"
O teclado vai oferecer botões para ajudar você a digitar números de telefone.
type="number"
O teclado vai oferecer botões para permitir a digitação apenas de números.
type="email"
O teclado vai oferecer botões para você digitar os endereços de e-mail.