当用户“切换到”输入框时,我希望焦点效果通常会显示出来,但在点击时,我不希望它可见。
用户按下Tab键,现在聚焦于切换按钮上,我希望这个切换按钮有微弱的发光轮廓,而我当前已经能够做到这一点。
现在,
用户单击切换按钮或其相关标签,切换像往常一样改变, 但是,我希望光晕从一开始就不会出现,或者尽快消失。
我知道关于.blur()
,现在我正在使用setTimeout
进行一次简单修复,但我想知道是否有更好的方法来完成这个任务,或者是否可能有一个CSS-only解决方案。
当用户“切换到”输入框时,我希望焦点效果通常会显示出来,但在点击时,我不希望它可见。
用户按下Tab键,现在聚焦于切换按钮上,我希望这个切换按钮有微弱的发光轮廓,而我当前已经能够做到这一点。
现在,
用户单击切换按钮或其相关标签,切换像往常一样改变, 但是,我希望光晕从一开始就不会出现,或者尽快消失。
我知道关于.blur()
,现在我正在使用setTimeout
进行一次简单修复,但我想知道是否有更好的方法来完成这个任务,或者是否可能有一个CSS-only解决方案。
我认为许多前端开发人员在美观与无障碍最佳实践之间很难找到平衡点。这似乎是一个很好的妥协方案。
以下是我的做法。思路是当用户使用 Tab 键时切换轮廓线,当他们单击时关闭轮廓线。
document.addEventListener('keydown', function(e) {
if (e.keyCode === 9) {
$('body').addClass('show-focus-outlines');
}
});
document.addEventListener('click', function(e) {
$('body').removeClass('show-focus-outlines');
});
body:not(.show-focus-outlines) button:focus,
body:not(.show-focus-outlines) [tabindex]:focus {
outline: none;
}
我目前正在为公司做类似的事情。不幸的是,由于CSS不支持这种用例,您必须使用JavaScript。
以下是我所做的。
var btns = document.querySelectorAll('button');
var onMouseDown = function (evt) {
evt.target.dataset.pressed = 'true';
};
var onMouseUp = function (evt) {
evt.target.dataset.pressed = 'false';
};
var onFocus = function (evt) {
var element = evt.target;
if (element.dataset.pressed !== 'true') {
element.classList.add('focus');
}
};
var onBlur = function (evt) {
evt.target.classList.remove('focus');
};
for(var i = 0, l = btns.length; i < l; i++) {
btns[i].addEventListener('mousedown', onMouseDown);
btns[i].addEventListener('mouseup', onMouseUp);
btns[i].addEventListener('focus', onFocus);
btns[i].addEventListener('blur', onBlur);
}
* { box-sizing: border-box; }
body { background-color: white; }
button {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
min-width: 100px;
margin: 0 1px;
padding: 12px 10px;
font-size: 15px;
color: white;
background-color: #646e7c;
border: none;
border-radius: 5px;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.2);
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
button:focus { outline: none; }
button:active {
-webkit-transform: translateY(1px);
-moz-transform: translateY(1px);
transform: translateY(1px);
box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2);
}
button.focus {
font-weight: bold;
}
button.primary { background-color: #2093d0; }
button.success { background-color: #71a842; }
button.danger { background-color: #ef4448; }
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<button>Default</button>
<button class="primary">Primary</button>
<button class="success">Success</button>
<button class="danger">Danger</button>
</body>
</html>
基本上,我不依赖于浏览器的原生焦点,而是根据情况在我的按钮上添加/删除一个focus
类。
// scss
body[data-whatinput="keyboard"] {
button {
&:focus {
// other highlight code here
box-shadow: 0 0 5px rgba(81, 203, 238, 1);
}
}
}
或者
/* vanilla css */
body[data-whatinput="keyboard"] button:focus {
box-shadow: 0 0 5px rgba(81, 203, 238, 1);
}
input
、select
、textarea
和a
标签。jQuery UI 在这里描述了一些其他可制表元素。https://api.jqueryui.com/tabbable-selector/ - Adam Fraser.hide-focus :focus { outline: none }
。 - gpilotino