对于类似按钮的锚点(例如,问题,标记,用户等)位于Stack Overflow页面的顶部)或标签,是否有一种CSS标准方法来禁用突出显示效果,如果用户意外选择文本?
我意识到这可以通过JavaScript完成,并且有点谷歌搜索产生了仅Mozilla -moz-user-select
选项。
使用CSS是否有符合标准的方法来实现这一目标,如果没有,那么“最佳实践”方法是什么?
答案 0 :(得分:6834)
更新2017年1月:
根据Can I use,除了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>
请注意,它是非标准功能(即不是任何规范的一部分)。它不能保证在任何地方都可以工作,并且浏览器之间的实现可能存在差异,并且将来的浏览器可能会失去对它的支持。
更多信息可在Mozilla Developer Network documentation中找到。
答案 1 :(得分:789)
在大多数浏览器中,这可以使用CSS user-select
属性originally proposed and then abandoned in 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&lt; 10和Opera&lt; 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)中,仍然无法阻止在不可选元素之前和之后开始的选择,而不会使整个文档无法选择。
答案 2 :(得分:181)
IE的JavaScript解决方案是
onselectstart="return false;"
答案 3 :(得分:174)
在CSS 3的user-select属性可用之前,基于Gecko的浏览器支持您已找到的-moz-user-select
属性。 WebKit和基于Blink的浏览器支持-webkit-user-select
属性。
当然,在不使用Gecko渲染引擎的浏览器中不支持此功能。
没有符合“标准”的快捷方式;使用JavaScript是一种选择。
真正的问题是,为什么您希望用户无法突出显示并推测复制和粘贴某些元素?我没有遇到过一次我不想让用户突出显示我网站的某个部分。我的几个朋友在花了很多时间阅读和编写代码之后,会使用突出显示功能来记住他们在页面上的位置,或提供一个标记,以便他们的眼睛知道下一步的位置。
我唯一能看到它有用的地方是,如果用户复制并粘贴网站,那么表格的按钮不应复制和粘贴。
答案 4 :(得分:127)
如果要禁用除<p>
元素之外的所有内容的文本选择,可以在CSS中执行此操作(注意-moz-none
允许覆盖子元素,这在其他元素中是允许的浏览器none
):
* {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: -moz-none;
-o-user-select: none;
user-select: none;
}
p {
-webkit-user-select: text;
-khtml-user-select: text;
-moz-user-select: text;
-o-user-select: text;
user-select: text;
}
答案 5 :(得分:117)
在上述解决方案中,选择停止,但用户仍然认为您可以选择文本,因为光标仍会更改。要保持静态,您必须设置CSS光标:
.noselect {
cursor: default;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
<p>
Selectable text.
</p>
<p class="noselect">
Unselectable text.
</p>
这将使您的文本完全平坦,就像在桌面应用程序中一样。
答案 6 :(得分:103)
您可以在Firefox和Safari中使用(Chrome也可以?)
::selection { background: transparent; }
::-moz-selection { background: transparent; }
答案 7 :(得分:76)
WebKit的解决方法:
/* Disable tap highlighting */
-webkit-tap-highlight-color: rgba(0,0,0,0);
我在CardFlip示例中找到了它。
答案 8 :(得分:68)
我喜欢混合CSS + jQuery解决方案。
要使<div class="draggable"></div>
内的所有元素都不可选,请使用此CSS:
.draggable {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
-ms-user-select: none;
user-select: none;
}
.draggable input {
-webkit-user-select: text;
-khtml-user-select: text;
-moz-user-select: text;
-o-user-select: text;
user-select: text;
}
然后,如果您使用的是jQuery,请在$(document).ready()
块中添加:
if (($.browser.msie && $.browser.version < 10) || $.browser.opera) $('.draggable').find(':not(input)').attr('unselectable', 'on');
我认为你仍然希望任何输入元素都可以交互,因此:not()
伪选择器。如果您不在乎,可以使用'*'
。
警告:IE9可能不需要这个额外的jQuery片段,所以你可能想在那里添加一个版本检查。
答案 9 :(得分:66)
.hidden:after {
content: attr(data-txt);
}
<p class="hidden" data-txt="Some text you don't want to be selected"></p>
但这不是最好的方式。
答案 10 :(得分:63)
您可以使用 CSS 或 JavaScript ,旧的IE浏览器也支持 JavaScript 方式,但如果不是你的情况,然后使用CSS方式:
<强> HTML / JavaScript的:强>
<html onselectstart='return false;'>
<body>
<h1>This is the Heading!</h1>
<p>And I'm the text, I won't be selected if you select me.</p>
</body>
</html>
<强> HTML / CSS:强>
.not-selectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
<body class="not-selectable">
<h1>This is the Heading!</h1>
<p>And I'm the text, I won't be selected if you select me.</p>
</body>
答案 11 :(得分:58)
此外,对于Internet Explorer,您需要添加伪类焦点(.ClassName:focus)和 outline-style:none 。
.ClassName,
.ClassName:focus {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
outline-style:none;/*IE*/
}
答案 12 :(得分:56)
尝试将此行插入CSS并在类属性中调用“disHighlight”:
.disHighlight{
user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
-webkit-touch-callout: none;
-o-user-select: none;
-moz-user-select: none;
}
答案 13 :(得分:47)
对于那些在触摸事件的Android浏览器中无法实现相同功能的用户,请使用:
html,body{
-webkit-touch-callout: none;
-webkit-user-select: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-tap-highlight-color: transparent;
}
答案 14 :(得分:47)
<强>工作强>
CSS:
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
-webkit-user-select: none;
这应该可行,但它不适用于旧浏览器。存在浏览器兼容性问题。
答案 15 :(得分:47)
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
user-select: none;
*.unselectable {
-moz-user-select: -moz-none;
-khtml-user-select: none;
-webkit-user-select: none;
user-select: none;
}
<div id="foo" unselectable="on" class="unselectable">...</div>
function makeUnselectable(node) {
if (node.nodeType == 1) {
node.unselectable = true;
}
var child = node.firstChild;
while (child) {
makeUnselectable(child);
child = child.nextSibling;
}
}
makeUnselectable(document.getElementById("foo"));
-webkit-user-select:none;
-moz-user-select:none;
onselectstart="return false;"
::selection { background: transparent; }
::-moz-selection { background: transparent; }
* {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: -moz-none;
-o-user-select: none;
user-select: none;
}
p {
-webkit-user-select: text;
-khtml-user-select: text;
-moz-user-select: text;
-o-user-select: text;
user-select: text;
}
<div class="draggable"></div>
.draggable {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
user-select: none;
}
.draggable input {
-webkit-user-select: text;
-khtml-user-select: text;
-moz-user-select: text;
-o-user-select: text;
user-select: text;
}
if ($.browser.msie) $('.draggable').find(':not(input)').attr('unselectable', 'on');
答案 16 :(得分:46)
答案 17 :(得分:34)
除了Mozilla-only属性之外,没有,只有标准CSS(截至目前)无法禁用文本选择。
如果您注意到,Stack Overflow不会禁用其导航按钮的文本选择,我建议在大多数情况下禁止这样做,因为它会修改正常的选择行为并使其与用户的期望发生冲突。
答案 18 :(得分:33)
这适用于部分浏览器:
::selection{ background-color: transparent;}
::moz-selection{ background-color: transparent;}
::webkit-selection{ background-color: transparent;}
只需在逗号分隔的选择器前添加所需的元素/ ID,不要有空格,如下所示:
h1::selection,h2::selection,h3::selection,p::selection{ background-color: transparent;}
h1::moz-selection,h2::moz-selection,h3::moz-selection,p::moz-selection{ background-color: transparent;}
h1::webkit-selection,h2::webkit-selection,h3::webkit-selection,p::webkit-selection{ background-color: transparent;}
其他答案更好;这应该被视为最后的手段/收藏。
答案 19 :(得分:32)
假设有两个这样的div
.second {
cursor: default;
user-select: none;
-webkit-user-select: none;
/* Chrome/Safari/Opera */
-moz-user-select: none;
/* Firefox */
-ms-user-select: none;
/* IE/Edge */
-webkit-touch-callout: none;
/* iOS Safari */
}
<div class="first">
This is my first div
</div>
<div class="second">
This is my second div
</div>
将光标设置为默认值,以便为用户提供无法选择的感觉/
前缀需要用于在没有前缀的所有浏览器中支持它,这可能不适用于所有答案。
答案 20 :(得分:29)
如果不需要颜色选择,这将非常有用:
::-moz-selection { background:none; color:none; }
::selection { background:none; color:none; }
...所有其他浏览器修复程序。它可以在Internet Explorer 9或更晚的版本中使用。
答案 21 :(得分:28)
注意:强>
正确答案是正确的,因为它会阻止您选择文本。但是,它并不会阻止您复制文本,因为我将在接下来的几个屏幕截图中显示(截至2014年11月7日)。
如您所见,我们无法选择数字,但我们能够复制它们。
经过测试:Ubuntu,Google Chrome 38.0.2125.111。
答案 22 :(得分:28)
将此添加到要禁用文本选择的第一个div:
onmousedown='return false;'
onselectstart='return false;'
答案 23 :(得分:24)
要获得我需要的结果,我发现我必须同时使用 ::selection
和 user-select
input.no-select:focus {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
input.no-select::selection {
background: transparent;
}
input.no-select::-moz-selection {
background: transparent;
}
答案 24 :(得分:22)
答案 25 :(得分:21)
快速黑客更新:2017年3月 - 来自CSS-Tricks
如果你为所有CSS用户选择属性设置了值'none',如下所示,那么就会出现一个问题。
.div{
-webkit-user-select: none; /* Chrome all / Safari all */
-moz-user-select: none; /* Firefox all */
-ms-user-select: none; /* IE 10+ */
user-select: none; /* Likely future */
}
正如CSS-Trick所述,问题是:
因此,您也可以使用下面的一个来强制选择整个元素,这是问题的解决方案。您所要做的就是将值“none”更改为“all”,如下所示:
.force-select {
-webkit-user-select: all; /* Chrome 49+ */
-moz-user-select: all; /* Firefox 43+ */
-ms-user-select: all; /* No support yet */
user-select: all; /* Likely future */
}
答案 26 :(得分:21)
虽然这个伪元素在CSS选择器级别3的草稿中,但它在候选推荐阶段被删除了,因为它的行为似乎不明确,特别是对于嵌套元素,并且没有实现互操作性
正在 How ::selection works on nested elements 中讨论。
尽管它已在浏览器中实现,但您可以通过在选项卡设计(在您的情况下)中使用相同的颜色和背景颜色来模糊未选择的文本。
p { color: white; background: black; }
p::-moz-selection { color: white; background: black; }
p::selection { color: white; background: black; }
禁止用户选择文字会引发可用性问题。
答案 27 :(得分:21)
在没有JavaScript的情况下检查我的解决方案:
li:hover {
background-color: silver;
}
#id1:before {
content: "File";
}
#id2:before {
content: "Edit";
}
#id3:before {
content: "View";
}
<ul>
<li><a id="id1" href="www.w1.com"></a>
<li><a id="id2" href="www.w2.com"></a>
<li><a id="id3" href="www.w3.com"></a>
</ul>
应用了我的技术的弹出式菜单:http://jsfiddle.net/y4Lac/2/
答案 28 :(得分:15)
我从CSS-Tricks网站获悉。
user-select: none;
这也是:
::selection{ background-color: transparent;}
::moz-selection{ background-color: transparent;}
::webkit-selection{ background-color: transparent;}
答案 29 :(得分:14)
轻松完成:
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
或者:
假设您有一个<h1 id="example">Hello, World!</h1>
,您要做的就是删除该h1
的innerHTML:在这种情况下为 Hello,World 。然后,您将必须转到CSS并执行以下操作:
#example::before //You can ofc use **::after** as well.
{
content: 'Hello, World!'; //Both single-quotes and double-quotes can be used here.
display: block; //To make sure it works fine in every browser.
}
现在,它只是认为它是一个块元素,而不是文本。
答案 30 :(得分:10)
此突出显示效果是由于名为hover(onMouseHover)的操作引起的。 当您将鼠标悬停在任何标签上时,它的颜色将会改变。 举个例子说。
<div class="menu">
<ul class="effect">
<li>Questions </li>
<li>JOBS </li>
<li>Users</li>
</ul>
</div>
<!-- CSS CODE -->
.effect:hover{
color: none;
}
如果你想突出显示它,你可以给任何颜色,否则你不能给它。
答案 31 :(得分:10)
尝试使用这个:
::selection {
background: transparent;
}
如果您希望在特定元素中指定not select,只需将元素类或id放在选择规则之前,例如:
.ClassNAME::selection {
background: transparent;
}
#IdNAME::selection {
background: transparent;
}
答案 32 :(得分:10)
目前所有浏览器都支持 user-select
。
这些是所有可用的正确 CSS 变体:
.noselect {
-webkit-user-select: none; /* Safari */
-webkit-touch-callout: none; /* iOS Safari */
-khtml-user-select: none; /* Konqueror HTML */
-ms-user-select: none; /* Internet Explorer/Edge */
-moz-user-select: none; /* Old versions of Firefox */
user-select: none; /* Non-prefixed version*/
}
<p>
Selectable
</p>
<p class="noselect">
Unselectable
</p>
答案 33 :(得分:9)
您可以使用用户选择属性,如下所示..
p {
-webkit-user-select: none; /* Chrome all / Safari all */
-moz-user-select: none; /* Firefox all */
-ms-user-select: none; /* IE 10+ */
user-select: none; /* Likely future */
}
答案 34 :(得分:9)
if(str.contains("template"))
{
if(str.contains("unsupported"))
mailType="unsupported";
else
if(str.contains("final_result"))
mailType="final_result";
else
if(str.contains("process_success"))
mailType="Process Success";
else
if(str.contains("receive"))
mailType="Receive";
else
if(str.contains("sen"))
mailType="sent";
else
if(str.contains("welcome"))
mailType="welcome";
else
if(str.contains("manual"))
mailType="Manual";
}
else
if(str.contains("properties"))
{
if(str.contains("unsupported"))
mailType="unsupported";
else
if(str.contains("final_result"))
mailType="final_result";
else
if(str.contains("process_success"))
mailType="Process Success";
else
if(str.contains("receive"))
mailType="Receive";
else
if(str.contains("sen"))
mailType="sent";
else
if(str.contains("welcome"))
mailType="welcome";
else
if(str.contains("manual"))
mailType="Manual";
}
答案 35 :(得分:9)
* {
-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 */
}
答案 36 :(得分:9)
使用might cause issues with Ivy too,您可以执行以下操作:
@item
在HTML标记中:
class Action
def initialize(customerMoney)
@money = customerMoney
@item = [{ name: :milk, price: 2.99 }, { name: :eggs, price: 1.50 }, { name: :bread, price: 2.00 }]
end
def CheckPrice(item)
@item.each do |x|
return x[:price] if x[:name] == item
end
end
def AddItem(item)
i = 0
@item.each do |x|
if x[:name] == item
x
end
end
end
def CheckTotal(basket)
total = 0
basket.each do |x|
total += x[:price]
end
puts total
end
end
myBasket = []
customer = Action.new(20)
myBasket.append(customer.AddItem(:bread))
p myBasket
答案 37 :(得分:8)
在CSS中添加一个类,该类定义您不能选择或突出显示元素。我有一个例子:
<style>
.no_highlighting{
user-select: none;
}
.anchor_without_decoration:hover{
text-decoration-style: none;
}
</style>
<a href="#" class="anchor_without_decoration no_highlighting">Anchor text</a>
答案 38 :(得分:6)
使用CSS-
div {
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
-o-user-select: none;
"unselectable='on' onselectstart="return false;"
onmousedown="return false;
}
<div>
Blabla
<br/> More Blabla
<br/> More Blabla...
</div>
答案 39 :(得分:5)
您尝试过吗?
.disableSelect{
user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
-webkit-touch-callout: none;
-o-user-select: none;
-moz-user-select: none;
pointer-events:none;
}
答案 40 :(得分:4)
我看到了许多详细的答案,但我相信仅编写这行代码就足以完成所需的任务:
*{
-webkit-user-select: none;
}
答案 41 :(得分:4)
我将各种浏览器CSS选择属性与Internet Explorer所需的不可选标记相结合。 9。
<style>
[unselectable="on"] {
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer 10+/Edge */
user-select: none; /* Standard */
}
</style>
<div unselectable="on">Unselectable Text</div>
答案 42 :(得分:4)
更好的是,您可以禁用文字选择。
如果你喜欢SASS(SCSS),并且你不想使用指南针,你可以这样做:
styles.scss
@mixin user-select($select) {
-webkit-touch-callout:#{$select};
@each $pre in -webkit-, -moz-, -ms-, -o-, -khtml- {
#{$pre + user-select}: #{$select};
}
#{user-select}: #{$select};
}
.no-select {
@include user-select(none);
}
答案 43 :(得分:2)
用于Internet Explorer的基于JavaScript的解决方案是:
onselectstart="return false;"
答案 44 :(得分:1)
也许你可以使用这个解决方案:在
之前
nav li {
display: inline-block;
position: relative;
}
nav li a {
display: inline-block;
padding: 10px 20px;
}
nav li a:hover {
color: red;
}
nav li.disabled:before {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
&#13;
<nav>
<ul>
<li><a href="#">Link</a></li>
<li class="disabled"><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</nav>
&#13;
JsFiddle - https://jsfiddle.net/grinmax_/9L1cckxu/
答案 45 :(得分:0)
您可能还希望在触摸禁止选择其元素的元素(如按钮)时阻止上下文菜单出现。为此,请将此代码添加到整个页面或仅添加那些按钮元素:
$("body").on("contextmenu",function(e){
return false;
});
答案 46 :(得分:0)
存在一个尚未获得解析器的错误,因此我们可以利用它:
::-moz-selection {
}
::selection {
}
voilà,没有任何高亮显示,而是因为有错误或功能?
答案 47 :(得分:0)
这可能有效
::selection {
color: none;
background: none;
}
/* For Mozilla Firefox */
::-moz-selection {
color: none;
background: none;
}
答案 48 :(得分:0)
::selection {background: transparent; color: transparent;}
::-moz-selection {background: transparent; color: transparent;}
答案 49 :(得分:-2)
<script type="text/javascript">
if(typeof document.onselectstart!="undefined"){
document.onselectstart=new Function ("return false");
}
else{
document.onmousedown= new Function ("return false");
document.onmouseup= new Function ("return true");
}
</script>