- Presenta métodos modernos para reemplazar funciones dependientes de JS en la web con HTML/CSS
- Usa elementos estándar como
details·summary, datalist y popover para implementar acordeones, autocompletado, modales y navegación fuera de pantalla
- Este enfoque reduce la descarga, la evaluación y el uso de memoria, mejorando el rendimiento y la experiencia de usuario
- Para cada función se incluyen ejemplos en CodePen, documentación de MDN e información de compatibilidad de navegadores
- JS debe usarse solo donde sea realmente necesario, y hay que aprovechar activamente las funciones avanzadas de HTML/CSS
Reemplazar funciones de JS con HTML y CSS
- Durante mucho tiempo, JavaScript se ha encargado de funciones que no podían implementarse con HTML y CSS
- Sin embargo, a medida que HTML y CSS han ampliado sus capacidades, ahora es posible reemplazar parte de las funciones de JS con tecnologías web nativas
- Como JS requiere descarga, descompresión, evaluación y mantenimiento en memoria, es más eficiente trasladar a HTML/CSS las funciones que sea posible
- Se propone que JS se concentre en la lógica compleja y que el control simple de la UI se delegue a HTML/CSS
Acordeones / paneles de contenido expandible
- Con los elementos
details y summary es posible implementar acordeones sin JS
- El contenido puede abrirse y cerrarse con un clic, y el estado inicial se define con el atributo
open
- Si se usa el mismo atributo
name, solo un panel permanecerá abierto
- También es posible aplicar estilos con CSS o controlar la apertura/cierre con JS
- Material relacionado: documentación de MDN sobre
details, ejemplo en CodePen y tabla de compatibilidad de navegadores
Campo de entrada con sugerencias de autocompletado
- La combinación de
input y datalist permite implementar un desplegable con filtrado automático
- Al escribir, la lista de sugerencias se filtra automáticamente
- Además de texto, admite varios tipos de entrada como
number, time, etc.
- Firefox por ahora solo admite entradas basadas en texto, y existen limitaciones de accesibilidad en móviles
- Material relacionado: documentación de MDN sobre
datalist, tutorial de SitePoint y tabla de compatibilidad de navegadores
Modal / popover
- Los atributos
popover y popovertarget permiten implementar modales y popovers sin JS
- Ofrecen tres modos:
auto, hint y manual
auto se cierra al hacer clic fuera o con ESC, mientras que manual solo se cierra manualmente
- Firefox e iOS no son compatibles con el modo
hint
- Material relacionado: documentación de MDN sobre
popover, blog de Chrome, ejemplo en CodePen y video sobre accesibilidad
Navegación / contenido fuera de pantalla
- La función
popover también permite implementar un menú de navegación fuera de pantalla
- Se aporta semántica con el elemento
nav, y con CSS translate puede moverse dentro y fuera de la pantalla
- Se cierra al hacer clic fuera, y con
popover="manual" puede configurarse para cierre manual
- El pseudoelemento
::backdrop permite aplicar un fondo semitransparente
- Material relacionado: MDN Popover API, blog de Chrome y ejemplo en CodePen
Conclusión
- Aunque se reconoce la potencia de JS, debe usarse solo donde haga falta
- Gracias a los avances recientes de HTML/CSS, han surgido muchas alternativas sin JS
- Se pueden ver más ejemplos en la entrada del blog del autor “Replace JS with No-JS or Lo-JS Options”
- Se enfatiza la mejora de la experiencia de usuario mediante la minimización de JS y la optimización del rendimiento
5 comentarios
Este tipo de intentos a veces me sirven para reflexionar sobre si estoy haciendo overengineering, pero desde la perspectiva del trabajo real con requisitos complejos, se parece más a un acto de fuerza.
> Es posible implementar un acordeón sin JS con los elementos ** y **
Siento que falta una parte del contenido.
¡Ya lo dejé corregido~!
Está claro que tiene limitaciones, y una vez que la IA se activa... ¿realmente es necesario hacer este tipo de refactorización? ¿Se consideró lo relacionado con bloquear contenido JS?
Comentarios en Hacker News
En vez de enlazar a CodePen, habría sido mucho más convincente incluir directamente en la página los ejemplos de reemplazo con HTML
<details>/<summary>es realmente enormeSe puede hacer casi de todo con ellas, pero la mayoría de las librerías de componentes las ignoran
No hacen falta atributos aria y la accesibilidad viene incluida por defecto
detailscerrados, pero ahora eso se puede resolver con el atributo hidden="until-found" y eventosdetailsse abra automáticamente<details>también funciona en sitios basados en Markdown como GitHub. Puedes plegar logs largos y publicarlos de forma más limpiaAl escribir el libro “You Don’t Need JavaScript”, sentí que JS muchas veces no agrega funciones nuevas, sino que complementa capacidades existentes de la plataforma
<input>y<datalist>se quedan cortos para uso realLos usuarios esperan tolerancia a errores tipográficos, texto de apoyo y una buena UX móvil, pero
datalistno cumple con esodatalistno se puede separar el texto mostrado del valor real (value)selectno tiene búsquedaCasi no se fijan en el uso semántico de HTML ni en accesibilidad
Es un artículo sobre “hagámoslo solo con HTML”, así que depender de un servicio externo se siente contradictorio
Está en WHATWG stage 3 y podría reemplazar las implementaciones de pesadilla de dropdowns hechas con JS
Ver la entrada del blog de Chrome
También probé alternativas como HTMX o Phoenix LiveView, pero no son una solución completa
Al final siento que aceptar el JS moderno es lo más realista
<marquee>servía muy bien para implementar scroll horizontal en tiendas en línea, y ahora lo fuerzan con JS. Ojalá HTML soportara por sí mismo más patrones de UILas webapps complejas necesitan JS, pero hay muchas cosas que sí se pueden hacer solo con HTML
Pero JS ya se convirtió en la herramienta clave para recolección de datos y seguimiento publicitario
Me pregunto si, sin JS, las big tech podrían implementar el mismo nivel de vigilancia y servicios publicitarios
Al final, el rechazo a JS no nace solo de un problema técnico, sino de la desconfianza hacia el ecosistema publicitario