css-orientation-lock

El CSS no debe bloquear la página a una sola orientación

automaticWCAG 1.3.4 (AA)confianza: highgravedad: seriousperceivable

Comprueba que ninguna regla @media (orientation: portrait|landscape) aplique un transform: rotate(...) a la página, una técnica conocida para anular la orientación del dispositivo, y pregunta por cualquier regla de ese tipo que oculte el contenido principal de la página.

Ámbito de aplicación. Cualquier hoja de estilo accesible (del mismo documento, sin origen cruzado), bloques <style> en línea y hojas de estilo <link> del mismo origen ya cargadas en document.styleSheets, las hojas adoptadas por el documento, y las de cada shadow root abierto, cuyas reglas se comparan con los elementos de esa raíz.

Resultado esperado. Ningún bloque @media (orientation: portrait) o @media (orientation: landscape) establece una rotación transform/-webkit-transform/rotate de aproximadamente 90 grados (mod 180, es decir, ~90 o ~270), la técnica bien conocida para forzar visualmente una orientación con independencia de la orientación real del dispositivo, lo que anula el requisito de WCAG 1.3.4 de que el contenido no restrinja su vista a una sola orientación de pantalla salvo que esa orientación sea esencial. Esa rotación se juzga sobre los elementos visibles que coinciden con su selector (ACT b33eff), con la visibilidad juzgada sin la propia rotación: falla cuando uno de ellos contiene el contenido de la página (según se define más abajo para el contenido oculto), y se pregunta por cualquier otro elemento girado así (cantTell): una flecha que apunta a un panel situado a su lado en una orientación y debajo en la otra no bloquea nada. Una regla que no gira ningún elemento visible, o solo un pseudoelemento, no tiene nada que juzgar. Se pregunta por una segunda forma (cantTell): un bloque de media de orientación que oculta el contenido de la página con display: none o visibility: hidden, la forma habitual de WCAG F100 (contenido sustituido por un mensaje de "rotate your device" en una orientación). El elemento oculto cuenta como contenido de la página cuando es html o body, el landmark main, un ancestro de este o, en una página sin landmark main, un elemento que contiene al menos la mitad del texto del body. Cuando la página no tiene <main> ni role="main", un elemento personalizado cuyos ElementInternals le dan el rol main (this.attachInternals().role) es el landmark main. Si la orientación es esencial, y si la página sigue siendo utilizable, lo decide una persona.

Qué informa un hallazgo.

  • mediaText (una rotación o contenido oculto): la media query que contiene la regla, como (orientation: portrait). La rotación de un elemento que no contiene el contenido de la página se informa sobre ese elemento (ORIENTATION_MEDIA_ROTATES_ELEMENT).
  • selectorText (una rotación o contenido oculto): el selector de la regla de estilo que rota u oculta. Vacío cuando no se pudo leer.
  • unreadableSheetCount (STYLESHEETS_NOT_READABLE): cuántas hojas de estilo no se pudieron leer, normalmente porque proceden de otro origen.

Estos campos de data.details ayudan a leer y reproducir un hallazgo. Salvo reasonCode y los pocos campos que Esquema de salida indica como estables, no son un contrato estable: un campo puede cambiar de nombre o desaparecer en una versión menor, así que no construyas sobre ellos.

Ejemplos

pass
<html>
<head>
<title>Page title</title>
<style>body { background: #fff; }</style>
</head>
<body>Hi</body>
</html>

Ninguna media query de orientación rota la página.

fail
<html>
<head>
<title>Page title</title>
<style>
@media (orientation: landscape) {
body { transform: rotate(90deg); }
}
</style>
</head>
<body>Hi</body>
</html>

Una media query de landscape fuerza una rotación de 90 grados, bloqueando la página en portrait con independencia de la orientación del dispositivo.

Cómo comprobarlo

Cuando esta regla no puede decidir, informa cantTell y deja la pregunta a una persona. Cada pregunta que puede plantear aparece aquí bajo su código de motivo, con los pasos para responderla. Un hallazgo lleva los mismos pasos en howToCheck, en el idioma del análisis. Consulta Esquema de salida.

ORIENTATION_MEDIA_HIDES_CONTENT

  1. Con la barra de dispositivos de las herramientas para desarrolladores o con un dispositivo real, ver la página en vertical y luego en horizontal.
  2. En la orientación que indica el informe, comprobar qué se oculta y qué se muestra en su lugar.
  3. Comprobar si siguen disponibles el mismo contenido y las mismas funciones, por ejemplo mediante otra disposición.
  4. Decidir si una orientación es esencial (como en una aplicación de piano o en la foto de un cheque bancario).

Se cumple. El contenido sigue disponible en ambas orientaciones, o una única orientación es esencial.

No se cumple. El contenido se oculta y, por ejemplo, se muestra un mensaje de «gire su dispositivo», así que la página no se puede usar en esa orientación, lo que incumple WCAG 1.3.4 (F100).

ORIENTATION_MEDIA_ROTATES_ELEMENT

  1. Localizar el elemento que indica el informe y anotar qué es (un icono, un banner, un panel, parte del contenido).
  2. Con la barra de dispositivos de las herramientas para desarrolladores o con un dispositivo real, ver la página en vertical y luego en horizontal.
  3. Comprobar si el elemento se gira de lado en una de las orientaciones y si eso dificulta leer o usar el contenido.

Se cumple. El elemento girado es pequeño o decorativo, y todo el contenido se puede leer y usar en ambas orientaciones.

No se cumple. El contenido se gira de lado en una orientación, de modo que no se puede leer ni usar con normalidad, lo que incumple WCAG 1.3.4 (ACT b33eff).

STYLESHEETS_NOT_READABLE

  1. Con la barra de dispositivos de las herramientas para desarrolladores o con un dispositivo real, ver la página en vertical.
  2. Cambiar a horizontal y recargar; luego volver a cambiar.
  3. En cada orientación, comprobar que todo el contenido se muestra derecho, se puede leer y no queda sustituido por un mensaje de «gire su dispositivo».

Se cumple. La página muestra su contenido derecho y funciona en ambas orientaciones.

No se cumple. La página está bloqueada en una orientación (contenido oculto, girado de lado o sustituido por un mensaje), lo que incumple WCAG 1.3.4.

Ver código fuente