Usa un botón
(gomakethings.com)- En una interfaz web, usar
en lugar dees la opción correcta tanto en accesibilidad como en funcionalidad - `` no es reconocido por los lectores de pantalla como un elemento interactivo y tampoco responde al foco del teclado ni a las teclas
EnterySpacebar - Incluso si se agregan atributos como
[role="button"]o[tabindex="0"], siguen existiendo problemas con el orden del foco y el manejo de eventos de teclado - Para resolver esos problemas, agregar varios event listeners y condicionales introduce una complejidad innecesaria
- `` ya incluye por defecto accesibilidad, foco y manejo de entrada por teclado, por lo que es una solución simple y estándar
Enfoque incorrecto: crear un botón con ``
- Entre usuarios de React o HTMX, es común ver casos donde se implementan interacciones como abrir un modal con algo como ``
- Código de ejemplo:
Open Modal
- Código de ejemplo:
- Problemas de este enfoque
- Los lectores de pantalla no reconocen ese elemento como interactivo
- No se puede mover el foco con el teclado
- Solo funciona el evento
click, y no responde aEnterni aSpacebar
Límites de los intentos de “arreglar” la accesibilidad
- Agregar el atributo
[role="button"]resuelve el problema de reconocimiento por parte de los lectores de pantalla, pero los problemas de enfoque y del manejo de entrada por teclado siguen ahí - Se puede hacer que reciba foco agregando
[tabindex="0"], pero existe el riesgo de desordenar el orden del foco o provocar movimientos inesperados - Para manejar la entrada por teclado, hay que registrar un evento
keydownde forma global endocument, detectar la teclaEntero' '(espacio) y buscar el elemento enfocado para ejecutarlodocument.addEventListener('keydown', (event) => { if (event.key !== 'Enter' && event.key !== ' ') return; const notRealBtn = document.activeElement.closest('[onclick]'); if (!notRealBtn) return; // 실행 코드 }); - Al final, terminas reimplementando de forma compleja lo que `` ya ofrece por defecto
Funciones integradas que ofrece ``
- El elemento `` soporta automáticamente lo siguiente
- rol implícito (
[role="button"]) - capacidad de recibir foco automáticamente
- cuando tiene el foco, dispara el evento
clickal presionarEnterySpacebar
- rol implícito (
- Para implementar el mismo comportamiento con
, **se necesitan varios atributos y scripts**, pero conse resuelve en una sola líneaOpen Modal
Conclusión: la simplicidad es lo mejor
- `` es la forma más simple de cumplir con los estándares de accesibilidad y al mismo tiempo reducir la cantidad de código
- Usar elementos HTML estándar sin agregar atributos ni manejar eventos innecesarios favorece el mantenimiento y la eficiencia
- Con el mensaje de que “cuanto más flojo sea el desarrollador, más debería usar el elemento correcto”, se enfatiza la importancia de adquirir el hábito de evitar complejidad innecesaria y aprovechar las funciones integradas
7 comentarios
Es un artículo muy bueno. La idea principal del texto se puede resumir como: “usemos las etiquetas HTML con significado”. Si damos eventos de clic con una etiqueta
div(o cualquier otra), creo que no hemos cambiado en nada con respecto a la época en que se armaban los layouts con etiquetastable.Claro, meter atributos
aria-*puede dejarlo más claro, pero ya que vas a pasar por todo ese trabajo, mejor usa la etiqueta adecuada jajajajaQué recuerdos jajaja
background, border, outline, appearance, -webkit-appearance, cursor
Hay demasiadas hojas de estilo predeterminadas que hay que sobrescribir, snif snif
Por eso existe el CSS Reset.
En los sitios web de las instituciones públicas de nuestro país parece que usan mucho ``...
Comentarios de Hacker News
Una de mis quejas es que los sitios web implementan la navegación con manejadores
onclicksi simplemente usaran la etiqueta ``, abrir en una pestaña nueva, la integración con herramientas de accesibilidad, el menú de clic derecho y todo lo demás funcionarían automáticamente si es navegación, deberían usar enlaces en lugar de una sopa de JavaScriptonClickhasta los elementos que en la práctica eran enlaces estaban manejados por handlers de clic, y no lo entiendoLa mayoría de los botones debería declarar
type="button"el valor predeterminado essubmit, así que si están dentro de un formulario se envían automáticamente supongo que algunos desarrolladores no saben esto y por eso usan ``, yes distinto, puedes evitar el problema de `type="submit"` unempieza vacío, así que puedes agregar solo la funcionalidad que necesitas y luego modificarla con facilidad en cambio, con `` tienes que leer la documentación para entender su comportamiento por defecto al final, es una cuestión de control explícito vs funcionalidad incorporadaMe gustaría que el artículo ampliara la idea de “usemos tal cual los elementos HTML creados para ese propósito” muchos desarrolladores de SPA no entienden bien la semántica de los elementos HTML y reinventan la rueda cada vez
Hoy existe toda una generación que anda picándole a la pantalla por todos lados para encontrar qué área se puede pulsar hace 10 años alguien decidió que arrastrar enlaces era más importante que seleccionar texto, y ahora seleccionar texto es casi imposible para arreglar eso tal vez habría que hacer un fork del navegador
La hoja de estilo predeterminada de Chrome tiene
button {align-items: flex-start}, y por eso me perdí mucho tiempo con un bug de tamaño en flexbox aun así, trato de usar los elementos HTML correctos siempre que puedo, aunque en proyectos personales pequeños a veces `` resulta más cómodoappearance: nonees útil para resetear el estilo de los botones yo hice una clase.unbuttonifypara que se comporten como botón pero tengan otra aparienciaSiempre que se pueda, hay que usar los elementos de acuerdo con su propósito original
Tengo dos quejas sobre los botones una es que de todos modos hay que volver a darles estilo, y la otra es la advertencia de que no se pueden anidar botones en la práctica, esto se encuentra con bastante frecuencia
Los LLM generan con frecuencia este tipo de patrones incorrectos muchas veces ignoran las funciones predeterminadas del navegador e implementan soluciones complicadas yo suelo pedirle a Claude que simplifique ese tipo de código en TypeScript también tienden a hacer rara la forma de manejar errores
Yo procuro usar botones por defecto siempre que sea posible eso sí, si en realidad debe comportarse como un enlace, uso la etiqueta ``
Me preguntaba por qué alguien querría usar ``