- Apresenta formas modernas de substituir recursos dependentes de JS por HTML/CSS na web
- Usa elementos padrão como
details·summary, datalist e popover para implementar acordeão, autocomplete, modal e navegação off-screen
- Essa abordagem reduz download, avaliação e uso de memória, melhorando o desempenho e a experiência do usuário
- Para cada recurso, são fornecidos exemplos no CodePen, documentação do MDN e informações de compatibilidade entre navegadores
- O JS deve ser usado apenas onde for realmente necessário, com aproveitamento ativo dos recursos avançados de HTML/CSS
Substituindo recursos de JS com HTML e CSS
- Por muito tempo, o JavaScript ficou responsável por recursos que não podiam ser implementados com HTML e CSS
- Porém, com a expansão dos recursos de HTML e CSS, algumas funcionalidades de JS agora podem ser substituídas por tecnologias web nativas
- Como o JS precisa ser baixado, descompactado, avaliado e mantido na memória, é mais eficiente migrar para HTML/CSS tudo o que for possível
- A proposta é deixar o JS focado na lógica complexa e delegar o controle de UI mais simples ao HTML/CSS
Acordeão / painel de conteúdo expansível
- Com os elementos
details e summary, é possível criar um acordeão sem JS
- O conteúdo pode ser aberto e fechado com clique, e o estado padrão pode ser definido com o atributo
open
- Se usar o mesmo atributo
name, apenas um painel permanece aberto
- Também é possível estilizar com CSS ou controlar abertura/fechamento com JS
- Materiais relacionados: documentação do MDN sobre
details, exemplo no CodePen e tabela de compatibilidade entre navegadores
Campo de entrada com sugestões de autocomplete
- A combinação de
input e datalist permite criar um dropdown com filtragem automática
- Ao digitar, a lista de sugestões é filtrada automaticamente
- Além de texto, há suporte a vários tipos de entrada como
number, time etc.
- O Firefox atualmente suporta apenas entradas baseadas em texto, e há limitações de acessibilidade no mobile
- Materiais relacionados: documentação do MDN sobre
datalist, tutorial do SitePoint e tabela de compatibilidade entre navegadores
Modal / popover
- Os atributos
popover e popovertarget permitem criar modal e popover sem JS
- Há três modos:
auto, hint e manual
auto fecha ao clicar fora ou pressionar ESC, enquanto manual só fecha manualmente
- Firefox e iOS não oferecem suporte ao modo
hint
- Materiais relacionados: documentação do MDN sobre
popover, blog do Chrome, exemplo no CodePen e vídeo sobre acessibilidade
Navegação / conteúdo off-screen
- É possível implementar um menu de navegação off-screen usando o recurso
popover
- O elemento
nav dá significado semântico, e o CSS translate move o conteúdo para dentro e para fora da tela
- Fecha ao clicar fora, e
popover="manual" permite configurar fechamento manual
- O pseudo-elemento
::backdrop pode deixar o fundo semitransparente
- Materiais relacionados: API Popover do MDN, blog do Chrome e exemplo no CodePen
Conclusão
- Reconhecendo o poder do JS, ele deve ser usado apenas onde for necessário
- Com os avanços recentes de HTML/CSS, surgiram muitas alternativas sem JS
- Mais exemplos podem ser vistos no post do autor: “Replace JS with No-JS or Lo-JS Options”
- Reforça a melhoria da experiência do usuário por meio da minimização de JS e otimização de desempenho
5 comentários
Esse tipo de tentativa às vezes me faz refletir se estou fazendo overengineering, mas, do ponto de vista do trabalho prático com requisitos robustos, é quase um número de força.
> É possível implementar um acordeão sem JS com os elementos ** e **
Parece que faltou um pedaço do conteúdo.
Fiz a correção~!
Há limitações bem claras e, no momento em que a IA foi ativada... será que há necessidade de fazer esse tipo de refatoração?
Isso levou em consideração pontos como o bloqueio de conteúdo em JS?
Comentários no Hacker News
Se os exemplos alternativos em HTML tivessem sido colocados diretamente na página, em vez de links para o CodePen, teria sido bem mais convincente
<details>/<summary>é realmente enormeDá para fazer quase tudo com elas, mas a maioria das bibliotecas de componentes ignora isso
Não precisa nem de atributos aria e a acessibilidade já vem embutida
<details>também funciona em sites baseados em Markdown, como o GitHub. Dá para recolher logs longos e postar tudo de forma mais limpaAo escrever o livro “You Don’t Need JavaScript”, a percepção foi que o JS muitas vezes complementa recursos já existentes da plataforma, em vez de adicionar algo realmente novo
<input>e<datalist>deixam a desejar no uso realOs usuários esperam tolerância a erros de digitação, texto auxiliar e boa UX no mobile, e o datalist não atende a isso
Quase não ligam para uso semântico de HTML nem para acessibilidade
Num texto que diz “vamos fazer só com HTML”, depender de um serviço externo soa contraditório
Está no stage 3 do WHATWG e talvez possa substituir a implementação pesadelo dos dropdowns em JS
Veja este post do blog do Chrome
Já tentei alternativas como HTMX e Phoenix LiveView, mas elas não são solução completa
No fim, parece mais realista aceitar o JS moderno
<marquee>era adequada para implementar rolagem horizontal em sites de compras, mas hoje fazem isso à força com JS. Seria bom se o HTML desse suporte nativo a mais padrões de UIWebapps complexos precisam de JS, mas ainda existe muita coisa que pode ser feita só com HTML
Mas hoje o JS virou uma ferramenta central para coleta de dados e rastreamento publicitário
Fico me perguntando se, sem JS, as big techs conseguiriam implementar o mesmo nível de vigilância e serviços de anúncios
No fim, a antipatia contra JS não vem só de uma questão técnica, mas também da desconfiança em relação ao ecossistema de publicidade