Ir directamente al contenido de esta página
En una entrada anterior, comentaba un caso en el que un «selector de ancestros» podría suponer una mejora en la accesibilidad de un menú desplegable. En esta entrada explico una posible solución basada en JavaScript.
Como es bien sabido, para crear un menú de navegación desplegable no se necesita más que una lista para los vínculos principales que incluyan listas anidadas para los vínculos secundarios. Por medio de CSS, se ocultan las listas secundarias, y con la pseudo-clase :hover se restaura su visibilidad cuando el usuario pasa el ratón sobre los elementos de lista que contienen los vínculos principales.
<ul id="navegacion">
<li><a href="#">Vínculo principal</a> <!--Sobre éste li se aplica el :hover-->
<ul> <!--Esta lista se oculta o se muestra cuando el ratón pasa sobre el li padre-->
<li><a href="#">Vínculo secundario</a></li>
<li><a href="#">Vínculo secundario</a></li>
</ul>
</li>
<li><a href="#">Vínculo principal</a>
<ul>
<li><a href="#">Vínculo secundario</a></li>
<li><a href="#">Vínculo secundario</a></li>
</ul>
</li>
</ul>
Sin embargo, como se podía comprobar en el ejemplo de la entrada mencionada arriba, cuando un usuario navega el menú por medio de la tecla Tab, los desplegables no se muestran, al no dispararse en ningún momento el estado :hover. El usuario entonces pierde de vista el foco de su avance, a pesar de que éste sigue recorriendo correctamente la lista de vínculos de los submenús. Lo que este usuario necesita es recibir la misma respuesta visual que quien emplee un ratón.
Los pasos para lograrlo serían los siguientes:
class="desplegable".focus de JavaScript que despliegue la lista.blur para que vuelva a ocultar la lista.Y ya está, es así de sencillo.
Por supuesto, habría decenas de formas de programar lo que he explicado arriba, pero dejo aquí unos ejemplos.
En este primer ejemplo, selecciono los desplegables por medio de getElementsByClassName, por lo que de momento sólo funciona en Firefox 3.0+, Opera 9.62+, Safari 3.1+ o Chrome, pero para su finalidad ilustrativa me parece suficiente:
window.onload = function(){
var desplegables = document.getElementsByClassName('desplegable');
function desplegar(x){
x.target.parentNode.parentNode.setAttribute('style','height:auto;overflow:visible;');
}
function contraer(x){
x.target.parentNode.parentNode.removeAttribute('style');
}
for(var i=0;i<desplegables.length;i++){
var vinculos = desplegables[i].getElementsByTagName('a');
for(var j=0;j<vinculos.length;j++){
vinculos[j].addEventListener('focus',desplegar,false);
vinculos[j].addEventListener('blur',contraer,false);
}
}
}
Si se necesita un script que supla la carencia del método getElementsByClassName en los demás navegadores, el mejor que se me ocurre es el de Dustin Díaz.
En este otro ejemplo empleo jQuery (1.4.2):
$(document).ready(function(){
$('.desplegable a').each(function(i){
$(this).focus(function(){
$(this).parent().parent().attr('style','height:auto;overflow:visible');
});
$(this).blur(function(){
$(this).parent().parent().removeAttr('style');
});
});
});
Y por último, otro ejemplo, esta vez con Mootools (1.2.4):
window.addEvent('domready', function() {
$each(
document.getElements('.desplegable a'),function(v){
v.addEvent('focus',function(){
v.getParent('.desplegable').setProperty('style','height:auto;overflow:visible;');
});
v.addEvent('blur',function(){
v.getParent('.desplegable').removeProperty('style');
});
}
);
});
Como ya hemos dicho en múltiples ocasiones, bien empleado JavaScript no sólo no es un obstáculo para la accesibilidad de una página, sino que puede ser una herramienta que incluso la mejore.
Somos un pequeño estudio fundado en 2007 por tres amigos y que actualmente cuenta con un nutrido grupo de colaboradores, todos ellos profesionales con entre ocho y once años de experiencia en diversos aspectos del desarrollo y la programación web.
Además, Digital Icon, S.L. (N.I.F.: B84622927) es una empresa inscrita en el Registro Mercantil de Madrid, Tomo 22 436, Libro 0, Folio 20, Sección 8, Hoja M-400861, Inscripción 1, conforme a los artículos 18 del Código de Comercio y 6 del Reglamento del Registro Mercantil.
Si quiere conocer un poco mejor cómo trabajamos, puede descargar una copia del contrato que firmamos con nuestros clientes o seguirnos en Google+:
Cliente: La Fábrica
División: MovilizaWeb
Nuestro trabajo: PHP, HTML5, CSS
Cliente: Ana del Val
División: EidoWeb
Nuestro trabajo: PHP, XHTML, CSS, JavaScript
Cliente: Guiomar González
División: EidoWeb
Nuestro trabajo: PHP, HTML5, CSS, jQuery
© Digital Icon, S.L., 2007 – 2012
Comentarios
Aún no hay comentarios
¿Algún comentario?