这个问题在这里已经有答案了:

我正在构建一个带有一些文本元素的 HTML UI,例如选项卡名称,这些元素在选择时看起来很糟糕。不幸的是,用户很容易双击选项卡名称,这在许多浏览器中默认选择它。

我也许可以用 JavaScript 技巧来解决这个问题(我也想看到这些答案)——但我真的希望 CSS/HTML 中有一些东西可以直接在所有浏览器上运行。

有帮助吗?

解决方案

在大多数浏览器中,这可以使用 CSS 来实现:

*.unselectable {
   -moz-user-select: -moz-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,您需要使用 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"));

其他提示

<script type="text/javascript">

/***********************************************
* Disable Text Selection script- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code

***********************************************/


function disableSelection(target){

    if (typeof target.onselectstart!="undefined") //IE route
        target.onselectstart=function(){return false}

    else if (typeof target.style.MozUserSelect!="undefined") //Firefox route
        target.style.MozUserSelect="none"

    else //All other route (ie: Opera)
        target.onmousedown=function(){return false}

    target.style.cursor = "default"
}



//Sample usages
//disableSelection(document.body) //Disable text selection on entire body
//disableSelection(document.getElementById("mydiv")) //Disable text selection on element with id="mydiv"


</script>

编辑

代码显然来自 http://www.dynamicdrive.com

所有正确的 CSS 变体是:

-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;

尝试这个:

<div onselectstart="return false">some stuff</div>

简单,但有效...适用于所有主要浏览器的当前版本。

对于 Firefox,您可以将 CSS 声明“-moz-user-select”应用到“none”。查看他们的文档, 用户选择.

正如他们所说,这是未来“用户选择”的“预览”,所以也许 歌剧 或者 网络工具包基于 的浏览器将支持这一点。我还记得为 Internet Explorer 找到了一些东西,但我不记得是什么:)。

无论如何,除非在特定情况下文本选择导致某些动态功能失败,否则您不应该真正覆盖用户对网页的期望,即能够选择他们想要的任何文本。

我发现这里描述的 CSS 取得了一定程度的成功 http://www.quirksmode.org/css/selection.html:

::selection {
    background-color: transparent;
}

它解决了我在使用 ThemeRoller 时遇到的大部分问题 ul AIR 应用程序(WebKit 引擎)中的元素。仍然得到一个小的(大约。15 x 15) 一片虚无被选中,但之前已经选择了一半页面。

将 div 绝对定位在 z-index 较高的文本区域上,并为这些 div 提供透明 动图 背景图形。

经过更多思考后请注意 - 您需要链接这些“封面”,因此单击它们会将您带到选项卡应该所在的位置,这意味着您可以/应该将锚元素设置为 display:box, ,宽度和高度设置以及透明背景图像。

有关为什么可能需要抑制选择的示例,请参阅 相似时间线, ,它使用拖放来探索时间线,在此期间意外的垂直鼠标移动会导致标签意外突出显示,这看起来很奇怪。

对于野生动物园来说, -khtml-user-select: none, ,就像 Mozilla 的 -moz-user-select (或者,在 JavaScript 中, target.style.KhtmlUserSelect="none";).

“如果您的内容真的很有趣,那么您最终几乎无法做到保护”

确实如此,但根据我的经验,大多数复制与“最终”或极客或坚决的抄袭者或类似的东西无关。这通常是由无知的人随意复制的,即使是简单的、容易被击败的保护(很容易被像我们这样的人击败)也能很好地阻止它们。他们对“查看源代码”或缓存或其他任何东西一无所知......哎呀,他们甚至不知道什么是网络浏览器,也不知道他们正在使用网络浏览器。

这是一个 萨斯 mixin (scss) 对于那些感兴趣的人。 罗盘/CSS 3 似乎没有用户选择的 mixin。

// @usage use within a rule
// ex. img {@include user-select(none);}
// @param assumed valid user-select value
@mixin user-select($value)
{
    & {
        -webkit-touch-callout: $value;
        -webkit-user-select: $value;
        -khtml-user-select: $value;
        -moz-user-select: $value;
        -ms-user-select: $value;
        user-select: $value;
    }
}

尽管 Compass 会以更稳健的方式做到这一点,即仅添加对您选择的供应商的支持。

如果看起来很糟糕,您可以使用 CSS 来更改所选部分的外观。

任何 JavaScript 或 CSS 方法都可以通过 Firebug 轻松绕过(如 Flickr 的情况)。

您可以使用 ::selection 伪元素 在 CSS 中更改突出显示颜色。

如果选项卡是链接并且 活动状态下的虚线矩形 值得关注,您也可以将其删除(当然要考虑可用性)。

在很多情况下,关闭选择性可以增强用户体验。

例如,允许用户复制页面上的文本块,而不复制与其关联的任何界面元素的文本(这将散布在正在复制的文本中)。

也可以选择图像。

使用 JavaScript 取消选择文本是有限制的,因为即使在您想要选择的地方也可能发生这种情况。为了确保职业生涯的丰富和成功,请避开所有需要影响或管理浏览器的能力超出普通范围的要求......当然,除非他们给你很高的报酬。

有趣的是,以下内容在 Firefox 中有效,如果我删除写入行,它就不起作用。任何人都知道为什么需要写入线。

<script type="text/javascript">
document.write(".");
document.body.style.MozUserSelect='none';
</script>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top