当一个HTML元素被“聚焦”(当前选中/标签进入),许多浏览器(至少Safari和Chrome)会在它周围放一个蓝色边框。
对于我正在工作的布局,这是分散注意力,看起来不正确。
<input type="text" name="user" class="middle" id="user" tabindex="1" />
Firefox似乎没有这样做,或者至少,会让我控制它:
border: x;
如果有人能告诉我IE的表现如何,我会很好奇。
让Safari删除这一点闪光会很好。
在Firefox中,没有一个解决方案对我有效。
下面的解决方案更改了Firefox的焦点边框样式,并将其他浏览器的大纲设置为none。
我已经有效地使焦点边界从3px的蓝色发光到与文本区域边界匹配的边界样式。下面是一些边框样式:
虚线边界(边界2px红色虚线):
没有边界!(边境0 px):
Textarea border(边框1px纯灰色):
代码如下:
输入:焦点,textarea:焦点{
大纲:没有;/**对于Safari, etc **/
边框:1px纯灰色;/** For Firefox **/
}
#{文本区域
位置:绝对的;
上图:10 px;
左:10 px;
右:10 px;
宽度:calc(100% - 20px);
身高:160 px;
显示:inline-block;
margin-top: -0.2 em;
}
< textarea id = " textarea”>哟textarea > < /
编辑2021:你现在可以使用这个:https://github.com/WICG/focus-visible
一般来说,删除所有焦点样式对可访问性和键盘用户都是不利的。但是轮廓是丑陋的,并且为每个交互元素提供自定义的焦点样式可能是一个真正的痛苦。
因此,我发现最好的折衷办法是,只有当我们检测到用户正在使用键盘导航时,才显示大纲样式。基本上,如果用户按TAB键,我们就会显示轮廓,如果用户使用鼠标,我们就会隐藏轮廓。
它不会阻止您为某些元素编写自定义焦点样式,但至少它提供了一个很好的默认值。
我是这样做的:
// detect keyboard users
const keyboardUserCssClass = "keyboardUser";
function setIsKeyboardUser(isKeyboard) {
const { body } = document;
if (isKeyboard) {
body.classList.contains(keyboardUserCssClass) || body.classList.add(keyboardUserCssClass);
} else {
body.classList.remove(keyboardUserCssClass);
}
}
// This is a quick hack to activate focus styles only when the user is
// navigating with TAB key. This is the best compromise we've found to
// keep nice design without sacrifying accessibility.
document.addEventListener("keydown", e => {
if (e.key === "Tab") {
setIsKeyboardUser(true);
}
});
document.addEventListener("click", e => {
// Pressing ENTER on buttons triggers a click event with coordinates to 0
setIsKeyboardUser(!e.screenX && !e.screenY);
});
document.addEventListener("mousedown", e => {
setIsKeyboardUser(false);
});
body:not(.keyboardUser) *:focus {
outline: none;
}
<p>By default, you'll see no outline. But press TAB key and you'll see focussed element</p>
<button>This is a button</button>
<a href="#">This is anchor link</a>
<input type="checkbox" />
<textarea>textarea</textarea>
<select/>
在Firefox中,没有一个解决方案对我有效。
下面的解决方案更改了Firefox的焦点边框样式,并将其他浏览器的大纲设置为none。
我已经有效地使焦点边界从3px的蓝色发光到与文本区域边界匹配的边界样式。下面是一些边框样式:
虚线边界(边界2px红色虚线):
没有边界!(边境0 px):
Textarea border(边框1px纯灰色):
代码如下:
输入:焦点,textarea:焦点{
大纲:没有;/**对于Safari, etc **/
边框:1px纯灰色;/** For Firefox **/
}
#{文本区域
位置:绝对的;
上图:10 px;
左:10 px;
右:10 px;
宽度:calc(100% - 20px);
身高:160 px;
显示:inline-block;
margin-top: -0.2 em;
}
< textarea id = " textarea”>哟textarea > < /