4937 css cross-browser highlight textselection
对于像按钮一样的锚点(例如,Stack Overflow页面顶部的问题,标签,用户等)或标签,如果用户意外选择了文本,是否有一种CSS标准方法来禁用突出显示效果?
我意识到这可以通过JavaScript来完成,并且有点谷歌搜索产生了仅Mozilla -moz-user-select选项.
是否有符合标准的方法来实现CSS,如果没有,那么"最佳实践"方法是什么?
Blo*_*sie 7063
更新2017年1月:
根据我可以使用,user-select除了Internet Explorer 9和早期版本之外,所有浏览器目前都支持(但遗憾的是仍然需要供应商前缀).
所有正确的CSS变体都是:
.noselect {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Safari */
-khtml-user-select: none; /* Konqueror HTML */
-moz-user-select: none; /* Old versions of Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently
supported by Chrome, Opera and Firefox */
}Run Code Online (Sandbox Code Playgroud)
<p>
Selectable text.
</p>
<p class="noselect">
Unselectable text.
</p>Run Code Online (Sandbox Code Playgroud)
请注意,它是非标准功能(即不是任何规范的一部分).它不能保证在任何地方都可以工作,并且浏览器之间的实现可能存在差异,并且在将来的浏览器中可能会失去对它的支持.
可以在Mozilla Developer Network文档中找到更多信息.
Tim*_*own 817
在大多数浏览器中,这可以使用CSS user-select属性的专有变体来实现,最初提出然后在CSS3中放弃,现在在CSS UI Level 4中提出:
*.unselectable {
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
/*
Introduced in Internet Explorer 10.
See http://ie.microsoft.com/testdrive/HTML5/msUserSelect/
*/
-ms-user-select: none;
user-select: none;
}
Run Code Online (Sandbox Code Playgroud)
对于IE <10和Opera <15,您将需要使用unselectable您希望不可选择的元素的属性.您可以使用HTML中的属性进行设置:
<div id="foo" unselectable="on" class="unselectable">...</div>
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这个属性不是继承的,这意味着你必须在一个内部的每个元素的开始标记中放置一个属性<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"));
Run Code Online (Sandbox Code Playgroud)
更新2014年4月30日:每当向树添加新元素时,都需要重新运行此树遍历,但是@Han的评论似乎可以通过添加在目标mousedown上设置的事件处理程序来避免这种情况.unselectable这件事.有关详细信息,请参见http://jsbin.com/yagekiji/1.
这仍然没有涵盖所有可能性.虽然不可能在不可选择的元素中启动选择,但在某些浏览器(例如IE和Firefox)中,仍然无法阻止在不可选元素之前和之后开始的选择而不会使整个文档无法选择.
Pek*_*ica 187
IE的JavaScript解决方案是
onselectstart="return false;"
Run Code Online (Sandbox Code Playgroud)
X-I*_*nce 181
在CSS 3的用户选择属性可用之前,基于Gecko的浏览器支持-moz-user-select您已找到的属性.基于WebKit和Blink的浏览器支持该-webkit-user-select属性.
当然,在不使用Gecko渲染引擎的浏览器中不支持这一点.
没有符合"标准"的快速简便的方法; 使用JavaScript是一种选择.
真正的问题是,为什么您希望用户无法突出显示并可能复制和粘贴某些元素?我没有遇到过一次我不想让用户突出显示我网站的某个部分.我的几个朋友在花了很多时间阅读和编写代码之后,会使用突出显示功能来记住他们在页面上的位置,或提供一个标记,以便他们的眼睛知道下一步要看哪里.
我唯一能看到它有用的地方是,如果用户复制并粘贴网站,那么表格的按钮不应复制和粘贴.
Ben*_*ier 134
如果要在除<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;
}
Run Code Online (Sandbox Code Playgroud)
ZEC*_*nmo 121
在上面的解决方案中,选择停止,但用户仍然认为您可以选择文本,因为光标仍然会改变.要保持静态,您必须设置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;
}Run Code Online (Sandbox Code Playgroud)
<p>
Selectable text.
</p>
<p class="noselect">
Unselectable text.
</p>Run Code Online (Sandbox Code Playgroud)
这将使您的文本完全平坦,就像在桌面应用程序中一样.
sea*_*tar 105
您可以在Firefox和Safari中执行此操作(Chrome也可以?)
::selection { background: transparent; }
::-moz-selection { background: transparent; }
Run Code Online (Sandbox Code Playgroud)
小智 78
WebKit的解决方法:
/* Disable tap highlighting */
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
我在CardFlip示例中找到了它.
Tom*_*ger 69
我喜欢混合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;
}
Run Code Online (Sandbox Code Playgroud)
然后,如果您正在使用jQuery,请在$(document).ready()块中添加:
if (($.browser.msie && $.browser.version < 10) || $.browser.opera) $('.draggable').find(':not(input)').attr('unselectable', 'on');
Run Code Online (Sandbox Code Playgroud)
我想你仍然希望任何输入元素可以交互,因此:not()伪选择器.'*'如果你不在乎,你可以使用.
警告:IE9可能不需要这个额外的jQuery片段,所以你可能想在那里添加一个版本检查.
Ale*_*Ale 66
.hidden:after {
content: attr(data-txt);
}Run Code Online (Sandbox Code Playgroud)
<p class="hidden" data-txt="Some text you don't want to be selected"></p>Run Code Online (Sandbox Code Playgroud)
不过,这不是最好的方式.
Ali*_*eza 66
您可以使用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>Run Code Online (Sandbox Code Playgroud)
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;
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
Ela*_*ter 59
此外,对于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; /* Internet Explorer */
}
Run Code Online (Sandbox Code Playgroud)
use*_*506 57
尝试将此行插入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;
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*sso 52
您可以使用mixin执行此操作:
// Disable selection
@mixin disable-selection {
-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 */
}
// No selectable element
.no-selectable {
@include disable-selection;
}
Run Code Online (Sandbox Code Playgroud)
在 HTML 标签中:
<div class="no-selectable">TRY TO HIGHLIGHT</div>
Run Code Online (Sandbox Code Playgroud)
在这个CodePen 中尝试一下。
如果您使用autoprefixer,您可以删除其他前缀。
浏览器兼容性在这里。
Kaz*_*Kaz 49
快速黑客更新: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; /* Internet Explorer 10+ */
user-select: none; /* Likely future */
}
Run Code Online (Sandbox Code Playgroud)
正如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 */
}
Run Code Online (Sandbox Code Playgroud)
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
<div id="foo" unselectable="on" class="unselectable">...</div>
Run Code Online (Sandbox Code Playgroud)
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"));
Run Code Online (Sandbox Code Playgroud)
-webkit-user-select: none;
-moz-user-select: none;
Run Code Online (Sandbox Code Playgroud)
onselectstart="return false;"
Run Code Online (Sandbox Code Playgroud)
::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;
}
Run Code Online (Sandbox Code Playgroud)
<div class="draggable"></div>
Run Code Online (Sandbox Code Playgroud)
.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;
}
Run Code Online (Sandbox Code Playgroud)
if ($.browser.msie)
$('.draggable').find(':not(input)').attr('unselectable', 'on');
Run Code Online (Sandbox Code Playgroud)
sur*_*wat 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;
Run Code Online (Sandbox Code Playgroud)
这应该可行,但它不适用于旧浏览器.存在浏览器兼容性问题.
Bee*_*exe 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;
}
Run Code Online (Sandbox Code Playgroud)
hbw*_*hbw 34
除了Mozilla-only属性之外,没有办法只使用标准CSS(截至目前)禁用文本选择.
如果您注意到,Stack Overflow不会禁用其导航按钮的文本选择,我建议不要在大多数情况下这样做,因为它会修改正常的选择行为并使其与用户的期望发生冲突.
r3w*_*3wt 33
这适用于某些浏览器:
::selection{ background-color: transparent;}
::moz-selection{ background-color: transparent;}
::webkit-selection{ background-color: transparent;}
Run Code Online (Sandbox Code Playgroud)
只需在逗号分隔的选择器前面添加所需的元素/ 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;}
Run Code Online (Sandbox Code Playgroud)
其他答案更好; 这应该被视为最后的手段/收获.
Gau*_*wal 32
假设有两个这样的div
.second {
cursor: default;
user-select: none;
-webkit-user-select: none;
/* Chrome/Safari/Opera */
-moz-user-select: none;
/* Firefox */
-ms-user-select: none;
/* Internet Explorer/Edge */
-webkit-touch-callout: none;
/* iOS Safari */
}Run Code Online (Sandbox Code Playgroud)
<div class="first">
This is my first div
</div>
<div class="second">
This is my second div
</div>Run Code Online (Sandbox Code Playgroud)
将光标设置为默认值,以便为用户提供无法选择的感觉/
需要使用前缀来支持所有没有前缀的浏览器,这可能不适用于所有答案.
kar*_*raj 30
如果不需要颜色选择,这将非常有用:
::-moz-selection { background:none; color:none; }
::selection { background:none; color:none; }
Run Code Online (Sandbox Code Playgroud)
...所有其他浏览器修复程序.它将在Internet Explorer 9或更高版本中运行.
小智 28
将其添加到要禁用文本选择的第一个div:
onmousedown='return false;'
onselectstart='return false;'
Run Code Online (Sandbox Code Playgroud)
Sem*_*Zen 25
为了得到我需要的结果,我发现我必须同时使用::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;
}
Run Code Online (Sandbox Code Playgroud)
Aut*_*ico 22
这不是CSS,但值得一提:
$("your.selector").disableSelection();
Run Code Online (Sandbox Code Playgroud)
apo*_*pse 21
检查我的解决方案没有JavaScript:
li:hover {
background-color: silver;
}
#id1:before {
content: "File";
}
#id2:before {
content: "Edit";
}
#id3:before {
content: "View";
}Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
应用我的技术的弹出菜单:http://jsfiddle.net/y4Lac/2/
小智 21
虽然这个伪元素在CSS选择器级别3的草稿中,但它在候选推荐阶段被删除,因为它的行为似乎不明确,特别是对于嵌套元素,并且没有实现互操作性.
它正在How :: selection在嵌套元素上进行讨论.
尽管它是在浏览器中实现的,但您可以通过在选项卡设计(在您的情况下)中使用相同的颜色和背景颜色来模糊未选择的文本.
p { color: white; background: black; }
Run Code Online (Sandbox Code Playgroud)
p::-moz-selection { color: white; background: black; }
p::selection { color: white; background: black; }
Run Code Online (Sandbox Code Playgroud)
禁止用户选择文本会增加可用性问题.
Rix*_*unt 21
.no-select::selection, .no-select *::selection {
background-color: Transparent;
}
.no-select { /* Sometimes I add this too. */
cursor: default;
}
Run Code Online (Sandbox Code Playgroud)
<span>RixTheTyrunt is da best!</span>
<br>
<span class="no-select">RixTheTyrunt is da best!</span>
Run Code Online (Sandbox Code Playgroud)
片段:
.no-select::selection, .no-select *::selection {
background-color: Transparent;
}
.no-select {
/* Sometimes I add this too. */
cursor: default;
}Run Code Online (Sandbox Code Playgroud)
<span>RixTheTyrunt is da best!</span>
<br>
<span class="no-select">RixTheTyrunt is da best!</span>Run Code Online (Sandbox Code Playgroud)
.no-select {
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
}
Run Code Online (Sandbox Code Playgroud)
片段:
.no-select {
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
}Run Code Online (Sandbox Code Playgroud)
<span>RixTheTyrunt is da best!</span>
<br>
<span class="no-select">RixTheTyrunt is da best!</span>Run Code Online (Sandbox Code Playgroud)
首先,解决问题。然后,编写代码。
约翰·约翰逊
Moh*_*ved 16
我从CSS-Tricks网站上学到了很多东西.
user-select: none;
Run Code Online (Sandbox Code Playgroud)
这也是:
::selection {
background-color: transparent;
}
::moz-selection {
background-color: transparent;
}
::webkit-selection {
background-color: transparent;
}
Run Code Online (Sandbox Code Playgroud)
cod*_*hMe 15
轻松完成:
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
Run Code Online (Sandbox Code Playgroud)
或者:
假设你有一个<h1 id="example">Hello, World!</h1>,你需要做的是删除那个的innerHTML h1:在这种情况下你好,世界.然后你将不得不去css并这样做:
#example::before // You can of course 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.
}
Run Code Online (Sandbox Code Playgroud)
现在它只是认为它是一个块元素,而不是文本.
Tha*_*han 12
在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*/
}Run Code Online (Sandbox Code Playgroud)
<p>
Selectable
</p>
<p class="noselect">
Unselectable
</p>Run Code Online (Sandbox Code Playgroud)
小智 11
尝试使用这个:
::selection {
background: transparent;
}
Run Code Online (Sandbox Code Playgroud)
如果您希望指定不在特定元素内部选择,只需将元素类或id放在选择规则之前,例如:
.ClassNAME::selection {
background: transparent;
}
#IdNAME::selection {
background: transparent;
}
Run Code Online (Sandbox Code Playgroud)
jas*_*ard 11
* {
-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 */
}
Run Code Online (Sandbox Code Playgroud)
小智 10
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
Run Code Online (Sandbox Code Playgroud)
Pus*_*ngh 10
这种突出显示效果是由于名为hover(onMouseHover)的操作引起的.当您将鼠标悬停在任何标签上时,它的颜色将会改变.举个例子说.
<div class="menu">
<ul class="effect">
<li>Questions</li>
<li>JOBS</li>
<li>Users</li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
如果你想突出显示它,你可以给任何颜色,否则你不能给它.
小智 9
你可以使用用户选择属性,如下所示..
p {
-webkit-user-select: none; /* Chrome all and Safari all */
-moz-user-select: none; /* Firefox all */
-ms-user-select: none; /* Internet Explorer 10 and later */
user-select: none; /* Likely future */
}
Run Code Online (Sandbox Code Playgroud)
向您的 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>
Run Code Online (Sandbox Code Playgroud)
使用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;
}Run Code Online (Sandbox Code Playgroud)
<div>
Blabla
<br/> More Blabla
<br/> More Blabla...
</div>Run Code Online (Sandbox Code Playgroud)
你试过这个吗?
.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;
}
Run Code Online (Sandbox Code Playgroud)
我看到很多详细的答案,但我相信仅编写这行代码就足以完成所需的任务:
*{
-webkit-user-select: none;
}
Run Code Online (Sandbox Code Playgroud)
更好的是,您可以禁用文本选择。
如果您喜欢 Sass (SCSS),并且不想使用Compass,您可以这样做:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1787101 次 |
| 最近记录: |