Para asegurar que nuestro sitio web sea más inclusivo, es crucial que los modales sean accesibles para personas que utilizan el teclado y lectores de pantalla. Imagina que abres un modal y el foco va a elementos en el fondo, lo cual es confuso. A continuación, te mostraremos cómo asegurar que el primer elemento de un modal reciba el enfoque inmediatamente al abrirlo.
¿Cómo enfocar el primer elemento de un modal?
Identificación del primer elemento: Primero, dentro del HTML, identifica el primer elemento del modal. Añade un atributo id al elemento, por ejemplo id="modalHeader".
Establecer tabindex: Coloca el atributo tabindex="0" a ese elemento. Esto asegura que el navegador lo pueda enfocar.
Modificar JavaScript para enfocar: En la función que abre el modal, agrega una línea que enfoque el primer elemento del modal utilizando el método focus(). Esto se ubica inmediatamente después de abrir el modal.
document.getElementById('modalHeader').focus();
¿Cómo darle estilo al enfoque del modal?
Para mejorar la experiencia visual, es importante coordinar los estilos del enfoque usando CSS:
Define una clase en CSS para el elemento enfocado que aplique un borde llamativo o sombreado.
Usa colores y estilos que ya estén integrados en el sitio para mantener la coherencia visual.
#modalHeader:focus{outline:2px solid #000;}
¿Cómo cerrar el modal con la tecla 'Esc'?
Cerrar el modal al presionar 'Esc' es un patrón de diseño común que mejora la experiencia del usuario:
Función para cerrar con 'Esc': Añade una escucha de eventos en el documento para captar la tecla presionada.
document.addEventListener('keydown',function(event){if(event.keyCode===27){// 27 es el código de la tecla 'Esc'closeModal();// Función que cierra el modal}});
Integración de la función: Ubica esta función dentro de tu script, preferiblemente después de todas las variables inicializadas pero antes del cierre del modal.
¿Cómo probamos la accesibilidad?
Para verificar que estos cambios funcionen correctamente:
Prueba de teclado: Usa únicamente el teclado para navegar y abrir el modal, asegurándote de que el enfoque vaya al primer elemento y que la tecla 'Esc' lo cierre.
Lector de pantalla: Utiliza un lector de pantalla para asegurarte de que todos los elementos del modal se describan apropiadamente.
Estos ajustes garantizan una experiencia más accesible para todos los usuarios, mejorando la navegabilidad de tu sitio web. Al continuar desarrollando, recuerda la importancia de la accesibilidad y busca siempre maneras de integrar prácticas inclusivas en tu diseño.
Super el curso, un apunte que quiero hacer respecto al Modal. No todos los elementos, como el texto, deben tener foco. Al iniciar el curso fue una de las cosas que se mencionó. Creo que el foco al abrir el modal debería ir directo al boton de cerrar ya que este elemento si tiene interacción. Ahora bien como manejar este caso para el voiceover, yo hice un ejercicio similar.
<dialog aria-label="Este es un dialogo" aria-describedby="description" open><p id="description"> Mi descripción
</p><button>Mi botón</button></dialog>
De esta manera usando el elemento dialog se deberia hacer foco al botón cuando se abre el modal pero debería leer la descripción. Si no lo hace con Js se puede enfocar el dialog y el tab pasaría al botón.
Ahora bien, <dialog> api no es soportado por algunos navegadores. Para este caso se puede utlizar el aria-role,.
<div role="dialog" aria-labelledby="dialog1Title" aria-describedby="dialog1Desc"><h2 id="dialog1Title">Your personal details were successfully updated</h2><p id="dialog1Desc">You can change your details at any time in the user account section.</p><button>Close</button></div>
Por último, si se tiene problemas con el voiceover que es frecuente cuando se trata de hacer focus a un elemento que se requiere leer como los elementos p, que no son interactuables, se puede hacer uso del tabindex=-1 .
<p id="dialog1Desc" tabindex="-1">You can change your details at any time in the user account section.</p>
De esta manera programaticamente se puede enviar el foco a ese elemento haciendo que el voiceover lo lea para luego al presionar tab el elemento no es interactuable y tiene sentido, como mencione al inicio no todos los elementos deben tener foco.
El focus() se envía a un elemento cuando se enfoca. Este evento es implícitamente aplicable a un conjunto limitado de elementos, tales como elementos de formulario ( <input>, <select>, etc.) y enlaces ( <a href>). En versiones recientes del navegador, el evento se puede extender para incluir todos los tipos de elementos al establecer explícitamente la tabindexpropiedad del elemento . Un elemento puede enfocarse mediante comandos del teclado, como la tecla Tabulador, o haciendo clic con el mouse sobre el elemento.
Muy importante tener en cuena lo del tabindex, por eso no me estaba funcionando una prueba que estaba haciendo
Otra cosa que faltaría es que cuando el modal se abre y se va enfocando los elementos, que el foco no se salga del modal, es decir, despues de enfocar el último elemento, que se vaya al primero.
También, cuando se cierre el modal, que el foco regrese al último elemento enfocado antes de que el modal se abriera.
No lo habia pensado, pero si, la idea es que cuando el modal está abierto el foco se mantenga dentro de él.
.
Es algo que voy a desarrollar para un proyecto personal que estoy haciendi
podria ser interesante implementar algo como reto o poifyll, pero actualmente ya existe una forma de hacerlo realmente muy facil de hacer
en HTML existe una etiqueta llamada dialog, y con javascript utilizar una propiedad para abrir el modal que se llama .showModal()
Actualmente html tiene una nueva etiqueta para el uso de los modales
el cual es <dialog>
el cual tiene dos propiedades para abrir que son show() y showModal() y para cerrarlo con close()
la diferencia entre show() y showModal() es que en show() abre como un cuadro de dialogo justo por debajo de donde es llamado y te permite seguir interactuar con el resto de la pagina y showModal() se abre como un modal en todo el centro de la pantalla y con un background difuminado(por defecto sin uso de css) y no te permite interactuar con el resto de la pagina
Creo que algo mejor que forzar un H1 o cualquier elemento a ser focuseable, en el caso del modal, sería mejor buscar los elementos focuseables que haya disponibles, y hacerle foco a ese.
Pero aquí me dejas con una duda. ¿No se hace "focuseable" (Inciso: me causa gracia este nuevo anglisismo jeje) para que el lector lo vea? Es decir que no leería lo que dice el texto. Qué es lo que se espera ¿O me equivoco?
Genial el aporte de keycode :o
Viendo todo esto creo que aún me falta aplicar javascript correctamente en mis proyectos, esto me motiva a seguir mejorando
Otra manera de cerrar el modal (es lo mismo pero con el operador ternario)
/*Cierra modal con tecla Esc*/functionlistenForEsc(e){ e.keyCode===27?closeModal(e):null}
Llevo un tiempo pensando:
-Estamos adaptando este sitio para que personas con discapacidad visual naveguen como lo haría cualquier otra persona.
-Personas con discapacidad visual consumirán este contenido con lectores.
-Ese modal solo tiene una imagen.
¿No deberíamos construir un sitio que sea accesible en lugar de disfrazar un sitio de accesible?
Creo que el contenido del curso es muy bueno y se nota que la profe es durísima en la materia, pero el mensaje al menos para este video es: "tu ponle un lector y ya es consumible para todos"
La accesibilidad es prácticamente adaptar un sitio web funcional para que más personas puedan navegarlo. No entiendo a qué te refieres con "disfrazarlo" de accesible, pero la accesibilidad necesita que le pongas fácil la navegación a los usuarios con discapacidades.
Sería una pérdida de tiempo construir un sitio aparte que sea solamente dedicado para personas con discapacidades, es decir, ¿planteas tener dos sitios?, ¿uno visual y bonito para personas sin discapacidades y otro adaptado a accesibilidad para personas con discapacidades?
Es mejor adaptar un sitio visual ya construido para que funcione para ambos, no se trata de "disfrazarlo", se trata de mejorarle su accesibilidad.
Creo que no me entendiste, la cosa es:
¿cuan accesible es un elemento gráfico que se describe a sí mismo como: "Uno de mis proyectos"?
No digo que los sitios deban ser o solo bonitos o solo para personas con discapacidades (si así fuese no serían solo 2, sería uno por discapacidad) sino que hay que diseñar los elementos para que se puedan consumir por la mayor cantidad de personas que se pueda.
La idea aquí es: un elemento que se lee como "mi proyecto" no me dice nada del proyecto, así pues re plantear ese elemento me parece mejor opción que simplemente ponerle una etiqueta y decir que ya es accesible, que fue lo que se hizo en clase(a eso me refiero con disfrazar, parece accesible pero, ¿realmente lo es?).
Finalmente, creo que es correcto lo que dices de mejorar la accesibilidad de páginas ya creadas, pero la mentalidad debería ser: hacer una página accesible en lugar de hacerla y adaptarla luego, similar al mobile first en el caso de diseño responsive.
🤯 Esta muy genial esto. Toca repasar JS pero 😅
De pronto algunos se sienten perdidos pero tranquilos, para hacer esto ya se debería tener conocimientos básicos o medianos de html o programación, algunos venimos en orden con los cursos de UI UX y por eso este curso nos tomo con tanto drama creo, yo si tengo conocimientos de html pero super básicos, y hace mucho no practicaba, por eso este curso me ha gustado ya que me empapo de nuevo con estos conocimientos, además de Java si no he manejado casi nadala verdad, alguien en las mismas por aca?
En esta clase se mejora la accesibilidad de un modal para personas que usan teclado y lectores de pantalla. El problema inicial es que cuando se abre el modal y se navega con la tecla Tab, el foco se queda en elementos detrás del modal. Esto confunde al usuario y hace que el lector de pantalla no empiece en el lugar correcto.
Para solucionarlo, en el HTML se le agrega un id al primer elemento del modal (por ejemplo, el header) y se le añade tabindex="0". Esto permite que el elemento pueda recibir foco y entrar en el orden secuencial del teclado.
Luego, en JavaScript, dentro de la función que abre el modal, se usa document.getElementById("modal-header") y se llama el método .focus(). Así, cuando el modal se abre, el foco se mueve automáticamente al primer elemento del modal, asegurando que la navegación comience dentro de él.
Después se mejoran los estilos visuales del foco en CSS usando la pseudo-clase :focus. Se agregan bordes sólidos y colores visibles para que el usuario pueda identificar claramente qué elemento está seleccionado. Esto se aplica tanto al header como a los botones del modal.
También se prueba el comportamiento con un lector de pantalla para confirmar que el modal ahora es más accesible y que el foco funciona correctamente.
Finalmente, se añade una mejora común en experiencia de usuario: cerrar el modal con la tecla Escape. Para eso, se agrega un event listener al document.body que escucha el evento keyup. Cuando se detecta que la tecla presionada es Escape, se ejecuta la función que cierra el modal.
En conclusión, la clase enseña a controlar el foco al abrir un modal, usar tabindex correctamente, aplicar focus con JavaScript, mejorar los estilos de enfoque y permitir cerrar el modal con Escape para hacerlo más accesible y usable.
keycode.info no aparece
Siempre me he preguntado porque usan el keycode en lugar de simplemente el key, keycode es mucho mas dificil de recordar y por tanto suele ser confuso de usar al trabajar con teclas en cambio key es mas facil, ¿acaso keycode tiene ventajas de rendimiento sobre key?
muy buen curso
La clase pasada dí una solución para el reto de poner la imagen del modal que hacías click pero me equivoque dado que no funcionaba para teclado, este es el correcto:
functionImgClick(e){// VALIDAR SI FUE CON EL TECLADO O CON CLICKif(e.clientX===0&& e.clientY===0){// TECLADOletIMG= e.srcElement.classList[0];document.querySelector("#img-modal").setAttribute("src",`./images/${IMG}.png`);}else{// CLICKletIMG= e.srcElement.src;document.querySelector("#img-modal").setAttribute("src",IMG);}openModal();}
Y lo visto hoy en clase podemos verificar la tecla así o simplemente con el nombre:
Las teclas traen un key y un code, el key sirve mucho para estos botones usados regularmente, por ejemplo en este paso podriamos usar la comparación logica con e.key === 'Escape'