Técnica Scripts de cliente WCAG 2.2
SCR27Reordenar secciones de la página mediante el Document Object Model
En resumen
Esta técnica propone una alternativa accesible al arrastrar y soltar para reordenar módulos o secciones de una página: un pequeño menú de enlaces («subir», «bajar») en cada componente, activado con el evento onclick, que mueve el elemento en el propio DOM y no solo visualmente. Así pueden reorganizar el contenido quienes usan teclado, lectores de pantalla u otros dispositivos distintos del ratón. Puede combinarse con la función de arrastre.
Aplicabilidad
HTML, scripts
Descripción
El objetivo de esta técnica es proporcionar un mecanismo para reordenar componentes que sea a la vez muy usable y accesible. Los dos mecanismos más habituales para reordenar son enviar a los usuarios a una página de configuración en la que pueden numerar los componentes, o permitirles arrastrar y soltar los componentes hasta la posición deseada. El método de arrastrar y soltar es mucho más usable, ya que permite al usuario colocar los elementos en su sitio, de uno en uno, y hacerse una idea del resultado. Por desgracia, arrastrar y soltar depende del uso del ratón. Esta técnica permite a los usuarios interactuar con un menú situado en los componentes para reordenarlos en su sitio de forma independiente del dispositivo. Puede usarse en lugar de la funcionalidad de reordenación mediante arrastrar y soltar, o junto con ella.
El menú es una lista de enlaces que usa el evento onclick, independiente del dispositivo, para desencadenar los scripts que reordenan el contenido. El contenido se reordena en el Document Object Model (DOM), no solo visualmente, de modo que quede en el orden correcto para todos los dispositivos.
Ejemplos
Este ejemplo reordena hacia arriba y hacia abajo. Este enfoque también puede usarse para una reordenación bidimensional añadiendo las opciones izquierda y derecha.
Los componentes de este ejemplo son elementos de una lista sin ordenar. Las listas sin ordenar son un modelo semántico muy adecuado para conjuntos de elementos similares, como estos componentes. El enfoque del menú también puede usarse para otros tipos de agrupaciones.
Los módulos son elementos de lista, y cada módulo, además del contenido en elementos div, contiene un menú representado como una lista anidada.
<ul id="swapper">
<li id="black">
<div class="module">
<div class="module_header">
<!-- menu link -->
<a href="#" onclick="ToggleMenu(event);">menu</a>
<!-- menu -->
<ul class="menu">
<li><a href="#" onclick="OnMenuClick(event)"
onkeypress="OnMenuKeypress(event);">up</a></li>
<li><a href="#" onclick="OnMenuClick(event)"
onkeypress="OnMenuKeypress(event);">down</a></li>
</ul>
</div>
<div class="module_body">
Text in the black module
</div>
</div>
</li>
...
</ul>
Puesto que ya hemos tratado cómo mostrar y ocultar menús en los ejemplos del árbol sencillo, aquí nos centraremos únicamente en el código que intercambia los módulos. Una vez que armonizamos los eventos y cancelamos la acción predeterminada del enlace, nos ponemos a trabajar. Primero, definimos una serie de variables locales para los elementos con los que vamos a trabajar: el menú, el módulo que se va a reordenar y el enlace del menú (menuLink). Después, tras comprobar la dirección de la reordenación, intentamos obtener el nodo con el que intercambiar. Si lo encontramos, llamamos a swapNode() para intercambiar nuestros dos módulos y a PositionElement() para mover el menú, posicionado de forma absoluta, junto con el módulo, y a continuación devolvemos el foco al elemento del menú que puso todo en marcha.
function MoveNode(evt,dir){
HarmonizeEvent(evt);
evt.preventDefault();
var src = evt.target;
var menu = src.parentNode.parentNode;
var module = menu.parentNode.parentNode.parentNode;
var menuLink = module.getElementsByTagName("a")[0];
var swap = null;
switch(dir){
case 'up': {
swap = module.previousSibling;
while (swap && swap.nodeType != 1){
swap = swap.previousSibling;
}
break;
}
case 'down': {
swap = module.nextSibling;
while (swap && swap.nodeType != 1){
swap = swap.nextSibling;
}
break;
}
}
if (swap && swap.tagName == node.tagName){
module.swapNode(swap);
PositionElement(menu,menuLink,false,true);
}
src.focus();
}
El CSS para el intercambio de nodos no difiere mucho del de nuestros ejemplos anteriores del árbol, con algunos ajustes de tamaño y color para los módulos y el pequeño menú.
ul#swapper {
list-item-style:none;
margin:0px;
padding:0px;
}
ul#swapper li {
border:1px solid black;
height:5em;
list-style:none;
margin:1em;
padding:0;
width:15em;
}
ul#swapper li a {
color:white;
font-size:90%;
text-decoration:none;
}
ul#swapper li div.module_header {
padding:0 0.2em;
text-align:right;
}
ul#swapper li div.module_body {
padding:0.2em;
}
ul#swapper ul.menu {
background-color:#eeeeee;
border:1px solid gray;
display:none;
height:auto;
list-style:none;
margin:0;
padding:0;
position:absolute;
text-align:left;
}
ul#swapper ul.menu li {
border:none;
font-weight:normal;
height:auto;
margin:0;
text-align:left;
width:5em;
}
ul#swapper ul.menu li a {
color:black;
display:block;
padding:0 0.1em;
text-decoration:none;
width:100%;
}
Pruebas
Procedimiento
- Localizar todos los componentes que se pueden reordenar mediante arrastrar y soltar.
- Comprobar que existe también un mecanismo para reordenarlos mediante menús construidos con listas de enlaces.
- Comprobar que los menús están contenidos dentro de los elementos reordenables en el DOM.
- Comprobar que los scripts de reordenación se desencadenan únicamente desde el evento onclick de los enlaces.
- Comprobar que los elementos se reordenan en el DOM, no solo visualmente.
Resultados esperados
- Las comprobaciones n.º 2 a n.º 5 son verdaderas.
Cómo lo comprobamos en ADDAW
En las auditorías de accesibilidad de ADDAW revisamos cada criterio de conformidad siguiendo este catálogo de técnicas: comprobamos si la web aplica una técnica suficiente y documentamos cada fallo común con capturas y el código afectado, para que el equipo de desarrollo sepa exactamente qué corregir. Los informes siguen la metodología del Observatorio de Accesibilidad y la norma UNE-EN 301 549.
Fuente y licencia
Traducción al español, no oficial, realizada por ADDAW a partir de la técnica SCR27 del documento «Techniques for WCAG 2.2» del W3C (versión del repositorio público del W3C a 22/10/2026). Copyright © W3C® (MIT, ERCIM, Keio, Beihang). Se publica conforme a la licencia de documentos del W3C. El texto normativo de referencia es el original en inglés; si detecta un error en la traducción, escríbanos.