CSS :focus伪类和JS focus事件提高网站键盘可访问性

news/2024/5/9 17:58:05/文章来源:https://blog.csdn.net/Wangdanting123/article/details/70849352

键盘访问网站的常用操作包括:

  • Tab键索引控件元素;
  • Enter键触发当前处于focus状态的点击行为;
  • 上下键上下滚动网页;
  • Space空白键滚动一屏网页;
  • Home键返回顶部;
  • End键滚动到底部;

一般的操作行为是这样的,先Tab键按次序不断focus控件元素,包括链接,按钮,输入框等表单元素或者focus设置了tabindex的普通元素,处于focus状态元素,浏览器一般会通过虚框或者外发光的形式进行区分和提示,此时我们在按下Enter回车键,就相当于鼠标点击了这个元素,从而可以前往我们想去的目的地,或者执行我们想要的交互效果。

而focus状态元素的标记默认全部都是使用outline属性

我们只要平时注意HTML语义化,例如按钮不要使用,

等标签,不要重置outline,基本上键盘可访问性就已经及格了。

一、label标签和表单元素之间的键盘可访问性

对于表单元素,如果里面有type为submit类型的按钮,则浏览器天然支持单行输入框的回车提交行为。然而原生的按钮有一个问题,那就是UI样式控制存在兼容性差异,尤其是桌面端网页项目可以借助<label>元素实现按钮样式的移花接木

:focus伪类和outline都是IE8浏览器开始支持的。

这里写图片描述

这里写图片描述

html:

<form>
<p>用户名:<input></p>
<p><input id="t" type="submit"><label class="btn" for="t">提交</label>
</p>
</form>

css:

[type="submit"] {position: absolute;clip: rect(0 0 0 0);
}
.btn {display: inline-block;padding: 2px 12px;background-color: #cd0000;color: #fff;font-size: 14px;cursor: pointer;
}
:focus + label.btn {outline: 1px solid Highlight;outline: 5px auto -webkit-focus-ring-color;
}

二、CSS hover显示隐藏内容的键盘可访问性

我列表元素信息很多,为了防止视觉干扰,一些操作按钮在鼠标hover当前列表的时候才显示

这里写图片描述

这里写图片描述

很多小伙伴在实现的时候,并没有考虑很多,就直接使用display:none隐藏,或者visibility:hidden隐藏,于是会导致隐藏的控件元素压根没法通过键盘让其显示,因为这两种隐藏方式会让元素无法被focus,那该怎么办呢?可以试试使用透明度opacity控制内容的显隐,于是,我们就可以通过:focus伪类让按钮focus时候可见,

html:

<table width="300px" border="1"><tr><td>栏目1</td><td>栏目2</td><td><a href="https://www.baidu.com" class="btn1">删除</a></td></tr><tr><td>栏目1</td><td>栏目2</td><td><a href="javascript:;" class="btn1">删除</a></td></tr><tr><td>栏目1</td><td>栏目2</td><td><a href="javascript:;" class="btn1">删除</a></td></tr>
</table>

css:

table {border-spacing: 0;
}
.btn1 {display: inline-block;padding: 2px 12px;background-color: #cd0000;color: #fff;font-size: 14px;cursor: pointer;
}
tr .btn1 {opacity: 0;filter: alpha(opacity=0);
}
tr:hover .btn1,
tr .btn1:focus {opacity: 1;filter: none;
}

三、CSS hover显示下拉内容的键盘可访问性

首先一定要有键盘可访问的触发源,也就是无论是点击区还是hover区域,一定要有个<a>标签,或者原生按钮,或者设置了tabindex的普通元素。

把交互形式和实现原理,分为下面四类:

  • 列表HTML结构依赖,使用CSS定位,hover显示;
  • 列表HTML结构依赖,使用CSS定位,click显示;
  • 列表HTML结构不依赖,使用JS定位,hover显示;
  • 列表HTML结构不依赖,使用JS定位,click显示;

例如,导航上的二级菜单常使用CSS进行定位,对HTML结构有要求;而搜索的自动下拉提示列表则几乎都使用JS进行定位,列表直接创建于标签下,对HTML结构无依赖。

针对上面四种情况,我需要额外进行的处理分别是:

  • 增加:focus控制;
  • 无需额外处理;
  • 增加JS focus事件处理,处理细节同mouseenter;
  • 无需额外处理;

这些浮层显示的时候,通过上下左右键进行控制

这里写图片描述

html:

<div class="trigger-container"><a href="javascript:;" class="trigger" data-target="list">更多操作▾</a><div class="list" id="list"><a href="https://www.baidu.com">编辑</a><a href="javascript:;">删除</a></div>
</div>
<div class="trigger-container"><a href="javascript:;" class="trigger" data-target="list1">更多操作▾</a><div class="list" id="list1"><a href="javascript:;">编辑</a><a href="javascript:;">删除</a></div>
</div>

css:

.trigger-container {
float: left;
}
.list {position: absolute;visibility: hidden;
}
.trigger:hover + .list,
.trigger:focus + .list {visibility: visible;
}
.outline {outline: 1px solid Highlight;outline: 5px auto -webkit-focus-ring-color;
}

js:

(function (doc) {
if (doc.addEventListener) {var keycode = {37: 'left',38: 'up',39: 'right',40: 'down',13: 'enter',9: 'tab'};// 键盘高亮类名var className = 'outline';// 高亮类名的添加与删除var classList = {add: function (ele) {ele.className = ele.className + ' ' + className;},remove: function (ele) {ele.className = ele.className.split(/\s+/).filter(function (cl) {if (cl != className) {return cl;    }}).join(' ');},removeAll: function () {[].slice.call(doc.querySelectorAll('.' + className)).forEach(function (ele) {classList.remove(ele);});},has: function (ele) {return ele.className.split(/\s+/).filter(function (cl) {if (cl == className) {return cl;    }}).length > 0;}};//键盘事件doc.addEventListener('keydown', function (event) {// 是否是上下左右键var direction = keycode[event.keyCode];if (!direction) {return;    }if (direction == 'tab') {classList.removeAll();return;}// 当前激活元素var trigger = doc.activeElement;if (!trigger) {return;}// 对应的面板var attrTarget = trigger.getAttribute('target') || trigger.getAttribute('data-target');var target = attrTarget && doc.getElementById(attrTarget);if (!target) {return;    }// 需要是显示状态if (target.clientWidth == 0 && target.clientHeight == 0) {return;}// 如果是回车事件if (direction == 'enter') {var eleFocus = target.querySelector('.' + className);if (eleFocus) {// 阻止默认的回车event.preventDefault();eleFocus.click();return;}}// 如果都符合,同时有目标子元素var arrEleFocusable = target.storeFocusableEle, index = target.storeIndexFocus;if (!arrEleFocusable) {arrEleFocusable = [].slice.call(target.querySelectorAll('a[href], button:not(:disabled), input:not(:disabled)'));target.storeFocusableEle = arrEleFocusable;target.storeIndexFocus = -1;index = -1;}if (arrEleFocusable.length == 0) {return;    }// 先全部清除focus态arrEleFocusable.forEach(function (ele) {classList.remove(ele);});// 阻止默认的上下键滚屏event.preventDefault();// 索引加加减减if (direction == 'left' || direction == 'up') {index--;if (index < 0) {index = -1;}} else if (direction == 'right' || direction == 'down') {index++;if (index > arrEleFocusable.length - 1) {index = arrEleFocusable.length;}}// 如果有对应的索引元素if (arrEleFocusable[index]) {// 高亮对应的控件元素classList.add(arrEleFocusable[index]);}// 记录索引target.storeIndexFocus = index;});doc.addEventListener('mousedown', function (event) {var target = event.target;if (target && !classList.has(target)) {classList.removeAll();}});
}    
})(document);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_885457.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站搭建技术

1.购买网站的域名。 2.购买一台稳定的服务器&#xff0c;推荐腾讯云和阿里云。 这里我买的是腾讯云的服务器&#xff08;如下图) 3.建立网站&#xff0c;建立自己的网页文件&#xff0c;或者使用其他平台的网站框架并进行修改。(推荐没有web基础的小白直接套网络框架) 4.域名…

php + mySQL + WampServer 搭建实验室网站

规划&#xff1a; 将由Dreamwave设计的静态网站转变为PHP动态网站&#xff0c;用mySQL存储信息&#xff0c;WampServer作为开发环境&#xff0c;初始效果图如下&#xff0c;很粗糙&#xff0c;接下来要好好设计下布局了。 接下来给出连接和操作数据库部分代码&#xff1a; <…

安装PHP网站

学习PHP网站设计&#xff0c;从网络上下载开源的PHP网站demo作为学习资料&#xff0c;能够宏观了解整个网站的设计&#xff0c;加快学习的进度。下载到网站源码后&#xff0c;如何安装php网站&#xff0c;使其顺利运行起来&#xff0c;对于一个初学者是一个很大的问题。本文将个…

Photoshop 与网站设计

网站美工图设计出来后&#xff0c;基于此设计图进行网站设计。PHOTOSHOP派上大用场了。 &#xff08;1&#xff09; 在图片上添加文字 横排文字工具 参考教程&#xff1a;http://jingyan.baidu.com/article/bea41d437c7db8b4c51be6fd.html &#xff08;2&#xff09; 获取图…

[经验] 关于只能打开部分网站的问题

问题描述&#xff1a; 只能打开百度、bilibili等一些网站&#xff0c;CSDN、Github等打不开甚至ping不通。如下图所示。 原因&#xff1a; 应该是域名解析的问题&#xff0c;更改DNS可以解决。 具体解决方法&#xff1a; Win10系统。 WinI 打开设置点击“网络和Internet”&a…

视频网站的持久战:寒假档,优酷翻盘

对都市白领来说&#xff0c;正月初七开始上班&#xff0c;春节假期也就结束了&#xff0c;但对更广大的退休老人、农民和学生人群来说&#xff0c;没过正月十五&#xff0c;就还是年&#xff0c;假期还在继续——“年”的继续意味着&#xff0c;围绕他们的影视剧较量也还在延续…

一步步构建大型网站架构

一步步构建大型网站架构 来源: itivy 发布时间: 2011-05-02 20:21 阅读: 9843 次 原文链接 全屏阅读  [收藏] 之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这…

网站被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决

1、微信检测违规的两个手段&#xff1a;a&#xff09;系统的自动检测 b&#xff09;微信工作人员的人工检测。 2、人工的检测重要是源于多用户投诉举报&#xff0c;微信后台有一个警报机制&#xff0c;在多少时间内积累充足的举报次数 &#xff0c;工作人员就会介入检测。—…

网站被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决

先来认识一下微信屏蔽的原理。按原理逐个攻破&#xff0c;整理如下&#xff1a;微信屏蔽的原理 一、微信系统的两个检测手段&#xff1a;第一是系统的自动检测&#xff1b;第二是微信工作人员的人工检测。 二、 人工的检测很好理解&#xff0c;有用户投诉举报&#xff0c;在多…

cloudflare加速博客网站出现“此页面不能正确地重定向”的解决办法

现在微软推出了一年免费200美金计划给开发者&#xff0c;于是选择可做一台虚拟机做一个博客网站。 微软的服务器在大陆没有节点&#xff0c;亚洲分布在日本、韩国和印度&#xff0c;分配的ip在国内连接会非常的慢&#xff0c;打不开网页是很正常的事情。 用cloudflare做一个加速…

做一个好看的个人网站

好看的网站&#x1f449;个人网站: wangwangyz.site 这是我使用wordpress设置的自己的网站&#xff0c;里面有一些博客文章&#xff0c;支持日/夜间模式、自定义主题色、评论点赞、分页、顶置、邮件通知、评论回复留言、时光轴、说说面板等&#xff0c;目前也搭载了音乐播放器A…

Wordpress建站教程

好看的网站&#x1f449;个人网站: wangwangyz.site 这是我使用wordpress设置的自己的网站&#xff0c;里面有一些博客文章&#xff0c;支持日/夜间模式、自定义主题色、评论点赞、分页、顶置、邮件通知、评论回复留言、时光轴、说说面板等&#xff0c;目前也搭载了音乐播放器A…

官方文档和工具网站

工具网站 Table Convert Online - Make it easier to work with tables 将表格数据转换为常用的任意格式&#xff0c;包括CSV、HTML、Markdown、JSON等等。 API Store - 创信API数据接口调用服务平台 (jxcxin.cn) 稳定、快速、免费的 API 接口服务&#xff0c;目前共收录了 5…

HTML第6章简答题3(制作北大青鸟网站的中心开班信息模板)

代码如下&#xff0c;自需自看&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0px;padding: 0px;}.title {width: 252px;margin: auto;bor…

如何在自己网站上播放上传到优酷的视频

1.在优酷上传自己的视频 2.浏览器打开并且播放该视频 3.从地址栏复制出v_show/id_和.html之间的字符串,如下所示 4.在 <iframe src"http://player.youku.com/embed/" allowfullscreen"" frameborder"0"></iframe>的http://player.yo…

类知乎网站的实现

查询问题列表&#xff1a; 从这个方法返回的数据中可以看出&#xff0c;有一个answer_number字段&#xff0c; 即这个问题当前有多少个回答 1.先查询问题&#xff0c;再查询答案数量&#xff0c;这是最常想到的办法&#xff0c;代码如下&#xff1a; 这种方法的优点是简单直接&…

电商网站的mongodb设计

唯一的url slug&#xff1a;这种字段通常是唯一索引&#xff0c;以加速查询和确保唯一。它提供了毅个有意义的url结构&#xff0c;利于seo。通常https://xxxx.com/products/5d0332be5d530000c4002a03的url显得无意义&#xff0c;有意义的像&#xff1a;https://xxxx.com/produc…

使用React从零完整构建一个前后端分离网站,诞生一个小项目PoemKit

打杂到一定时候&#xff0c;也要总结总结&#xff0c;4年前UI工作做得蛮多&#xff0c;目前开发工作接触的蛮多&#xff0c;其实就是为了项目的落地不求人&#xff0c;不知不觉学了些东西&#xff0c;闲暇之余做了一些东西。 今天有无数的React UI工具包和库。那面对这么多选择…

从修复 testerhome(rubychina)网站的一个 bug 学习 rubyrails on ruby

前言 testerhome: http://testerhome.com/topics/1480 对于一个差点脱离前沿技术人&#xff0c;想要学习ruby&#xff0c;就意味着要放弃熟悉的操作系统windows&#xff0c;熟悉的ide-eclipse&#xff0c;更重要的是要从java这种重量级编译型语言的编程思想强行转换为ruby这种轻…

网站GZip优化

什么是Gzip压缩&#xff1f; 当用户点击我们的网站时&#xff0c;服务器提供的文件越大&#xff0c;到用户的浏览器并显示在屏幕上所需的时间就越长。 GZIP在传输他们到浏览器之前压缩网页和样式表&#xff0c;大大减少了传输时间&#xff0c;因为这些文件小得多。 GZIP压缩…