Apenas recursos normais da web
(heather-buchel.com)- Com o aumento de novas plataformas de mídia social, clientes, apps e portas web baseadas em React Native, tem se tornado comum que sites percam comportamentos básicos da web que os usuários esperam
- A pressão por lançar rápido, a ausência de engenheiros de UI, o design mobile-first para toque e implementações que substituem comportamentos nativos do navegador com JavaScript são apontados como as principais causas
- Recursos nativos do navegador como copiar texto, clicar com o botão direito em links e usar
ctrl + click, zoom do navegador, layout responsivo,:hovere:focus, atualização de URL e histórico, barras de rolagem ectrl + fdevem continuar funcionando normalmente - Em cartões clicáveis, remover
pointer-eventsou sobrepor camadas, assim como implementar navegação comdiveon-clickem vez de âncoras, quebra a experiência normal de links - Há muita sobreposição com violações de acessibilidade, mas apps web devem manter os recursos normais da web que os usuários esperam, em vez de tentar parecer apps móveis
Comportamentos básicos que os sites perderam
- É cada vez mais comum que projetos web bloqueiem recursos normais da web que os usuários esperam
- Com o aumento de novas plataformas de mídia social, surgem vários clientes e apps, e também há muitos casos de tentativa de compartilhar código entre plataformas, como com React Native
- Essas tentativas em si são positivas, mas junto com requisitos básicos de acessibilidade, como texto
altem imagens, também acabam faltando formas normais de interação na web - Entre as causas, podemos destacar:
- pressão para lançar rapidamente algo em um nível testável
- ausência de engenheiros de UI no projeto
- design que prioriza entrada por toque no mobile e ignora outros métodos de entrada ou dispositivos
- implementações que contornam ou substituem comportamentos nativos do navegador com JavaScript
Recursos normais da web que devem ser mantidos
- Deve ser possível copiar texto
- Em componentes de cartão clicáveis, remover
pointer-eventsou sobrepor camadas clicáveis pode impedir a seleção e a cópia de texto
- Em componentes de cartão clicáveis, remover
- Elementos que navegam como links devem oferecer a funcionalidade de link normalmente
- Deve ser possível abrir o menu de contexto com o botão direito para copiar o texto do link ou o endereço
- Atalhos comuns de link para abrir em nova aba, como
ctrl + clickno Windows, devem funcionar - Em vez de mover a navegação com
on-clickem umadiv, deve-se usar um elemento âncora
- Ao usar o zoom do navegador, o layout não deve quebrar, e o usuário deve poder ampliar para ler
- Em vez de cair simplesmente em um layout móvel ao ficar mais estreita que 1200px, uma web responsiva deve usar bem o espaço mesmo em viewports menores
- Mastodon e Twitter podem ser vistos como exemplos em que a UI continua familiar e o espaço é, em geral, bem aproveitado quando a largura do navegador diminui
- Apps web devem oferecer corretamente estados de interação como
:hover,:focuse:active- Em casos de apps React Native portados para a web, às vezes não há estilos de
:hoverou:focus, ou aparece um estilo de:activeestranho, como se estivesse desabilitado
- Em casos de apps React Native portados para a web, às vezes não há estilos de
- Se, após um clique, a UI mudar completamente como se fosse uma nova página, o histórico do navegador e a URL também devem mudar junto
- Se não for possível criar link para um estado de UI que parece uma página independente, e esse estado desaparecer após navegar, a usabilidade piora
- Barras de rolagem não devem ser ocultadas
- O usuário pode querer clicar e arrastar a barra de rolagem
- Atalhos normais do navegador não devem ser interceptados por funções internas do app
- Se
ctrl + fabrir uma busca customizada do app, a busca na página pode deixar de funcionar como de costume
- Se
- Há bastante sobreposição com itens que podem ser vistos como violações de acessibilidade, mas o foco aqui é evitar que apps web quebrem as expectativas básicas de navegador dos usuários
- Casos omitidos podem continuar sendo discutidos no Mastodon
3 comentários
Parece que o conteúdo principal está incorreto.
Nossa, que curioso. Parece que o rastreamento desse próprio post do blog está ficando meio estranho. Acho que vou dar uma olhada na parte do crawler.
Comentários do Hacker News
Quando você aprende web primeiro com React e só depois aprende HTML, pode acabar deixando de se importar com o comportamento padrão dos links
Quando entrei na equipe, todos os links eram botões, elementos arbitrários ou eram tratados com
onClick; ninguém reclamava, masCtrl+cliqueera inútil e o menu de clique direito não oferecia as opções esperadasAcho que, quando se trata de links, não há espaço para negociação
Até uma plataforma de documentação chamada archbee, que recebeu investimento da YC, não permite abrir resultados de busca em uma nova aba; é preciso abrir um no separador atual ou então voltar, pesquisar de novo e abrir o próximo resultado
Dá para ver o exemplo aqui: https://docs.sparklayer.io/
É muito estranho e enlouquecedor que um serviço de internet tão grande tenha um problema de acessibilidade tão óbvio
Também tem o fato de não precisar de conta, mas eu consigo clicar com o botão direito em threads de tweets e abri-las em uma nova aba
Pela natureza das conversas no Twitter, eu quero abrir várias threads em novas abas mantendo a posição da página original, mas a UI real do Twitter torna isso bem difícil
Poucas coisas me incomodam mais do que isso; se tivesse que citar uma, seria quebrar o histórico de navegação do navegador
Se o voltar funcionasse de forma imediata e fluida, até daria para perdoar, mas na prática você fica esperando o conteúdo recarregar e ainda perde a posição da rolagem
Pior ainda são sites como o Facebook, que forçam o mesmo estado de pop-up de chat em várias abas. Se você fecha em uma aba, fecha nas outras também, sendo que há um motivo para ter várias abas abertas
No momento em que se mexe no comportamento fornecido por padrão, acho que se assume também a responsabilidade por ele
A “funcionalidade” criada não fica restrita ao escopo estreito pretendido pelo designer; ela passa a fazer parte de toda a experiência que o visitante realmente vivencia
Se você muda a lógica do botão de voltar, está mudando o próprio significado que voltar tem naquele site, e também precisa assumir a responsabilidade por usuários confusos e irritados xingarem o “site quebrado” como consequência
É preciso pensar se você está mesmo preparado para se responsabilizar até por comportamentos que variam entre navegadores e sistemas operacionais, como a barra de rolagem
No fim, é como fazer o site falar uma espécie de crioulo, então não é de surpreender se o visitante não entender essa língua ou a “interpretar errado”
Esses recursos não são apenas algo a evitar por gentileza com o visitante; os ganhos parecem limitados e os prejuízos, quase ilimitados
Sites que ignoram esses idiomas ficam mais difíceis de usar porque não falam a linguagem com a qual os usuários estão acostumados
Há também um texto longo sobre a perda dos idiomas de design: https://loeber.substack.com/p/4-bring-back-idiomatic-design
Penso nisso como a appificação dos sites, e isso precisa parar agora
Sites devem voltar para renderização do lado do servidor e acrescentar apenas o JavaScript necessário
Por outro lado, apps web podem lidar um pouco mais com a UX se isso tiver valor para o usuário, mas, enquanto estiverem dentro do navegador, os princípios básicos ainda se aplicam
Apoio apps web como uma plataforma de desenvolvimento acessível a todos fora dos muros das app stores, mas precisamos parar de tratar todo site como se fosse um app
Se é uma página que você quer que apareça nos resultados de mecanismos de busca, então não é um app web, é um site
Accept: text/markdown, mas acho que esse navio já zarpou no momento em que o CSS apareceuFelizmente, graças a coisas como React Server Components, parece que estamos voltando à direção de adicionar JavaScript aos poucos aos sites, o que é bom
É um problema possível, se for dedicado tempo suficiente a ele
Não entendo por que sites de bancos bloqueiam colar
Quando você percebe que não pode colar, já copiou o texto
Digitar à mão aumenta a chance de erro e, se a área de transferência estiver contaminada, no momento em que você percebe a proibição de colar, a cópia já foi feita
Parece que as pessoas imaginam que isso é uma medida de segurança e passam a copiar voluntariamente
Para começo de conversa, não entendo o motivo de bloquear o usuário de colar
Essa “senha” tem míseros 6 dígitos e eu nem posso defini-la. Como se 6 dígitos fossem muito mais seguros do que uma string aleatória de 16 caracteres gerada por um gerenciador de senhas
Ele obriga a entrada por botões em posições aleatórias na página, mas, se o dispositivo já está infectado a ponto de ter teclas e cliques registrados, acho que o atacante também conseguiria simplesmente ler a senha na memória do navegador
Do ponto de vista de segurança, é uma decisão incrivelmente ruim
Tentam várias coisas para atrapalhar os bots e, um dia, desenvolvedores pressionados por um gerente intermediário bloqueiam copiar e colar na página de login, e os bots param por um instante
Alguns dias depois os bots contornam isso, mas a “correção” anterior fica ali com a ideia de que “talvez bloqueie alguns bots”
Assim, umas 10 linhas de JavaScript sobrevivem até a reescrita v6 e, meses ou anos depois do novo começo, a mesma proibição volta a ser incluída
De forma alguma estou falando por experiência própria
https://techcrunch.com/2018/07/03/new-malware-highjacks-your...
Talvez tenham pensado em algo desse tipo
Fico irritado quando desenvolvedores de JS extravagantes escondem complexidade e funcionalidades que ninguém pediu por trás de menus select que parecem HTML nativo
Vejo isso com frequência em entradas de cidade e estado: a cidade é um campo de texto e o estado é um menu suspenso/select
Como sou do Texas, eu digito a cidade, uso Tab para ir ao menu de estado, aperto
t,te passo para o próximo elemento do formulárioSó que hoje em dia muitas vezes é uma entrada de busca textual fantasiada de dropdown, então
t,tvira literalmente uma busca portt, em vez de selecionar Texas depois de TennesseeSó funciona como esperado para quem clica no triângulo com o mouse e rola a lista de estados
Se não está quebrado, não conserte
Historicamente, o
<select>de verdade era muito difícil ou impossível de estilizar ou ter seu comportamento estendido, então muitos apps o reimplementaram por conta própria, geralmente de forma péssimaParece que estão surgindo novos substitutos nativos que podem ser estilizados
Além disso, como era difícil compartilhar código entre apps, frameworks e empresas, só grandes empresas conseguiam criar substitutos de componentes nativos com funcionalidade completa, acessibilidade e customização
Web Components podem resolver isso permitindo colaboração global em componentes comuns de ponta, como
<select>Texto relacionado: https://blogs.windows.com/msedgedev/2022/05/05/styling-selec...
Acho que boa parte do comportamento quebrado de links vem da falta de métodos de nível mais alto para sobrescrever o comportamento padrão de links
Por exemplo, eu não quero anexar um listener de evento de clique só para abrir um link em um modal. O evento de clique é baixo demais em nível, então preciso verificar manualmente as teclas modificadoras
O que eu realmente quero é dizer ao navegador: “se a URL da janela atual estiver prestes a mudar por causa deste elemento âncora, chame esta função em vez disso”
Assim, o usuário pode abrir livremente o link em uma nova janela ou nova aba e, nesse caso, meu código não é executado
Com CSS é a mesma coisa: não quero especificar imagens de cursor para todos os elementos e pseudoclasses. Quero dizer: “onde você usaria o cursor padrão de mão/espera/redimensionamento, use esta imagem customizada”
Assim, mesmo que surjam novos elementos ou UIs, o código fica preparado para o futuro
Algumas APIs de navegador parecem sofrer às vezes do problema XY
Basta registrar
onclickna tag e, no manipulador de evento, cancelar a navegação padrãoSe o usuário desativar JavaScript, o site continua funcionando bem, e comportamentos nativos do navegador, como o menu de link com clique direito ou
Ctrl+clique, também continuam funcionandoSó que é um “truque” bastante obscuro; seria bom se a API do DOM facilitasse mais isso
Acho que esse é um caso de uso da Navigation API
O que precisamos não é de eventos de clique ou ponteiro, mas de um evento visit de nível mais alto
Quando vi o Flutter Gallery pela primeira vez, fiquei surpreso porque tudo parecia quebrado no navegador web: https://gallery.flutter.dev
Acho que o exemplo Reply em especial era assim
Ctrl+cliqueou botão do meio do mouse em links não funcionavam, clique direito também não, seleção e cópia de texto não funcionavam, pela estrutura técnica não dava para inspecionar elementos, e nada acontecia ao tentar dar zoom na páginaLembrando dessa experiência e de algumas implementações de SPA feitas com tecnologias mais tradicionais, este texto me parece correto
Seja na web ou no mobile, nenhum demo de Flutter jamais me convenceu de que oferece uma UX aceitável
Se a promessa do Flutter é ser igual em todos os lugares, este demo deve ser igualmente ruim no desktop
Também gostaria que o comportamento de rolagem não fosse sobrescrito
Não se deve tentar melhorá-lo para deixar a rolagem “mais suave”
No Windows pode parecer aceitável, mas no Mac, ao usar dispositivos de entrada da Apple, o movimento do dedo no trackpad ou no mouse corresponde 1:1 ao movimento do alvo da rolagem
Esse tipo de “melhoria” geralmente dá a sensação de rolar dentro de melaço
Em geral, não se deve tentar melhorar o comportamento padrão do navegador
Uma das coisas que detesto na bagunça da Web moderna é mexer na History API
Quando você entra em uma página clicando em um link que parece interessante em lugares como o HN e começa a rolar, cada cabeçalho ou elemento pouco importante adiciona um item ao histórico
Para voltar ao site original, é preciso apertar Voltar umas um milhão de vezes
Odeio todo mundo que faz isso
Basta usar paginação
Ela permite links, busca, navegação e funciona corretamente com o histórico
O scroll infinito estraga tudo isso sem grande motivo
Na verdade, há aqui dois problemas tão antigos quanto a Web: baixas expectativas e a ausência de padrões ou critérios que definam pessoas ou práticas
Hoje, quando você olha as vagas, todas dizem “Senior Fullstack Engineer”, mas, ao entrar nos detalhes, muitas vezes o que realmente querem é uma combinação de Java ou Python, R, Spring e SQL
Se não é fullstack e mesmo assim escrevem isso, estão desperdiçando o tempo das pessoas e sinalizando ao público que não entendem ou não se importam com tecnologia
Em programação, isso é chamado de “problema X/Y”. É um antipadrão em que se deveria resolver o estado final desejado X, mas, em vez disso, fala-se apenas da abordagem Y que se quer adotar
Por isso, empregadores recebem 500 currículos para uma vaga e ainda assim sentem que ninguém é adequado
O ponto de partida deveria ser o objetivo: “Estamos contratando para criar este tipo de app cliente/servidor; a pessoa candidata deverá escrever e dar suporte aos recursos X, Y e Z, e as restrições são A, B e C”
O motivo pelo qual as empresas costumam não conseguir fazer isso é que, em geral, elas não sabem o que realmente fazem e já carregam tecnologias quebradas depois de passarem por vários caminhos errados. É por isso que se chama dívida técnica
Com objetivos claros assim, na entrevista tanto a empresa quanto a pessoa candidata sabem o que devem verificar e conseguem filtrar uma à outra de forma adequada. Caso contrário, vira um processo horrível que parece uma mistura de encontro às cegas com game show
Por exemplo, a vaga pode especificar que está contratando para criar uma aplicação de conferência de mídia altamente distribuída, que a pessoa desenvolvedora escreverá TypeScript, conectará dados de stream de sockets por meio de pipes, trabalhará tanto no navegador quanto no servidor e escreverá automação de testes
As restrições operacionais incluem conformidade com WCAG AA, uma checklist de conformidade de privacidade criada pelo departamento jurídico e considerações de desempenho voltadas à velocidade de execução e à latência de rede; a pessoa candidata ideal deve demonstrar na entrevista soluções para latência de rede, lógica de aplicações no navegador e gerenciamento de estado de dados em streaming