Cách tắt tính năng tô sáng lựa chọn văn bản


5204

Đối với các neo hoạt động như các nút (ví dụ: Câu hỏi , Thẻ , Người dùng , v.v. ở đầu trang Stack Overflow) hoặc các tab, có cách nào để chuẩn hóa hiệu ứng tô sáng nếu người dùng vô tình chọn văn bản không?

Tôi nhận ra điều này có thể được thực hiện với JavaScript và một chút googling mang lại -moz-user-selecttùy chọn chỉ có Mozilla .

Có cách nào tuân thủ tiêu chuẩn để thực hiện điều này với CSS không, và nếu không, cách tiếp cận "thực hành tốt nhất" là gì?


7
các phần tử trong phần tử phù thủy có thể làm nổi bật bị vô hiệu hóa, có thể làm nổi bật tính năng trong css trong thuộc tính kiểu hoặc lớp không? hay nói cách khác, có những giá trị khác cho -webkit-user-select ect. khác hơn là không?

7
Liên quan: stackoverflow.com/questions/16600479/ cảm = cách chỉ cho phép một số phần tử con được chọn
JK.

9
Có một lỗi trong một số trình duyệt khi thực hiện "Chọn tất cả" (CTRL + A và CMD + A) vẫn chọn mọi thứ. Điều này có thể được chiến đấu với màu lựa chọn trong suốt: ::selection { background: transparent; } ::-moz-selection { background: transparent; }
DaAwgieP

12
Tôi chỉ có thể nói: xin đừng làm điều này. Từ kinh nghiệm của tôi, tôi thường không muốn chọn một số văn bản cũng đóng vai trò là một nút, để sao chép-dán nó vào một nơi khác. Sẽ là không thể tưởng tượng nổi khi không thể làm điều đó bởi vì một số nhà phát triển web đã cố gắng vô hiệu hóa tính năng này cho tôi. Vì vậy, đừng làm điều này trừ khi bạn có một lý do rất, rất tốt.
kajacx

3
Trong năm 2017, đó là cách tốt hơn để sử dụng postcssautoprefixervà phiên bản trình duyệt bộ, sau đó postcsslàm cho mọi thứ mát mẻ.
AmerllicA

Câu trả lời:


7324

CẬP NHẬT tháng 1 năm 2017:

Theo Tôi có thể sử dụng , user-selecthiện tại được hỗ trợ trong tất cả các trình duyệt ngoại trừ Internet Explorer 9 và các phiên bản trước đó (nhưng đáng buồn là vẫn cần tiền tố của nhà cung cấp).


Tất cả các biến thể CSS chính xác là:

.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, Edge, Opera and Firefox */
}
<p>
  Selectable text.
</p>
<p class="noselect">
  Unselectable text.
</p>


Lưu ý rằng user-selectđang trong quá trình tiêu chuẩn hóa (hiện đang trong dự thảo làm việc của W3C ). Nó không được đảm bảo để hoạt động ở mọi nơi và có thể có sự khác biệt trong việc triển khai giữa các trình duyệt và trong các trình duyệt trong tương lai có thể bỏ hỗ trợ cho nó.


Thông tin thêm có thể được tìm thấy trong tài liệu Mạng của Nhà phát triển Mozilla .


38
mã molokoloco đẹp: D, mặc dù cá nhân tôi sẽ tránh xa việc sử dụng nó, vì đôi khi bạn có thể cần các giá trị khác nhau cho các trình duyệt khác nhau và nó phụ thuộc vào JavaScript. Tạo một lớp và thêm nó vào phần tử của bạn hoặc áp dụng css cho loại phần tử của bạn trong biểu định kiểu của bạn là bằng chứng khá rõ ràng.
Blowsie

58
'người dùng chọn'- Giá trị: không | văn bản | chuyển đổi | yếu tố | yếu tố | tất cả | kế thừa - w3.org/TR/2000/WD-css3-userint-20000216
Blowsie

34
Trên thực tế -o-user-select không được triển khai trong Opera. Thay vào đó, nó thực hiện thuộc tính không thể chọn của IE.
Tim Down

30
Vì một số lý do, điều này một mình không hoạt động trong IE8, sau đó tôi đã thêm vào <div onselectstart="return false;">div chính của mình.
robasta

308
chuyện này thật vớ vẩn! rất nhiều cách khác nhau để làm điều tương tự hãy tạo một tiêu chuẩn mới cho người dùng lựa chọn. chúng tôi sẽ gọi nó standard-user-select. sau đó chúng ta sẽ không có những vấn đề này. mặc dù để tương thích ngược, chúng ta cũng nên bao gồm những người khác. vì vậy bây giờ mã trở thành -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; standard-user-select: none;. ah, tốt hơn nhiều
Claudiu

854

Trong hầu hết các trình duyệt, điều này có thể đạt được bằng cách sử dụng các biến thể độc quyền trên thuộc tính CSS user-select, ban đầu được đề xuất và sau đó bị bỏ rơi trong CSS 3 và hiện được đề xuất trong CSS UI Cấp 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;
}

Đối với Internet Explorer <10 và Opera <15, bạn sẽ cần sử dụng unselectablethuộc tính của thành phần bạn muốn không thể chọn. Bạn có thể thiết lập điều này bằng cách sử dụng một thuộc tính trong HTML:

<div id="foo" unselectable="on" class="unselectable">...</div>

Đáng buồn là thuộc tính này không được kế thừa, có nghĩa là bạn phải đặt một thuộc tính vào thẻ bắt đầu của mọi thành phần bên trong <div>. Nếu đây là một vấn đề, thay vào đó, bạn có thể sử dụng JavaScript để thực hiện điều này một cách đệ quy cho hậu duệ của một thành phần:

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"));

Cập nhật ngày 30 tháng 4 năm 2014 : Chuyển đổi cây này cần được chạy lại bất cứ khi nào một phần tử mới được thêm vào cây, nhưng dường như từ một nhận xét của @Han rằng có thể tránh điều này bằng cách thêm một mousedowntrình xử lý sự kiện đặt unselectablevào mục tiêu của biến cố. Xem http://jsbin.com/yagekiji/1 để biết chi tiết.


Điều này vẫn không bao gồm tất cả các khả năng. Mặc dù không thể bắt đầu các lựa chọn trong các phần tử không thể chọn, nhưng trong một số trình duyệt (ví dụ Internet Explorer và Firefox), vẫn không thể ngăn các lựa chọn bắt đầu trước và kết thúc sau phần tử không thể chọn mà không làm cho toàn bộ tài liệu không thể chọn.


30
bạn nên loại bỏ bộ chọn * khỏi ví dụ của mình, nó thực sự không hiệu quả và thực sự không có nhu cầu sử dụng nó trong ví dụ của bạn phải không?
Blowsie

66
@Blowsie: Tôi không nghĩ vậy: thông số kỹ thuật CSS 2 nói rằng *.foo.footương đương chính xác (trong trường hợp thứ hai, bộ chọn phổ quát ( *) được ngụ ý), vì vậy, việc chặn các yêu cầu của trình duyệt, tôi không thể thấy rằng bao gồm cả *sẽ gây hại hiệu suất. Đó là một thói quen lâu đời của tôi bao gồm *, điều mà ban đầu tôi bắt đầu thực hiện để dễ đọc: nó nói rõ ràng trong nháy mắt rằng tác giả dự định phù hợp với tất cả các yếu tố.
Tim Down

38
oooh sau khi đọc thêm, có vẻ như * chỉ không hiệu quả khi sử dụng nó làm khóa (bộ chọn cao nhất) tức là .unelectable *. Thông tin thêm ở đây code.google.com/speed/page-speed/docs/
Lần

20
Thay vì sử dụng class = "unelectable", chỉ cần sử dụng bộ chọn thuộc tính [unselectable = "on"] {chút}
Chris Calo

13
@Francisc: Không. Như tôi đã nói với Blowsie trước đó trong các bình luận, nó chính xác không có gì khác biệt.
Tim Down

196

Một giải pháp JavaScript cho Internet Explorer là:

onselectstart="return false;"

55
Đừng quên về ondragstart!
Mathias Bynens

9
một điều nữa ở đây Nếu bạn thêm phần đó vào phần thân thì bạn sẽ không thể chọn văn bản bên trong textareas hoặc các trường nhập trong IE. Cách tôi sửa nó cho IE. body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
TheBrain

2
Điều này có thể được thêm dưới dạng một thuộc tính bằng jQuery - $ ("p"). Attr ("onselectstart", "return false") Đây là phương pháp đáng tin cậy duy nhất đối với tôi trong IE8
Matt

13
@Abudayah vì chúng không hoạt động trong các phiên bản Internet Explorer cũ hơn? Đó là, giống như, toàn bộ điểm của câu trả lời này.
Pekka

?? tôi vẫn luôn có thể chọn văn bản trong inputcác yếu tố ngay cả khi tôi sử dụng user-select: none. tôi cần biết làm thế nào để ngăn chặn điều này
oldboy

191

Cho đến khi thuộc tính do người dùng chọn của CSS 3 khả dụng, các trình duyệt dựa trên Gecko hỗ trợ thuộc -moz-user-selecttính bạn đã tìm thấy. Các trình duyệt dựa trên WebKit và Blink hỗ trợ thuộc -webkit-user-selecttính.

Điều này tất nhiên không được hỗ trợ trong các trình duyệt không sử dụng công cụ kết xuất Gecko.

Không có "tiêu chuẩn" nào tuân thủ nhanh chóng và dễ dàng để làm điều đó; sử dụng JavaScript là một tùy chọn.

Câu hỏi thực sự là, tại sao bạn muốn người dùng không thể làm nổi bật và có lẽ sao chép và dán các yếu tố nhất định? Tôi đã không bắt gặp một lần mà tôi muốn không cho phép người dùng làm nổi bật một phần nhất định của trang web của tôi. Một số bạn bè của tôi, sau khi dành nhiều giờ để đọc và viết mã sẽ sử dụng tính năng nổi bật như một cách để nhớ vị trí của họ trên trang hoặc cung cấp một điểm đánh dấu để mắt họ biết nơi cần nhìn tiếp theo.

Nơi duy nhất tôi có thể thấy điều này hữu ích là nếu bạn có các nút cho các biểu mẫu không nên sao chép và dán nếu người dùng sao chép và dán trang web.


20
Các nút điều chính xác là động lực của tôi.
Kriem

27
Một lý do khác cần thiết là nhấp chuột Shift để chọn nhiều hàng trong lưới hoặc bảng. Bạn không muốn làm nổi bật văn bản, bạn muốn nó chọn các hàng.
Gordon Tucker

7
Ngoài ra còn có các vấn đề pháp lý trong đó nội dung của người khác đang được tái bản hợp pháp nhưng một điều khoản trong giấy phép yêu cầu nhà xuất bản web ngăn chặn văn bản dễ bị sao chép và dán. Đây là những gì dẫn tôi tìm thấy câu hỏi này. Tôi không đồng ý với yêu cầu này nhưng công ty tôi ký hợp đồng có nghĩa vụ pháp lý phải thực hiện theo cách này.
Craig M

5
@CraigM Kiểu css không ngăn một người lấy nguồn HTML và sao chép nó. Nếu bạn muốn bảo vệ nội dung của mình, bạn sẽ phải tìm những cách tốt hơn.
Agile Jedi

27
Ứng dụng web có tính tương tác cao với nhiều thao tác kéo và thả ... làm nổi bật ngẫu nhiên là một vấn đề lớn về khả năng sử dụng.
Marc Hughes

138

Nếu bạn muốn tắt lựa chọn văn bản trên mọi thứ trừ <p>các yếu tố, bạn có thể thực hiện việc này bằng CSS (xem ra cho -moz-nonephép ghi đè trong các thành phần phụ, được phép trong các trình duyệt khác với 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;
}

12
Hãy chắc chắn rằng bạn cũng có thể chọn các trường đầu vào: p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
joshuadelange

11
Hãy cảnh giác về việc tắt các kỳ vọng UI của trình duyệt trên TẤT CẢ mã ngoại trừ một mục. Ví dụ về văn bản danh sách <li /> thì sao?
Jason T Featheringham

Chỉ là một bản cập nhật ... theo MDN kể từ Firefox 21 -moz-nonenonegiống nhau.
Kevin Fegan

2
Để làm điều này, bạn có thể thêm con trỏ: mặc định và con trỏ: văn bản tương ứng :)
T4NK3R

THE bom. Điều đó có nghĩa là. KẾT THÚC. ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }[chọn tất cả mọi thứ trong một danh sách không có thứ tự và làm cho nó không thể chọn, thay vì bỏ đi toàn bộ cây xem.] Cảm ơn vì bài học. Danh sách nút của tôi trông rất tuyệt và phản hồi chính xác khi chạm và nhấn vào màn hình, thay vì khởi chạy IME (widget clipboard của android).
Hệ thống Hypersoft

125

Trong các giải pháp trong lựa chọn câu trả lời trước đó bị dừng, nhưng người dùng vẫn nghĩ rằng bạn có thể chọn văn bản vì con trỏ vẫn thay đổi. Để giữ cho nó tĩnh, bạn sẽ phải đặt con trỏ CSS của mình:

.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>

Điều này sẽ làm cho văn bản của bạn hoàn toàn phẳng, giống như nó sẽ có trong một ứng dụng máy tính để bàn.


"Căn hộ" trái ngược với những gì?
kojow7

@ kojow7 Trái ngược với "lớp". Thay vì văn bản nổi trên đầu của các yếu tố khác. Nó tương tự như sự khác biệt giữa hình ảnh SVG và PNG.
Yeti

4
Thật ngạc nhiên khi phát hiện ra rằng Firefox vẫn yêu cầu tiền tố của nhà cung cấp vào năm 2019. Tôi chỉ sử dụng một cách thiếu thận trọng user-select: none;, nghĩ rằng tiêu chuẩn này sẽ được áp dụng ngay bây giờ, nhưng thật đáng buồn là nó không có. Làm cho bạn tự hỏi những gì những người trong ủy ban tiêu chuẩn vẫn có thể tranh luận. "Không, các bạn ... Tôi thực sự nghĩ rằng nó nên user-select: cant;bởi vì nó giống như mô tả nhiều hơn, bạn biết không?" "Chúng ta đã vượt qua điều này, Mike. Chúng ta sẽ phải bỏ qua dấu nháy đơn, và đó là hình thức tồi tệ!" "Đủ rồi, mọi người! Chúng ta sẽ cân nhắc lại vấn đề này vào tháng tới. Cuộc họp của Ủy ban Tiêu chuẩn đã hoãn lại!"
Mentalist

109

Bạn có thể làm như vậy trong Firefox và Safari (Chrome cũng vậy?)

::selection { background: transparent; }
::-moz-selection { background: transparent; }

121
Tôi không khuyên bạn nên làm điều này, vì nó không thực sự khắc phục vấn đề; vô hiệu hóa lựa chọn văn bản - nó chỉ ẩn nó. Điều này có thể dẫn đến khả năng sử dụng kém, bởi vì nếu tôi kéo con trỏ quanh trang, tôi có thể chọn bất kỳ văn bản tùy ý nào mà không biết. Điều này có thể gây ra tất cả các loại "lỗi" khả năng sử dụng kỳ lạ.
Keithamus

1
Không hoạt động trên hình ảnh PNG với các khu vực trong suốt: Bạn sẽ luôn chọn trong một màu xanh nhạt Có bất kỳ cách giải quyết nào không?
AvL

80

Giải pháp cho WebKit :

/* Disable tap highlighting */
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);

Tôi tìm thấy nó trong một ví dụ CardFlip.


1
Sử dụng transparentthay cho rgba cũng hoạt động trong Chrome 42 trên Android.
Clint Pachl

77

Tôi thích giải pháp lai CSS + jQuery.

Để làm cho tất cả các thành phần bên trong <div class="draggable"></div>không thể chọn, sử dụng CSS này:

.draggable {
    -webkit-user-select: none;
     -khtml-user-select: none;
       -moz-user-select: none;
        -ms-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;
 }

Và sau đó, nếu bạn đang sử dụng jQuery, hãy thêm phần này vào trong một $(document).ready()khối:

if (($.browser.msie && $.browser.version < 10) || $.browser.opera) $('.draggable').find(':not(input)').attr('unselectable', 'on');

Tôi cho rằng bạn vẫn muốn bất kỳ yếu tố đầu vào nào có thể tương tác, do đó, :not()bộ chọn giả. Bạn có thể sử dụng '*'thay thế nếu bạn không quan tâm.

Hãy cẩn thận: Internet Explorer 9 có thể không cần phần jQuery bổ sung này, vì vậy bạn có thể muốn thêm một phiên bản kiểm tra trong đó.


5
Sử dụng -ms-user-select: none; (đối với IE10) và jQuery của bạn "nếu" phải được điều này: if (($ .browser.msie && $ .browser.version <10) || $ .browser.opera)
mhenry1384

Hãy cẩn thận nhé !!! Để làm cho nó có thể lựa chọn trong firefox, bạn phải sử dụng-moz-user-select: Normal;
Nicolas Thery

7
@ mhenry1384 jQuery.browserđã bị từ chối kể từ phiên bản 1.3 và đã bị xóa trong phiên bản 1.9 - api.jquery.com/jQuery.browser
WynandB

@Wynand Điểm tốt. Nhưng loại "phát hiện tính năng" nào tồn tại để xác định thuộc tính CSS nào sẽ sử dụng?
Tom Auger

@TomAuger Bạn có thể sử dụng jQuery.support, nó cho phép bạn kiểm tra các tính năng duy nhất: Liên kết
Aequanox

69

.hidden:after {
    content: attr(data-txt);
}
<p class="hidden" data-txt="Some text you don't want to be selected"></p>

Đó không phải là cách tốt nhất, mặc dù.


3
Bạn cũng có thể sử dụng titlelàm thuộc tính.
Bàn chải đánh răng

6
Đó là một giải pháp rất sáng tạo. Đặc biệt là nếu nó sử dụng thuộc tính tiêu đề bởi vì điều đó có thể sẽ tốt hơn cho trình đọc màn hình.
pseudosavant

4
Tôi đã thử nó ( JSBin ) và nó không hoạt động trong IE. Thật không may, IE cũ là những cái duy nhất user-selectkhông hoạt động.
pseudosavant

1
Đây là một sự thay thế không phải là JS tuyệt vời hoạt động trong Chrome! Tuyệt vời!
saricden

tuyệt đẹp! ......
Lonely

69

Bạn có thể sử dụng CSS hoặc JavaScript cho điều đó.

Cách JavaScript được hỗ trợ trong các trình duyệt cũ hơn , như các phiên bản Internet Explorer , nhưng nếu đó không phải là trường hợp của bạn, hãy sử dụng cách CSS sau đó:

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>


59

Ngoài ra, đối với Internet Explorer, bạn cần thêm lớp giảfocus (.ClassName: tập trung) và 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  */
}

3
Điều này không hoạt động trong IE miễn là lựa chọn bắt đầu trên một phần tử với classNamelớp. Xem JSBin này .
pseudosavant

57

Cố gắng chèn các hàng này vào CSS và gọi "disHighlight" tại thuộc tính lớp:

.disHighlight {
    user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
    -webkit-touch-callout: none;
    -o-user-select: none;
    -moz-user-select: none;
}

51

Cập nhật Hack nhanh

Nếu bạn sử dụng giá trị nonecho tất cả các user-selectthuộc tính CSS (bao gồm tiền tố trình duyệt của nó), có một vấn đề vẫn có thể xảy ra bởi điều này.

.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           */
}

Như CSS-Tricks nói, vấn đề là:

WebKit vẫn cho phép văn bản được sao chép, nếu bạn chọn các yếu tố xung quanh nó.

Bạn cũng có thể sử dụng cái bên dưới để enforcetoàn bộ phần tử được chọn, nghĩa là nếu bạn nhấp vào một phần tử, tất cả văn bản được bọc trong phần tử đó sẽ được chọn. Đối với điều này tất cả bạn phải làm là thay đổi giá trị nonethành 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  */
}

48

Đối với những người gặp khó khăn trong việc đạt được điều tương tự trong trình duyệt Android với sự kiện chạm, hãy sử dụng:

html, body {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    -webkit-tap-highlight-color: transparent;
}


46
-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');

46

Đang làm việc

CSS:

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

Điều này sẽ hoạt động, nhưng nó sẽ không hoạt động cho các trình duyệt cũ. Có một vấn đề tương thích trình duyệt.


Thuộc tính CSS chưa được chuẩn bị phải nằm ở cuối danh sách các phiên bản tiền tố của thuộc tính. Đó là một thực tiễn đúng đắn, khác là thực hành tồi khi tạo ra một "IE mới" từ Chrome / Webkit và dẫn đến rất nhiều điều TUYỆT VỜI khi giới thiệu hỗ trợ tiền tố -webkit trong các trình duyệt webkit. Look, điều này đã có trong năm 2012: dev.opera.com/articles/...
FlameStorm

Và tôi trích dẫn:This is because through our site compatibility work, we have experienced that many authors of (especially mobile) sites only use -webkit- prefixed CSS, thereby ignoring other vendor prefixes and not even including an unprefixed equivalent. This leads to a reduced user experience on Opera and Firefox, which don’t receive the same shiny effects such as transitions, gradients and the like, even if the browser supported those effects.
FlameStorm

42

Với SASS (cú pháp SCSS)

Bạn có thể làm điều này với một 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;
}

Trong thẻ HTML:

<div class="no-selectable">TRY TO HIGHLIGHT</div>

Hãy thử nó trong CodePen này .

Nếu bạn đang sử dụng trình tự động trộn, bạn có thể xóa các tiền tố khác.

Tương thích trình duyệt ở đây .


36

Ngoài thuộc tính chỉ có Mozilla, không, không có cách nào để vô hiệu hóa lựa chọn văn bản chỉ bằng CSS tiêu chuẩn (tính đến thời điểm hiện tại).

Nếu bạn để ý, Stack Overflow không vô hiệu hóa lựa chọn văn bản cho các nút điều hướng của họ và tôi khuyên bạn không nên làm như vậy trong hầu hết các trường hợp, vì nó sửa đổi hành vi lựa chọn bình thường và khiến nó xung đột với mong đợi của người dùng.


Mặc dù tôi đồng ý rằng nó thay đổi hành vi mà người dùng mong đợi, nhưng sẽ có ý nghĩa đối với những thứ như nút "Thêm bình luận" nằm bên cạnh trường mẫu này ...
X-Istence

Nhưng không tiết lộ chi tiết thực hiện không cần thiết? Một văn bản đầu vào hoặc nút không thể được chọn.

@anon: Hầu hết người dùng có thể sẽ không cố gắng chọn văn bản của nút của bạn, vì vậy trong thực tế, nó không thực sự quan trọng lắm. Ngoài ra, để làm như vậy, họ sẽ phải bắt đầu chọn bên ngoài nút, nếu họ nhấp vào bên trong nút đó, trình xử lý onclick sẽ kích hoạt thay thế. Thêm vào đó, một số trình duyệt nhất định (ví dụ Safari) thực sự cho phép bạn chọn văn bản của các nút bình thường
ly

6
Nếu bạn đang chọn một tập hợp các bình luận từ một chuỗi trò chuyện và mỗi bình luận có nút upvote / downvote bên cạnh nó, thì thật tuyệt khi chọn văn bản mà không có nội dung khác. Đó là những gì người dùng mong đợi hoặc muốn. Anh ấy không muốn sao chép / dán nhãn nút với mỗi bình luận.
Mnebuerquo

2
Và nếu bạn ví dụ nhấp đúp vào nút thay vì chuyển hướng bạn đến trang khác sẽ mở div? sau đó văn bản cho nút sẽ được chọn do nhấp đúp!
Gigala

34

Điều này hoạt động trong một số trình duyệt:

::selection{ background-color: transparent;}
::moz-selection{ background-color: transparent;}
::webkit-selection{ background-color: transparent;}

Chỉ cần thêm các thành phần / id mong muốn của bạn vào trước các bộ chọn được phân tách bằng dấu phẩy không có dấu cách, như vậy:

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;}

Các câu trả lời khác là tốt hơn; điều này có lẽ nên được xem như là một phương sách cuối cùng


3
Có một vài điều có thể được biết chắc chắn, nhưng giải pháp này chắc chắn không hoạt động trong tất cả các trình duyệt.
Volker E.

33

Giả sử có hai divs như thế này:

.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 */
}
<div class="first">
  This is my first div
</div>

<div class="second">
  This is my second div
</div>

Đặt con trỏ về mặc định để nó mang lại cảm giác không thể chọn cho người dùng.

Tiền tố cần được sử dụng để hỗ trợ nó trong tất cả các trình duyệt. Không có tiền tố, điều này có thể không hoạt động trong tất cả các câu trả lời.



29

Thêm phần này vào div đầu tiên mà bạn muốn tắt lựa chọn cho văn bản:

onmousedown='return false;' 
onselectstart='return false;'

28

GHI CHÚ:

Câu trả lời đúng là chính xác ở chỗ nó ngăn bạn không thể chọn văn bản. Tuy nhiên, điều đó không ngăn bạn có thể sao chép văn bản, vì tôi sẽ hiển thị với một vài ảnh chụp màn hình tiếp theo (kể từ ngày 7 tháng 11 năm 2014).

Trước khi chúng tôi đã chọn bất cứ điều gì

Sau khi chúng tôi đã chọn

Các số đã được sao chép

Như bạn có thể thấy, chúng tôi không thể chọn các số, nhưng chúng tôi có thể sao chép chúng.

Đã thử nghiệm trên: Ubuntu , Google Chrome 38.0.2125.111.


1
Tôi đã có cùng một vấn đề. Trên Mac Chrome 48.0.2564.116 và trên Mac Safari 9.0.3. Đáng chú ý, Mac Firefox 43.0 không sao chép ký tự, nhưng dính thêm các dòng cuối giữa chúng. Nên làm gì về việc này?
NHDaly

26

Để có được kết quả tôi cần, tôi thấy tôi phải sử dụng cả hai ::selectionuser-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;
}

Finalyyyyyyy một câu trả lời có hiệu quả
oldboy

23

Nó dễ dàng được thực hiện với:

-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;

Cách khác:

Hãy nói rằng bạn có một <h1 id="example">Hello, World!</h1>. Bạn sẽ phải loại bỏ cácHTML bên trong đó h1, trong trường hợp này là Hello, World . Sau đó, bạn sẽ phải đi đến CSS và làm điều này:

#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.
}

Bây giờ nó chỉ đơn giản nghĩ rằng nó là một yếu tố khối, và không phải văn bản.



21

Kiểm tra giải pháp của tôi mà không cần JavaScript:

jsFiddle

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>

Menu popup với kỹ thuật của tôi được áp dụng: http://jsfiddle.net/y4Lac/2/


21

Mặc dù phần tử giả này nằm trong bản nháp của Bộ chọn CSS cấp 3, nhưng phần tử này đã bị xóa trong giai đoạn Khuyến nghị của Ứng viên, vì có vẻ như hành vi của nó đã được chỉ định rõ, đặc biệt là với các phần tử lồng nhau và khả năng tương tác đã đạt được.

Nó đang được thảo luận trong How :: select hoạt động trên các phần tử lồng nhau .

Mặc dù nó đang được triển khai trong các trình duyệt, bạn có thể tạo ảo giác về văn bản không được chọn bằng cách sử dụng cùng màu và màu nền khi chọn như thiết kế tab (trong trường hợp của bạn).

Thiết kế CSS bình thường

p { color: white;  background: black; }

Lựa chọn

p::-moz-selection { color: white;  background: black; }
p::selection      { color: white;  background: black; }

Không cho phép người dùng chọn văn bản sẽ nêu ra các vấn đề về khả năng sử dụng.


Đây phải là lý do tại sao Netbeans tự động hoàn thành không biết tôi đang nói về cái gì!
halfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.