Qué significa realmente el nivel AA
WCAG se organiza en tres niveles. A es el mínimo, AA es el nivel del que parten la contratación pública europea y EN 301 549, y AAA es un objetivo que nadie está obligado a alcanzar en todo un sitio. Cuando una licitación pide « WCAG 2.2 AA », se refiere a todos los criterios de éxito A y AA, en cada página del alcance, en cada estado que un usuario pueda alcanzar.
Los criterios de éxito son enunciados verificables, no técnicas. « Contraste (mínimo) » no le dice qué token cambiar; le dice la relación medida que un texto debe alcanzar. Esa distinción importa en una auditoría: una incidencia es defendible cuando nombra el criterio, el elemento y la medición, no cuando nombra una herramienta.
Un sitio no aprueba ni suspende en su conjunto. La conformidad se declara por página, y un solo elemento no conforme en una página retira la declaración de esa página. Por eso la supervisión continua supera a una auditoría puntual: una actualización del tema puede anular la declaración de cien páginas de golpe.
Los nueve criterios que añadió WCAG 2.2
Seis de ellos están en A o AA, así que entran en el alcance de una evaluación EN 301 549. La última columna dice si un escáner puede juzgarlo o si debe hacerlo una persona.
| CE | Nombre | Nivel | Cómo se prueba |
|---|---|---|---|
| 2.4.11 | Foco no oscurecido (mínimo) | AA | manual |
| 2.4.12 | Foco no oscurecido (mejorado) | AAA | manual |
| 2.4.13 | Apariencia del foco | AAA | manual |
| 2.5.7 | Movimientos de arrastre | AA | manual |
| 2.5.8 | Tamaño del objetivo (mínimo) | AA | automatizado |
| 3.2.6 | Ayuda coherente | A | manual |
| 3.3.7 | Entrada redundante | A | manual |
| 3.3.8 | Autenticación accesible (mínimo) | AA | parcialmente automatizado |
| 3.3.9 | Autenticación accesible (mejorado) | AAA | manual |
Qué comprueba el escáner, regla por regla
Cada regla automática lleva ambas referencias, de modo que una incidencia se lee como un criterio de éxito de WCAG para el desarrollador y como una cláusula de EN 301 549 para el revisor. Estas son las reglas precargadas en la tabla de correspondencia pública; el catálogo del producto es más amplio y se mantiene de forma centralizada.74 rules seeded
| Regla | What it detects | WCAG | EN 301 549 | Impacto típico |
|---|---|---|---|---|
| accesskeys | Two elements claim the same access key | 2.1.1 | 9.2.1.1 | serious |
| area-alt | Image map region without alternative text | 1.1.1, 2.4.4, 4.1.2 | 9.1.1.1, 9.2.4.4, 9.4.1.2 | critical |
| aria-allowed-attr | ARIA attribute not allowed on this role | 4.1.2 | 9.4.1.2 | critical |
| aria-command-name | Custom button, link or menu item without a name | 4.1.2 | 9.4.1.2 | serious |
| aria-hidden-body | Whole document hidden from assistive technology | 4.1.2 | 9.4.1.2 | critical |
| aria-hidden-focus | Focusable element hidden from assistive technology | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | serious |
| aria-input-field-name | Custom input field without an accessible name | 4.1.2 | 9.4.1.2 | serious |
| aria-meter-name | Meter without an accessible name | 1.1.1 | 9.1.1.1 | serious |
| aria-progressbar-name | Progress indicator without an accessible name | 1.1.1 | 9.1.1.1 | serious |
| aria-required-attr | ARIA role missing a required attribute | 4.1.2 | 9.4.1.2 | critical |
| aria-required-children | Composite role without its required child roles | 1.3.1 | 9.1.3.1 | critical |
| aria-required-parent | ARIA role placed outside its required container | 1.3.1 | 9.1.3.1 | critical |
| aria-roles | Role value is not a recognised ARIA role | 4.1.2 | 9.4.1.2 | critical |
| aria-toggle-field-name | Checkbox, radio or switch without an accessible name | 4.1.2 | 9.4.1.2 | serious |
| aria-tooltip-name | Tooltip role without any text | 4.1.2 | 9.4.1.2 | serious |
| aria-valid-attr | Attribute name is not a valid ARIA attribute | 4.1.2 | 9.4.1.2 | critical |
| aria-valid-attr-value | ARIA attribute points at a value that does not resolve | 4.1.2 | 9.4.1.2 | critical |
| audio-caption | Audio without a captions or transcript track | 1.2.1 | 9.1.2.1 | critical |
| autocomplete-valid | autocomplete value not recognised | 1.3.5 | 9.1.3.5 | serious |
| avoid-inline-spacing | Text spacing locked by an inline style | 1.4.12 | 9.1.4.12 | serious |
| blink | Blinking content that cannot be stopped | 2.2.2 | 9.2.2.2 | serious |
| button-name | Button without an accessible name | 4.1.2 | 9.4.1.2 | critical |
| bypass | No way to skip the repeated navigation | 2.4.1 | 9.2.4.1 | serious |
| color-contrast | Text contrast below the required ratio | 1.4.3 | 9.1.4.3 | serious |
| css-orientation-lock | Content locked to one screen orientation | 1.3.4 | 9.1.3.4 | serious |
| definition-list | Definition list built from the wrong children | 1.3.1 | 9.1.3.1 | serious |
| dlitem | Definition term or description outside a list | 1.3.1 | 9.1.3.1 | serious |
| document-title | Page has no title | 2.4.2 | 9.2.4.2 | serious |
| duplicate-id-active | Duplicate id on an interactive element | 4.1.1 | 9.4.1.1 | serious |
| empty-heading | Heading with no text | 1.3.1 | 9.1.3.1 | minor |
| empty-table-header | Table header cell with no text | 1.3.1 | 9.1.3.1 | minor |
| focus-order-semantics | Focusable element with no interactive role | 2.4.3 | 9.2.4.3 | minor |
| form-field-multiple-labels | Field bound to more than one label | 3.3.2 | 9.3.3.2 | moderate |
| frame-title | Frame without a title | 2.4.1, 4.1.2 | 9.2.4.1, 9.4.1.2 | serious |
| heading-order | Heading level skipped | 1.3.1 | 9.1.3.1 | moderate |
| html-has-lang | Page language not declared | 3.1.1 | 9.3.1.1 | serious |
| html-lang-valid | Page language code is not valid | 3.1.1 | 9.3.1.1 | serious |
| html-xml-lang-mismatch | lang and xml:lang disagree | 3.1.1 | 9.3.1.1 | moderate |
| identical-links-same-purpose | Links with the same text lead somewhere different | 2.4.9 | 9.2.4.9 | minor |
| image-alt | Image without a text alternative | 1.1.1 | 9.1.1.1 | critical |
| input-button-name | Input button with no value or label | 4.1.2 | 9.4.1.2 | critical |
| input-image-alt | Image button without alternative text | 1.1.1, 4.1.2 | 9.1.1.1, 9.4.1.2 | critical |
| label | Form field without a programmatic label | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | critical |
| landmark-banner-is-top-level | Banner landmark nested inside another region | 1.3.1 | 9.1.3.1 | moderate |
| landmark-complementary-is-top-level | Complementary landmark nested inside another region | 1.3.1 | 9.1.3.1 | moderate |
| landmark-no-duplicate-main | More than one main landmark on the page | 1.3.1 | 9.1.3.1 | moderate |
| landmark-one-main | Page has no single main landmark | 1.3.1, 2.4.1 | 9.1.3.1, 9.2.4.1 | moderate |
| landmark-unique | Two landmarks share a role and a name | 1.3.1 | 9.1.3.1 | moderate |
| link-name | Link without discernible text | 2.4.4, 4.1.2 | 9.2.4.4, 9.4.1.2 | serious |
| list | List contains elements that are not list items | 1.3.1 | 9.1.3.1 | moderate |
| listitem | List item outside a list | 1.3.1 | 9.1.3.1 | serious |
| marquee | Scrolling marquee content | 2.2.2 | 9.2.2.2 | serious |
| meta-viewport | Zoom disabled by the viewport meta tag | 1.4.4 | 9.1.4.4 | serious |
| nested-interactive | Interactive control nested inside another | 4.1.2 | 9.4.1.2 | serious |
| no-autoplay-audio | Audio starts on its own for more than three seconds | 1.4.2 | 9.1.4.2 | moderate |
| object-alt | Embedded object without a text alternative | 1.1.1 | 9.1.1.1 | serious |
| p-as-heading | Paragraph styled to look like a heading | 1.3.1 | 9.1.3.1 | serious |
| page-has-heading-one | Page has no level one heading | 1.3.1 | 9.1.3.1 | moderate |
| presentation-role-conflict | Presentation role cancelled by other markup | 4.1.2 | 9.4.1.2 | minor |
| region | Content sits outside any landmark | 1.3.1 | 9.1.3.1 | moderate |
| role-img-alt | Element with role img has no alternative text | 1.1.1 | 9.1.1.1 | serious |
| scrollable-region-focusable | Scrollable area cannot be reached by keyboard | 2.1.1 | 9.2.1.1 | serious |
| select-name | Select element without an accessible name | 1.3.1, 4.1.2 | 9.1.3.1, 9.4.1.2 | critical |
| server-side-image-map | Server-side image map in use | 2.1.1 | 9.2.1.1 | minor |
| summary-name | Disclosure summary without a name | 4.1.2 | 9.4.1.2 | serious |
| svg-img-alt | Meaningful SVG without a text alternative | 1.1.1 | 9.1.1.1 | serious |
| tabindex | Positive tabindex overrides the natural focus order | 2.4.3 | 9.2.4.3 | serious |
| table-fake-caption | Table title styled as a caption instead of marked as one | 1.3.1 | 9.1.3.1 | serious |
| target-size | Touch target smaller than 24 by 24 pixels | 2.5.8 | 9.2.5.8 | moderate |
| td-has-header | Data cell in a large table has no header | 1.3.1 | 9.1.3.1 | serious |
| td-headers-attr | Data cell not associated with a header | 1.3.1 | 9.1.3.1 | serious |
| th-has-data-cells | Table header with no data cells attached | 1.3.1 | 9.1.3.1 | serious |
| valid-lang | Language of a passage is not a valid code | 3.1.2 | 9.3.1.2 | serious |
| video-caption | Video without a captions track | 1.2.2 | 9.1.2.2 | critical |
Qué puede ver la automatización y qué no
Junto a cada puntuación en Conforma aparece la misma frase, porque el número es solo una parte del cuadro. Las reglas automáticas son excelentes con las propiedades medibles y ciegas a la intención.
Las pruebas automatizadas cubren solo una parte de las barreras de accesibilidad. Para una evaluación completa es necesaria una verificación manual.
Cómo prueba Conforma WCAG 2.2 AA
- Las reglas automáticas se ejecutan en cada página de un análisis, y cada infracción se escribe como una incidencia con la regla, el selector, el fragmento HTML y una captura de pantalla del elemento en su sitio.
- Cada incidencia lleva ambas referencias: el criterio de éxito de WCAG y la cláusula de EN 301 549, de modo que un informe se lee igual para un desarrollador y para un revisor de contratación.
- A las incidencias se les asigna una huella a partir de la regla, el selector y la ruta. Una corrección que reaparece tras un despliegue se notifica como una regresión en lugar de contarse en silencio como trabajo nuevo.
- La lista de comprobación manual cubre lo que las reglas no pueden juzgar, con prueba en vídeo, la tecnología de apoyo usada y un evaluador con nombre, y se sella en el mismo paquete de pruebas que la ejecución automática.
Preguntas que nos hacen sobre esto
¿Es WCAG 2.2 AA lo mismo que cumplir la ley de accesibilidad?
No. El European Accessibility Act es la ley, EN 301 549 es la norma armonizada que se usa para demostrarla, y EN 301 549 remite a WCAG 2.2 nivel AA para el contenido web. Alcanzar el AA es la base técnica de una declaración, no un certificado.
¿Tenemos que pasar de 2.1 a 2.2 ahora?
Para todo lo nuevo, la respuesta segura es sí. WCAG 2.2 es retrocompatible: el contenido que cumple 2.2 también cumple 2.1, así que probar frente a la versión más reciente no cuesta nada y cubre ambas.
¿Una puntuación automática perfecta significa que el sitio es conforme?
Significa que no se detectó ninguna infracción automática en las páginas analizadas. El uso con teclado, el orden del foco y el flujo del lector de pantalla siguen necesitando una persona antes de hacer cualquier afirmación.