如何禁用文本选择突出显示?
对于像按钮(例如,堆栈溢出页面顶部的问题,标签,用户等)或选项卡那样起作用的锚点,如果用户意外地选择文本,是否有CSS标准方法来禁用突出显示效果?
我意识到这可以通过JavaScript来完成,并且一点点搜索结果会产生Mozilla-only -moz-user-select
选项。
有没有一种符合标准的方法可以用CSS来实现,如果不是,那么“最佳实践”方法是什么?
更新2017年1月:
据我可以使用,除了Internet Explorer 9和更早版本以外,所有浏览器当前都支持user-select
(但遗憾的是仍然需要供应商前缀)。
所有正确的CSS变体是:
.noselect {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Safari */
-khtml-user-select: none; /* Konqueror HTML */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently
supported by Chrome and Opera */
}
<p>
Selectable text.
</p>
<p class="noselect">
Unselectable text.
</p>
在大多数浏览器中,这可以通过使用CSS user-select
属性的专有变体来实现,最初提出然后在CSS3中放弃,现在在CSS UI Level 4中提出:
*.unselectable {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
/*
Introduced in IE 10.
See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
*/
-ms-user-select: none;
user-select: none;
}
对于IE <10和Opera <15,则需要使用unselectable
您希望是不可选择的元素的属性。 您可以使用HTML中的属性来设置它:
<div id="foo" unselectable="on" class="unselectable">...</div>
可悲的是,这个属性没有被继承,这意味着你必须在<div>
的每个元素的开始标签中放置一个属性。 如果这是一个问题,您可以改用JavaScript来为元素的后代递归执行此操作:
function makeUnselectable(node) {
if (node.nodeType == 1) {
node.setAttribute("unselectable", "on");
}
var child = node.firstChild;
while (child) {
makeUnselectable(child);
child = child.nextSibling;
}
}
makeUnselectable(document.getElementById("foo"));
更新2014年4月30日 :这树遍历需要重新运行每当一个新的元素被添加到树上,但由@Han,有可能通过增加以避免这样的评论似乎mousedown
事件处理程序,将unselectable
上事件的目标。 有关详细信息,请参阅http://jsbin.com/yagekiji/1。
这仍然不包括所有可能性。 尽管无法在不可选元素中启动选择,但在某些浏览器(例如IE和Firefox)中,仍然不可能阻止在不可选元素之前和之后开始的选择,而不会使整个文档不可选。
IE的JavaScript解决方案是
onselectstart="return false;"
链接地址: http://www.djcxy.com/p/95.html
上一篇: How to disable text selection highlighting?
下一篇: PUT vs. POST in REST