html - WCAG:应用样式时,Firefox 和 Edge 不会在焦点输入元素上显示轮廓
问题描述
我正在创建一个表单,它遵循一些 WCAG 指南。其中之一是:
G165:使用平台的默认焦点指示器,以便高能见度的默认焦点指示器继承。
这条规则的总结是:
操作系统有一个本地的焦点指示,这在许多用户代理中都是可用的。焦点指示器的默认渲染并不总是很明显,甚至在某些背景下可能很难看到。但是,许多平台允许用户自定义此焦点指示器的呈现。辅助技术还可以改变原生焦点指示器的外观。如果您使用本机焦点指示器,则任何系统范围的可见性设置都将转移到网页。如果您绘制自己的焦点指示器,例如通过对页面的部分进行着色以响应用户操作,这些设置将不会保留,AT 通常无法找到您的焦点指示器。
(强调我的)
为了遵守这条规则,我想为表单元素保留操作系统的默认焦点指示器。
但是,我在这里面临不同的问题。
在 macOS 上的 Firefox 中:
一旦我更改元素的样式(例如通过更改边框设置),默认焦点就会丢失1。
这很奇怪,因为border
它们outline
是不同的样式属性。
在 Windows 上的 Firefox 和 Edge 中:
当输入表单元素时,浏览器会显示一个焦点指示器,它只是一个不同颜色的边框——只要它没有样式。另一方面,Chrome 确实有一个指示器作为轮廓——就像在 macOS 2上一样。
这是一个演示行为的片段(或者尝试这个fiddle):
.b {
border: 1px solid red;
}
<form>
<input class="a" type="text">
<input class="b" type="text">
</form>
作为旁注:如果label
-elements 存在与否,则行为没有区别。
我的问题是:
- 为什么 Firefox 和 Edge 在 macOS 和 Widnows 上会有这样的反应?为什么他们使用边框而不是文档的轮廓?
- 即使应用了自定义样式,如何强制这些浏览器显示操作系统的默认焦点指示器?
- 当有人创建了自定义指标时,它是否仍会显示在 Firefox 和 Edge 中,即使默认指标不再显示?
有了这些问题,我想知道这个规则是否甚至可能实现。最后,也许我必须手动设置outline
以focus
在所有浏览器中获得相同的行为并跳过此规则。
1这是显示 macOS 上问题的屏幕截图:
2这是显示 Windows 上的问题的屏幕截图:
解决方案
正如您已经注意到的,表单元素的外观和行为是基于实现的,并且因浏览器而异。
每个表单元素都有其浏览器默认外观——一组样式,例如border
等background
。
当您尝试更改默认样式时,浏览器可能会逐个规则地覆盖它们(就像 Chrome 所做的那样)或完全放弃默认外观(就像 Firefox 所做的那样)。
因此,如果您想在“所有”浏览器中具有相同的外观,您必须明确设置它。
例如:
.b {
border: 1px solid red;
-moz-appearance: none;
-webkit-appearance: none;
}
.b:focus {
outline: none;
box-shadow: 0 0 2px 2px lime
}
<input class="a" type="text">
<input class="b" type="text">
在这里阅读更多。
推荐阅读
- angular - 仅从 ng-bootstrap 安装 datepicker
- javascript - React-router:使用酶在“渲染”道具内部进行测试
- java - 将货币表从 USD 输出到 CNY
- html - Lotus Script 从 .htm 文件中获取 HTML 代码作为文本
- objective-c - 在 iOS + 目标 c 中跟随 CLLocation 目的地时向左、向右移动或继续行走
- html - 未捕获的错误:无法解析 MyloginPage 的所有参数
- android - 从我的应用程序打开 URL 到 Android MS Excel 中的 excel 文件
- c++ - 生成具有偶数汉明权重的整数(popcount)c ++
- python - Python - 删除所有不在列表中的子字符串
- coq - 如何在 Coq 中声明某种类型的变量或常量?