
* Traducido Traducido el apartado "Accesibilidad en Angular". Pendiente de revisión. * Update aio/content/guide/accessibility.md Co-authored-by: Pato <11162114+devpato@users.noreply.github.com> * Update aio/content/guide/accessibility.md Co-authored-by: Pato <11162114+devpato@users.noreply.github.com> * Update aio/content/guide/accessibility.md Co-authored-by: Pato <11162114+devpato@users.noreply.github.com> * Update aio/content/guide/accessibility.md Co-authored-by: Pato <11162114+devpato@users.noreply.github.com> Co-authored-by: Pato <11162114+devpato@users.noreply.github.com>
8.8 KiB
Accesibilidad en Angular
Hay una amplia variedad de personas que utilizan la web, algunas de ellas con discapacidad visual o motora. Existen diferentes tecnologías de apoyo que hacen que sea mucho más fácil para estos grupos interactuar con aplicaciones de software basadas en la web. Además, diseñar una aplicación para que sea más accesible, normalmente mejora la experiencia de usuario en general.
Para una introducción en profundidad a los problemas y técnicas sobre el diseño de aplicaciones accesibles, puede consultar la sección de Accesibilidad de Google Fundamentos Web.
Esta página habla de las mejores prácticas para diseñar aplicaciones en Angular que funcionan bien para todos los usuarios, incluyendo aquéllos que necesitan tecnologías de apoyo.
Para ver la aplicación de ejemplo que describe esta página, ir a .
Atributos de accesibilidad
Crear una web accesible a menudo implica establecer los atributos ARIA para proporcionar la semántica que, de otro modo, podría no estar presente. Usa la plantilla de sintaxis del [enlace de atributos](attribute binding) (guide/attribute-binding) para controlar los valores de los atributos relacionados con la accesibilidad.
Para enlazar los atributos ARIA en Angular, debes usar el prefijo attr.
, ya que la especificación ARIA
depende de los atributos HTML y no de las propiedades de los elementos del DOM.
<!-- Use attr. when binding to an ARIA attribute -->
<button [attr.aria-label]="myActionLabel">...</button>
Observa que esta sintaxis solo es necesaria para los enlaces de atributos. Los atributos ARIA estáticos no requieren de ninguna sintaxis adicional.
<!-- Static ARIA attributes require no extra syntax -->
<button aria-label="Save document">...</button>
NOTA:
Por convenio, los atributos HTML se escriben en minúscula (tabindex
), mientras que para las propiedades se usa camelCase (tabIndex
).
Consulta la guía Sintaxis del enlace para saber más sobre las diferencias entre atributos y propiedades.
Componentes del interfaz de usuario de Angular
La librería Angular Material, que es mantenida por el equipo Angular, es un conjunto de componentes reutilizables para la interfaz de usuario que pretende ser totalmente accesible.
El Kit de Desarrollo de Componentes (CDK) (Component Development Kit) incluye el paquete a11y
que proporciona herramientas para dar soporte a distintos aspectos de la accesibilidad.
Por ejemplo:
-
LiveAnnouncer
se utiliza para comunicar mensajes a los usuarios de lectores de pantalla que usan la regionaria-live
. Se puede consultar la documentación de la W3C para obtener más información sobre regiones aria-live. -
La directiva
cdkTrapFocus
limita el foco de la tecla de tabulación para que se quede dentro de un elemento. Úsala para crear una experiencia accesible en componentes como las ventanas modales, donde el foco debe estar limitado.
Para obtener más detalles sobre esta y otras herramientas, consulta el resumen de accesibilidad del Angular CDK.
Aumento de elementos nativos
Los elementos HTML nativos capturan una serie de patrones de interacción estándar que son importantes para la accesibilidad. Al crear componentes de Angular, deberías reutilizar estos elementos nativos directamente cuando sea posible, en lugar de volver a implementar comportamientos bien soportados.
Por ejemplo, en lugar de crear un elemento personalizado para un nuevo tipo de botón, puedes crear un componente que use un selector de atributos con un elemento nativo <button>
.
Esto se aplica sobre todo a <button>
y <a>
, pero se puede usar con muchos otros tipos de elementos.
You can see examples of this pattern in Angular Material: MatButton
, MatTabNav
, MatTable
.
Uso de contenedores para elementos nativos
A veces, para usar el elemento nativo apropiado hace falta un contenedor.
Por ejemplo, el elemento nativo <input>
no puede tener hijos, por lo que cualquier componente de entrada de texto personalizado necesita envolver un <input>
con elementos adicionales.
Si bien puedes incluir el <input>
en la plantilla de tu componente personalizado,
esto hace que sea imposible para los usuarios de dicho componente establecer propiedades y atributos arbitrarios para el elemento de entrada.
En su lugar, puedes crear un componente contenedor que utilice la proyección de contenido para incluir el control nativo en el
API del componente.
Puedes consultar MatFormField
para ver un ejemplo de este patrón.
Caso práctico: creación de una barra de progreso personalizada
El siguiente ejemplo muestra cómo hacer que una barra de progreso simple sea accesible utilizando el host binding para controlar los atributos relacionados con la accesibilidad.
-
El componente define un elemento habilitado para accesibilidad con el atributo HTML estándar
role
y los atributos ARIA. El atributo ARIAaria-valuenow
está vinculado a la entrada del usuario. -
En la plantilla, el atributo
aria-label
asegura que el control sea accesible para los lectores de pantalla.
Enrutamiento y gestión del foco
El seguimiento y el control del foco en una interfaz de usuario son aspectos muy importantes en el diseño si queremos tener en cuenta la accesibilidad. Al usar el enrutamiento de Angular, debes decidir dónde va el foco de la página al navegar.
Para evitar depender únicamente de señales visuales, te debes asegurar de que el código de enrutamiento actualiza el foco después de la navegación de la página.
Usa el evento NavigationEnd
del servicio Router
para saber cuándo actualizar el foco.
El siguiente ejemplo muestra cómo encontrar y poner el foco en el contenido principal de la cabecera (el elemento #main-content-header
) dentro del DOM después de la navegación.
The following example shows how to find and focus the main content header in the DOM after navigation.
router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe(() => {
const mainHeader = document.querySelector('#main-content-header')
if (mainHeader) {
mainHeader.focus();
}
});
En una aplicación real, el elemento que recibe el foco dependerá de la estructura específica y del diseño que tenga tu aplicación.
El elemento enfocado debe colocar a los usuarios en una posición en la que pasen inmediatamente al contenido principal que acaba de ser visualizado.
Debe evitar situaciones en las que el foco vuelva al elemento body
después de un cambio de ruta.
Recursos adicionales
-
Codelyzer provides linting rules that can help you make sure your code meets accessibility standards.
Libros
-
"A Web for Everyone: Designing Accessible User Experiences", Sarah Horton and Whitney Quesenbery
-
"Inclusive Design Patterns", Heydon Pickering
Más sobre accesibilidad
Podrías estar interesado en lo siguiente: