saber酱的抱枕

Fly me to the moon

10/22
11:19
学习

使用CSS3的user-select属性禁止选择元素

前段时间看到一个网站屏蔽了选择操作,禁用JavaScript也无效,后来终于发现是这个网页上设置了user-select属性,禁止了用户选取网页上的元素。

user-select是css3的属性,可以设置允许用户选择哪些元素以及是否允许选择等。现在要使用user-select属性,还需要加私有前缀,如下:

-ms-user-select
-moz-user-select
-webkit-user-select

-ms-user-select 可设置 4 个值:
auto – 如果该元素包含可编辑的文本(如输入元素或可编辑内容的元素),则可以选择文本。否则,元素内容是否可选择由父节点的值决定。
none – 不可以选择文本
text – 可以选择文本
element – 可以选择文本,但选择范围受元素边界的约束

-moz-user-select和-webkit-user-select:
auto   默认值,用户可以选中元素中的内容
none  用户不能选择元素中的任何内容
text   用户可以选择元素中的文本
element  文本可选,但仅限元素的边界内(只有IE和FF支持)
all   在编辑器内,如果双击/上下文点击发生在子元素上,改值的最高级祖先元素将被选中。

-moz-user-select还有个私有的值:-moz-none,它表示元素和子元素的文本将不可选,但是,子元素可以通过text重设回可选。


我们可以通过JavaScript生成css,来覆盖之前定义的user-select,达到允许我们选择元素的目的。

!function(){
	var myStyle=document.createElement("style");
	myStyle.type="text/css";
	var str="*{-webkit-user-select:text !important}";
	myStyle.appendChild(document.createTextNode(str));
	document.body.appendChild(myStyle);
}()

上面的代码只设置了-webkit-user-select,有需要的话可以再添加其他前缀。


ps:对于用JavaScript禁止我们选择、复制的情况,除了禁止这个网站运行JavaScript之外,还可以用JavaScript来解除限制:

(function() { function R(a){ona ="on"+a; if(window.addEventListener) window.addEventListener(a, function (e) { for(var n=e.originalTarget; n; n=n.parentNode) n[ona]=null; }, true); window[ona]=null; document[ona]=null; document.onkeydown=null; if(document.body) document.body[ona]=null; document.body.oncopy=null; } R("contextmenu"); R("click"); R("mousedown"); R("mouseup"); R("selectstart");})()

使用CSS3的user-select属性禁止选择元素