Addaw, ir a inicio Donar

Técnica Scripts de cliente WCAG 2.2

SCR33Ofrecer un botón para pausar el texto que se desplaza con JavaScript

Nombre oficial en el W3C: Usar scripts para desplazar el contenido y proporcionar un mecanismo para pausarlo

En pocas palabras

Si un script mueve texto por la pantalla, como un teletipo de noticias o una franja de avisos, la página debe ofrecer un control para pausarlo y otro para reanudarlo. Al reanudar, el movimiento sigue desde donde se paró. Así cada persona lee a su ritmo y el movimiento deja de distraer.

Por qué es importante

El texto en movimiento es difícil de leer para personas con baja visión, con dislexia o que leen despacio. Cuando consiguen fijarse en una frase, ya ha desaparecido.

El movimiento también distrae. Quien tiene dificultades de atención no logra concentrarse en el resto de la página mientras algo se mueve al lado.

Cómo se hace

  1. Ponga junto al texto en movimiento un botón visible «Pausar». Debe alcanzarse con Tab y activarse con Intro o Espacio.
  2. Al pulsarlo, detenga el temporizador o la animación. El texto no debe volver a moverse solo.
  3. Cambie el texto del botón a «Reanudar». Al pulsarlo, continúe desde la misma posición.
  4. Si no hay JavaScript o CSS, muestre el texto completo y quieto, y oculte el botón.
  5. Valore empezar en pausa si la persona ha pedido reducir el movimiento en su sistema (prefers-reduced-motion).

Cómo comprobarlo

  1. Localice cada zona con texto en movimiento y busque su control de pausa.
  2. Pulse «Pausar» con el teclado. El texto debe detenerse.
  3. Espere unos segundos y compruebe que no vuelve a moverse por sí solo.
  4. Pulse «Reanudar» y compruebe que sigue desde donde se paró.

Ejemplo

Franja de avisos que se desplaza con un script y un botón que la pausa y la reanuda.

<p id="avisos" style="overflow: hidden; white-space: nowrap">Corte de agua en el barrio del Carmen el lunes de 8:00 a 12:00.</p>
<button type="button" id="pausa">Pausar</button>
<script>
var pos = 0, parado = false, avisos = document.getElementById('avisos');
setInterval(function () {
  if (parado) return;
  pos = (pos + 1) % 300;
  avisos.style.textIndent = -pos + 'px';
}, 50);
document.getElementById('pausa').addEventListener('click', function () {
  parado = !parado;
  this.textContent = parado ? 'Reanudar' : 'Pausar';
});
</script>
Ver el texto completo del W3C (traducción al español)

Esta es una traducción no oficial al español de la técnica SCR33 de Techniques for WCAG 2.2, del W3C. Puede contener errores. El único documento oficial y normativo es la versión original en inglés, publicada en el sitio web del W3C.

Aplicabilidad

Tecnologías que permiten desplazar el contenido mediante scripts.

Descripción

El objetivo de esta técnica es proporcionar a los usuarios una forma de detener el contenido en desplazamiento cuando dicho desplazamiento lo genera un script. El contenido que se desplaza puede ser difícil o imposible de leer para los usuarios con baja visión o con discapacidades cognitivas. El movimiento también puede distraer a algunas personas y dificultarles la concentración en otras partes de la página web.

Ejemplos

En este ejemplo se usan CSS y JavaScript para presentar visualmente un texto en formato de desplazamiento. Se incluye un enlace para pausar el movimiento de desplazamiento.

Esta implementación mostrará el texto completo y omitirá el enlace cuando JavaScript o CSS no sean compatibles o estén desactivados.

El componente HTML

...
<div id="scroller">
  <p id="tag">This text will scroll and a Pause/Scroll link will be present 
  when JavaScript and CSS are supported and active.</p>
</div>
...

El componente CSS

...
body {
  font:1em verdana,sans-serif;
  color:#000;
  margin:0
}
#scroller {
  position:relative;
  overflow:hidden;
  width:15em;
  border:1px solid #008080;
}
#tag {
  margin:2px 0;
}
#testP {
  visibility:hidden;
  position:absolute;
  white-space:nowrap;
} 
 #top {
  width:350px;
  margin:auto;
}
...

El componente JavaScript

var speed=50        // speed of scroller
var step=3          // smoothness of movement
var StartActionText= "Scroll"  // Text for start link
var StopActionText = "Pause"   // Text for stop link
var x, scroll, divW, sText=""
function onclickIE(idAttr,handler,call){
  if ((document.all)&&(document.getElementById)){idAttr[handler]="Javascript:"+call}
}
function addLink(id,call,txt){
  var e=document.createElement('a');
  e.setAttribute('href',call);
  var linktext=document.createTextNode(txt);
  e.appendChild(linktext);
  document.getElementById(id).appendChild(e);
}
function getElementStyle() {
  var elem = document.getElementById('scroller');
  if (elem.currentStyle) {
    return elem.currentStyle.overflow;
  }
  else if (window.getComputedStyle) {
    var compStyle = window.getComputedStyle(elem, '');
    return compStyle.getPropertyValue("overflow");
  }
  return "";
}
function addControls(){
  // test for CSS support first 
  // test for the overlow property value set in style element or external file
  if (getElementStyle()=="hidden") {
    var f=document.createElement('div');
    f.setAttribute('id','controls');
    document.getElementById('scroller').parentNode.appendChild(f);
    addLink('controls','Javascript:clickAction(0)',StopActionText);
    onclickIE(document.getElementById('controls').childNodes[0],"href",'clickAction(0)');
    document.getElementById('controls').style.display='block';
  }
}
function stopScroller(){clearTimeout(scroll)}
function setAction(callvalue,txt){
  var c=document.getElementById('controls')
  c.childNodes[0].setAttribute('href','Javascript:clickAction('+callvalue+')')
    onclickIE(document.getElementById('controls').childNodes[0],"href",'clickAction
  ('+callvalue+')')
  c.childNodes[0].firstChild.nodeValue=txt
}
function clickAction(no){
  switch(no) {
    case 0:
      stopScroller();
      setAction(1,StartActionText);
      break;
    case 1:
      startScroller();
      setAction(0,StopActionText);
  }
}
function startScroller(){
  document.getElementById('tag').style.whiteSpace='nowrap'
  var p=document.createElement('p')
  p.id='testP'
  p.style.fontSize='25%' //fix for mozilla. multiply by 4 before using
  x-=step
  if (document.getElementById('tag').className) p.className=document.getElementById
  ('tag').className
    p.appendChild(document.createTextNode(sText))
    document.body.appendChild(p)
    pw=p.offsetWidth
    document.body.removeChild(p)
    if (x<(pw*4)*-1){x=divW}
    document.getElementById('tag').style.left=x+'px'
    scroll=setTimeout('startScroller()',speed)
}
function initScroller(){
  if (document.getElementById && document.createElement && document.body.appendChild) {
    addControls();
    divW=document.getElementById('scroller').offsetWidth;
    x=divW;
    document.getElementById('tag').style.position='relative';
    document.getElementById('tag').style.left=divW+'px';
    var ss=document.getElementById('tag').childNodes;
    for (i=0;i<ss.length;i++) {sText+=ss[i].nodeValue+" "};
    scroll=setTimeout('startScroller()',speed);
  }
}
function addLoadEvent(func) {
  if (!document.getElementById | !document.getElementsByTagName) return
  var oldonload = window.onload
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload()
      func()
    }
  }
}
addLoadEvent(initScroller)

Hay disponible un ejemplo funcional de este código: Example of using script to scroll content and providing a mechanism to pause it (ejemplo de uso de scripts para desplazar contenido con un mecanismo para pausarlo).

Pruebas

Procedimiento

  1. Comprobar que se proporciona un mecanismo para pausar el contenido en desplazamiento.
  2. Usar el mecanismo de pausa para pausar el contenido en desplazamiento.
  3. Comprobar que el desplazamiento se ha detenido y no se reinicia por sí solo.
  4. Comprobar que se proporciona un mecanismo para reanudar el contenido pausado.
  5. Usar el mecanismo de reanudación proporcionado para reanudar el contenido en desplazamiento.
  6. Comprobar que el desplazamiento se ha reanudado desde el punto en el que se detuvo.

Resultados esperados

  • Las comprobaciones n.º 3 y n.º 6 son verdaderas.

Cómo lo comprobamos en ADDAW

En cada auditoría de ADDAW revisamos esta técnica página a página y le entregamos los errores con capturas y la forma de corregirlos.

Solicitar una auditoría

Basado en la técnica SCR33 del W3C (WCAG 2.2). Explicación y ejemplos: ADDAW. Traducción no oficial del texto del W3C © W3C, licencia de documentos del W3C. ¿Ha visto un error? Escríbanos.