单击按钮后,所有按钮周围都有高亮显示。这是在Chrome中。
<button class="btn btn-primary btn-block">
<span class="icon-plus"></span> Add Page
</button>
我正在使用带有主题的Bootstrap,但我敢肯定不是这样:我之前在另一个项目中注意到这一点。
如果我使用<a>
标记代替,它将消失<button>
。为什么?如果我想使用<button>
该如何使它消失?
单击按钮后,所有按钮周围都有高亮显示。这是在Chrome中。
<button class="btn btn-primary btn-block">
<span class="icon-plus"></span> Add Page
</button>
我正在使用带有主题的Bootstrap,但我敢肯定不是这样:我之前在另一个项目中注意到这一点。
如果我使用<a>
标记代替,它将消失<button>
。为什么?如果我想使用<button>
该如何使它消失?
Answers:
我在另一页上找到了此问与答,并且覆盖按钮焦点样式对我来说很有用。此问题可能特定于带有Chrome的MacOS。
.btn:focus {
outline: none;
box-shadow: none;
}
但是请注意,这会影响可访问性,只有在按钮和输入的焦点状态保持一致后才建议这样做。根据下面的评论,那里有不能使用鼠标的用户。
.btn:active:focus
选择器以将其从活动状态中删除。
.btn-default, .btn-default:hover, .btn-default:active, .btn-default:active:focus, .btn-default:visited, .btn-default:focus { color: #dcdcdc; background-color: #232323; outline: none; }
您想要类似的东西:
<button class="btn btn-primary btn-block" onclick="this.blur();">...
.blur()方法可以正确删除焦点突出显示,并且不会弄乱Bootstraps的样式。
我的理解是,重点是首次应用于以下onMouseDown
事件,因此调用e.preventDefault()
中onMouseDown
可能会根据您的需要一个干净的解决方案。这当然是一种可访问性友好的解决方案,但是显然,它可以调整鼠标单击的行为,这可能与您的Web项目不兼容。
我当前正在使用此解决方案(在react-bootstrap
项目内),单击后我没有收到焦点闪烁或按钮保持焦点,但是我仍然可以选择焦点并以视觉方式可视化相同按钮的焦点。
onMouseDown={e => e.preventDefault()}
onKeyUp={(e) => {if (e.keyCode === 13 || e.keyCode === 32) handleClick()}
。
onKeyUp
事件内部调用e.preventDefault()。事实证明,如果您这样做,则在按下空格键或回车键并点按或单击任意位置后,按钮将保持焦点。
不敢相信还没有人发布此消息。
使用标签代替按钮。
<label type="button" class="btn btn-primary btn-block">
<span class="icon-plus"></span> Add Page
</label>
<a class="btn"><my-directive/></a>
尽管只删除所有焦点按钮的轮廓很容易(如user1933897的答案所示),但是从可访问性的角度来看,该解决方案是不好的(例如,请参见使用浏览器的默认焦点轮廓停止处理)
另一方面,如果您认为浏览器在单击后就集中了焦点,那么就不可能说服您的浏览器停止将所单击的按钮设置为具有焦点(我在看着您,OS X上的Chrome)。
所以,我们能做些什么?我想到了几个选择。
1)Javascript(jQuery): $('.btn').mouseup(function() { this.blur() })
您指示浏览器在单击按钮后立即将焦点移到任何按钮周围。通过使用mouseup
代替,click
我们保留了基于键盘的交互的默认行为(mouseup
不会被键盘触发)。
2)CSS: .btn:hover { outline: 0 !important }
在这里,仅关闭悬停按钮的轮廓。显然这并不理想,但在某些情况下可能就足够了。
:active:focus {outline:none;}
。
.on('mouseup', function() { ... })
而不是.mouseup()
这对我有用。我创建了一个覆盖必要CSS的自定义类。
.custom-button:focus {
outline: none !important;
border: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
-webkit-box-shadow将适用于Chrome和Safari浏览器。
border: none !important;
按钮以保持相同的尺寸
如果使用规则:focus { outline: none; }
删除轮廓,则链接或控件将是可聚焦的,但不会为键盘用户显示聚焦。像JS这样删除它的方法onfocus="blur()"
甚至更糟,并且将导致键盘用户无法与控件进行交互。
可以使用的技巧很不错,包括:focus { outline: none; }
在用户与鼠标进行交互时添加规则,并在检测到键盘交互时再次将其删除。Lindsay Evans为此创建了一个库:https : //github.com/lindsayevans/outline.js
但是我更愿意在html或body标签上设置一个类。并在何时使用此CSS文件中进行控制。
例如(内联事件处理程序仅用于演示目的):
<html>
<head>
<style>
a:focus, button:focus {
outline: 3px solid #000;
}
.no-focus a, .no-focus button {
outline: none;
}
</style>
</head>
<body id="thebody"
onmousedown="document.getElementById('thebody').classList.add('no-focus');"
onkeydown="document.getElementById('thebody').classList.remove('no-focus');">
<p>This her is <a href="#">a link</a></p>
<button>Click me</button>
</body>
</html>
我确实给了togheter一支钢笔:http ://codepen.io/snobojohan/pen/RWXXmp
但是请注意,存在性能问题。每次用户在鼠标和键盘之间切换时,这将强制重新粉刷。有关避免不必要的油漆的更多信息,http: //www.html5rocks.com/en/tutorials/speed/unnecessary-paints/
我注意到了同样的事情,即使它确实让我感到烦恼,但我相信没有适当的方法来处理此问题。
我建议不要使用给出的所有其他解决方案,因为它们会完全破坏按钮的可访问性,因此,现在,当您按一下该按钮时,就不会获得预期的焦点。
应该避免这种情况!
.btn:focus {
outline: none;
}
:focus-visible
伪类的:focus-visible
伪类可用于杀灭难看轮廓和聚焦上的按钮和各种元件的环对于未通过键盘进行导航的用户(即,通过触摸或鼠标点击)。
/**
* The default focus style is likely provided by Bootstrap or the browser
* but here we override everything else with a visually appealing cross-
* browser solution that works well on all focusable page elements
* including buttons, links, inputs, textareas, and selects.
*/
*:focus {
outline: 0 !important;
box-shadow:
0 0 0 .2rem #fff, /* use site bg color to create whitespace for faux focus ring */
0 0 0 .35rem #069 !important; /* faux focus ring color */
}
/**
* Undo the above focused button styles when the element received focus
* via mouse click or touch, but not keyboard navigation.
*/
*:focus:not(:focus-visible) {
outline: 0 !important;
box-shadow: none !important;
}
警告:从2020年开始,
:focus-visible
伪类在各种浏览器中均不受广泛支持。但是,polyfill非常易于使用。请参阅下面的说明。
.focus-visible
polyfill此解决方案使用普通的CSS类而不是上述的伪类,并且具有广泛的浏览器支持,因为 基于Javascript的官方polyfill。
注意:对于多个不支持classList的旧版浏览器,焦点可见的polyfill需要一个额外的polyfill:
<!-- place this code just before the closing </html> tag -->
<script src="https://cdn.polyfill.io/v2/polyfill.js?features=Element.prototype.classList"></script>
<script src="https://unpkg.com/focus-visible"></script>
以下是上面更详细记录的CSS解决方案的修改版本。
/**
* Custom cross-browser styles for keyboard :focus overrides defaults.
*/
*:focus {
outline: 0 !important;
box-shadow:
0 0 0 .2rem #fff,
0 0 0 .35rem #069 !important;
}
/**
* Remove focus styles for non-keyboard :focus.
*/
*:focus:not(.focus-visible) {
outline: 0 !important;
box-shadow: none !important;
}
如果您确实有任何想要在某人单击或使用触摸时显示聚焦环的项目,则只需将该focus-visible
类添加到DOM元素中即可。
<!-- This example uses Bootstrap classes to theme a button to appear like
a regular link, and then add a focus ring when the link is clicked --->
<button type="button" class="btn btn-text focus-visible">
Clicking me shows a focus box
</button>
资源:
演示:
<whatever>:focus { outline: none }
观点看,如果要考虑可访问性,那么比起这种解决方案,用轮廓隐藏空白框是一个更糟糕的主意。可访问性社区中确实存在一些人,他们希望您永远不要删除大纲,而是让所有内容都具有:focus样式(大纲或框阴影),并且不希望支持:focus-visible,直到浏览器实现允许用户指定用户是否偏好所有项目是否可聚焦。我喜欢认为:“ focus-visible”是介于设计关注点和a11y之间的快乐媒介。
迟了,但是谁知道这可能会帮助某个人。CSS看起来像:
.rhighlight{
outline: none !important;
box-shadow:none
}
HTML看起来像:
<button type="button" class="btn btn-primary rHighlight">Text</button>
这样,您可以保留btn及其相关的行为。
element:focus { box-shadow: none; }
删除了蓝色轮廓/阴影。
我在上面的评论中提到了这一点,但是为了清晰起见,值得将其作为单独的答案列出。只要您实际上不需要将焦点放在按钮上,就可以使用focus事件将其删除,然后再应用任何CSS效果:
$('buttonSelector').focus(function(event) {
event.target.blur();
});
这样可以避免使用click事件时可以看到的闪烁。这确实限制了界面,您将无法使用Tab键切换到按钮,但这在所有应用程序中都不是问题。
样式
.not-focusable:focus {
outline: none;
box-shadow: none;
}
使用
<button class="btn btn-primary not-focusable">My Button</button>
尝试使用此解决方案删除按钮周围的边框。在CSS中添加此代码。
尝试
button:focus{
outline:0px;
}
如果不起作用,请在下面使用。
button:focus{
outline:none !important;
}
对于想要纯CSS方式的人:
:focus:not(:focus-visible) { outline: none }
这也可能适用于链接等,此外,它还能保持键盘的可访问性。最后,不支持:focus-visible的浏览器将忽略它
focus-visible
现在有一个官方的polyfill。我对这个问题的回答stackoverflow.com/a/60219624/413538详细说明了如何真正理解所有这些问题。
我们遇到了类似的问题,并注意到Bootstrap 3 的选项卡(在Chrome中)没有问题。看起来他们使用的是大纲样式,这使浏览器可以决定最好的方法,而Chrome似乎可以完成您想要的工作:除非您单击该元素,否则在聚焦时显示大纲。
对支持的支持outline-style
很难确定,因为浏览器可以决定含义。最好签入一些浏览器并有一个后备规则。
另一种可能的解决方案是,当用户单击按钮时,使用Javascript侦听器添加一个类,然后使用另一个侦听器将焦点移到该类上。这样可以保持可访问性(可见的制表符),同时还可以防止Chrome浏览器在单击按钮时将按钮视为焦点的古怪行为。
JS:
$('button').click(function(){
$(this).addClass('clicked');
});
$('button').focus(function(){
$(this).removeClass('clicked');
});
CSS:
button:focus {
outline: 1px dotted #000;
}
button.clicked {
outline: none;
}
此处的完整示例:https : //jsfiddle.net/4bbb37fh/
.btn:focus:active {
outline: none;
}
这会删除单击时的轮廓,但在制表时保持焦点(对于a11y)
这最有效
.btn-primary.focus, .btn-primary:focus {
-webkit-box-shadow: none!important;
box-shadow: none!important;
}
在CSS中添加:
*, ::after, ::before {
box-sizing: border-box;
outline: none !important;
border: none !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
我找到了一个解决方案,只需在您的CSS代码中添加以下行即可。
button:focus { outline: none }
使用按钮触发“转换”事件时,我在MacOS和Chrome上遇到了同样的问题。如果有人阅读此文件,则已经在使用事件侦听器,可以通过.blur()
在操作后调用来解决它。
例:
nextQuestionButtonEl.click(function(){
if (isQuestionAnswered()) {
currentQuestion++;
changeQuestion();
} else {
toggleNotification("invalidForm");
}
this.blur();
});
尽管如果您还没有使用事件监听器,那么添加一个事件监听器可能会增加不必要的开销,并且像以前的答案一样提供样式解决方案会更好。
我在使用<a>
按钮时遇到了同样的问题,并且发现通过添加attr 使其至少对我而言正常运行,我错过了一种解决方法type="button"
。
<a type="button" class="btn btn-primary">Release Me!</a>
type
属性对此button
无效,并且是无效值。该属性接受MIME类型,并告诉客户端如果遵循该链接,则应期望获得什么样的数据(例如<a type="application/pdf" ...>
,
role="button"
但它不起作用(使用<button>
代替后<a>
)。我的实现特别要求an <a>
和not <button>
。因此,在进行了很多修改之后,我发现了这种解决方法(很可能是BS错误)!