web无障碍访问实践

974 阅读1分钟

背景:

当前现状,通过鼠标操作、hover到功能模块,出现下拉菜单,移除鼠标,隐藏下拉菜单

无障碍访问需求点

  1. 使用键盘键tab,切换各个模块
  2. 如果有下拉菜单,按键盘键enter,出现下拉菜单、按键盘键tab,切换下拉框菜单项
  3. 还有一种方式,省略enter键盘,tab选中功能模块,下拉菜单显示,继续tab,切换下拉框菜单项

实现

先搞清楚两件事,”tab切换各模块“,实际是触发元素focus事件,enter键触发元素click事件

选中效果:浏览器自带样式、a标签不能设置:focus,outline:none,如下

a {
// 需要注释掉下面代码
// &:focus {outline: none; }}

公共实现

<div class="" id="m_nav">        <ul id="navigationRegion">            <li token="1"><a title="首页" href="javascript:void(0)">首页</a></li>            <li token="2" class="home">                <a title="我的时光" href="javascript:void(0)">我的时光</a>                <div class="i_n_l child">                    <h5><a href="//my.mtime.com">我的时光</a></h5>                    <h5><a href="//my.mtime.com/movie/wish/">我的电影</a></h5>                    <h5><a href="//my.mtime.com/friend/">我的好友</a></h5>                </div>            </li>            <li token="3"><a title="第二页" href="//www.mtime.com/">第二页</a></li>        </ul>    </div>
 <style type="text/css">        #m_nav{           font-size:12px;           position:relative;        }        #m_nav #navigationRegion::after{            content:"copyright mtime";            height:0;            visibility:hidden;            display:block;            clear:both;        }        #m_nav li{            height:41px;            float:left;            display:inline;            font-size:1.2em;            line-height:41px;            text-align:center;            letter-spacing:1px;            position:relative;        }        #m_nav li a{            font-weight:bold;            text-decoration:none;        }        #m_nav li.home{            width:73px;            padding-right:24px;            position:relative;            text-align:right;        }        .i_n_l h5{            height:26px;            line-height:26px;            margin:0 4px;            border-bottom:1px solid #2f2e20;            width:118px;            overflow:visible!important;            overflow:hidden;        }        .i_n_l{            position:absolute;            top:41px;            left:0;            width:126px;            border:1px solid #928f65;             font-size:1.1em;             display:none;        }        .home_hover .i_n_l{            display:block;        }    </style>

需求点2实现

<script>        var o = document.getElementById("navigationRegion").getElementsByTagName("li");        var l = o.length, cache;                var menuTaga = function(obj){            //获取a标签DOM对象            return obj.getElementsByTagName("a")[0];        },         menuDown = function(obj){            var cl = obj.className;            if(/_on$/.test(cl) || /_hover$/.test(cl)){                return;                      }            obj.className = obj.className + "_hover";         },         menuUp = function(obj){            obj.className = obj.className.replace("_hover", "");        },         menuCache = function(obj){            if(cache){                menuUp(cache);                }            cache = obj;        },        menuEvent = function(obj){            obj.onmouseover = function(){                menuCache(this);                return menuDown(this);            };            obj.onmouseout = function(){                return menuUp(this);            };            menuTaga(obj).onfocus = function(){                console.log('onfocus===')                menuCache(obj);                return menuDown(obj);            };        };        for(var i=0; i<l; i+=1){            menuEvent(o[i]);        }    </script>

需求点3实现

<script>        var o = document.getElementById("navigationRegion").getElementsByTagName("li");        var l = o.length, cache;                var menuTaga = function(obj){            //获取a标签DOM对象            return obj.getElementsByTagName("a")[0];        },         menuDown = function(obj){            var cl = obj.className;            if(/_on$/.test(cl) || /_hover$/.test(cl)){                return;                      }            obj.className = obj.className + "_hover";         },         menuUp = function(obj){            obj.className = obj.className.replace("_hover", "");        },         menuCache = function(obj){            if(cache){                menuUp(cache);                }            cache = obj;        },        menuEvent = function(obj){            obj.onmouseover = function(){                menuCache(this);                return menuDown(this);            };            obj.onmouseout = function(){                return menuUp(this);            };            menuTaga(obj).onfocus = function(){                console.log('onfocus===')                menuCache(obj);            };            menuTaga(obj).onclick = function(){                console.log('click===')                menuCache(obj);                return menuDown(obj);            };        };        for(var i=0; i<l; i+=1){            menuEvent(o[i]);        }    </script>

参考文章:

js下拉菜单实现与可访问性问题的一些思考