มีวิธีทำให้ DIV ไม่สามารถเลือกได้หรือไม่?


140

นี่คือคำถาม CSS ที่น่าสนใจสำหรับคุณ!

ฉันมี textarea ที่มีพื้นหลังโปร่งใสซ้อนทับข้อความบางส่วนที่ฉันต้องการใช้เป็นลายน้ำ ข้อความมีขนาดใหญ่และใช้พื้นที่ส่วนใหญ่ของ textarea มันดูดีปัญหาคือเมื่อผู้ใช้คลิกใน textarea บางครั้งมันก็เลือกข้อความลายน้ำแทน ฉันต้องการให้ข้อความลายน้ำไม่สามารถเลือกได้ ฉันคาดหวังว่าบางสิ่งที่ต่ำกว่าในดัชนี z มันจะไม่สามารถเลือกได้ แต่เบราว์เซอร์ดูเหมือนจะไม่สนใจเลเยอร์ z-index เมื่อเลือกรายการ มีกลอุบายหรือวิธีที่จะทำให้มันเป็น DIV นี้หรือไม่?


คุณจะมีความสุขกับการแก้ปัญหาจาวาสคริปต์หรือไม่?
joshcomley

คำตอบ:


203

ผมเขียนนามสกุล jQuery ง่ายที่จะปิดการใช้งานตัวเลือกบางเวลากลับเลือกปิดการใช้งานใน jQuery คุณสามารถเรียกมันผ่าน$('.button').disableSelection();

อีกวิธีหนึ่งโดยใช้ CSS (ข้ามเบราว์เซอร์):

.button {
        user-select: none;
        -moz-user-select: none;
        -khtml-user-select: none;
        -webkit-user-select: none;
        -o-user-select: none;
} 

@kasperTaeymans ขอบคุณที่ชี้ให้เห็น อัปเดตข้อมูลโค้ด
aleemb

@kasperTaeymans แต่มันอยู่ในร่างการทำงานของ W3C ... ฉันจะรวมไว้ในกรณี
Camilo Martin

2
ที่จะไม่เอาอะไรออกไปจากคำตอบเดิมซึ่งฉัน upvoted แต่มันคือ 3+ ปี ดังนั้นฉันจึงเพิ่มคำตอบด้านล่าง ( stackoverflow.com/questions/924916/… ) ด้วยการตั้งค่าเพิ่มเติมสำหรับส่วนต่อประสานแบบสัมผัส
แอนน์กันน์

นั่นคือสิ่งที่ฉันต้องการสำหรับส่วนหัว modal bootstrap! ขอบคุณ!
นักพัฒนา

62

รหัส CSS ต่อไปนี้ใช้งานได้กับเบราว์เซอร์รุ่นใหม่:

.unselectable {
    -moz-user-select: -moz-none;
    -khtml-user-select: none;
    -webkit-user-select: none;
    -o-user-select: none;
    user-select: none;
}

สำหรับ IE คุณต้องใช้ JS หรือ attribute attribute ในแท็ก html

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

มีวัตถุประสงค์unselectable="on"อะไร คุณสามารถให้การอ้างอิงโปรด
ผู้ใช้

4
ฉันพบที่นี่: msdn.microsoft.com/en-us/library/hh801966(v=vs.85).aspx แต่จริง ๆ แล้วฉันทดสอบกับ IE และทำงานได้อย่างถูกต้อง
KimKha

1
ฉันไม่แน่ใจ. แต่ <code> unselectable = "on" </code> อาจรวมอยู่ใน IE และตัวตรวจสอบ W3C ไม่ยอมรับแอตทริบิวต์นั้น
KimKha

แม้ว่ามันจะใช้งานได้กับเบราว์เซอร์สมัยใหม่ แต่ก็ยังไม่ได้ระบุโดย W3C
Ciro Santilli 郝海东冠状病六四事件法轮功

41

เพียงอัปเดตคำตอบที่ได้รับการโหวตมากดั้งเดิมของ aleemb ด้วยการเพิ่มไปยัง css

เราได้ใช้คอมโบต่อไปนี้:

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

เรามีข้อเสนอแนะสำหรับการเพิ่มรายการ webkit-touch จาก:
http://phonegap-tips.com/articles/essential-phonegap-css-webkit-touch-callout.html

2558 เม.ย. : เพียงอัปเดตคำตอบของฉันเองด้วยรูปแบบที่อาจมีประโยชน์ หากคุณต้องการทำให้ DIV สามารถเลือกได้ / ไม่สามารถเลือกได้ในทันทีและยินดีที่จะใช้Modernizr สิ่งต่อไปนี้จะทำงานในรูปแบบจาวาสคริปต์:

    var userSelectProp = Modernizr.prefixed('userSelect');
    var specialDiv = document.querySelector('#specialDiv');
    specialDiv.style[userSelectProp] = 'none';

การใช้user-select: noneกับ a divจะไม่มีผลใด ๆ ฉันค่อนข้างแน่ใจว่าใช้user-selectสำหรับข้อความเท่านั้น มีวิธีอื่นที่จะทำให้divไม่สามารถเลือกได้หรือไม่?
oldboy

22

ดังที่โยฮันเนสได้แนะนำไว้แล้วภาพพื้นหลังเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ใน CSS เพียงอย่างเดียว

โซลูชัน JavaScript จะต้องส่งผลกระทบต่อ "dragstart" เพื่อให้มีประสิทธิภาพในเบราว์เซอร์ยอดนิยมทั้งหมด

JavaScript:

<div onselectstart="return false;" ondragstart="return false;">your text</div>

jQuery:

var _preventDefault = function(evt) { evt.preventDefault(); };
$("div").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);

รวย



6

คุณสามารถลองสิ่งนี้:

<div onselectstart="return false">your text</div>

1
ยังคงเป็นไปได้ที่จะเลือกด้วยการดับเบิลคลิก
ceving

6

รูปภาพพื้นหลังที่เรียบง่ายสำหรับพื้นที่ข้อความไม่เพียงพอหรือไม่


1
ฉันหมายถึงลายน้ำ แต่ภาพพื้นหลังโปร่งใสอาจใช้ได้เช่นกัน นอกจากนี้คุณควรภาพไม่กระเบื้องขนาดเล็กมากเป็นเบราว์เซอร์บางส่วนได้รับ abysmally ช้าในกรณีที่ :)
โจอี้

โดยเฉพาะอย่างยิ่งเนื่องจาก png โปร่งใส (หรือ gif) 1,000x1000 เพียง 4kb
ไรอันฟลอเรนซ์

เหมือน 1 KiB จริง ๆ แล้ว :-)
Joey

4

เบราว์เซอร์ WebKit (เช่น Google Chrome และ Safari) มีโซลูชัน CSS คล้ายกับ Mozilla -moz-user-select: none

.no-select{    
    -webkit-user-select: none;
    cursor:not-allowed; /*makes it even more obvious*/
}

2

นอกจากนี้ใน IOS หากคุณต้องการกำจัดการซ้อนทับกึ่งโปร่งใสสีเทาที่ปรากฏบนทัชสกรีนให้เพิ่ม css:

-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;

-1

ใช้

onselectstart = "return false"

มันป้องกันการคัดลอกเนื้อหาของคุณ


4
โซลูชันนี้ได้รับการโพสต์โดยคนอื่น
งงงวยใจ

-1

ตรวจสอบให้แน่ใจว่าคุณได้กำหนดตำแหน่งอย่างชัดเจนว่าเป็นค่าสัมบูรณ์หรือค่าสัมพัทธ์สำหรับดัชนี z เพื่อให้สามารถเลือกได้ ฉันมีปัญหาที่คล้ายกันและสิ่งนี้แก้ไขได้สำหรับฉัน


-2

ไม่แน่ใจเกี่ยวกับกรณีการใช้งานของคุณ แต่คุณสามารถทำให้ลากได้


มันเป็นคำตอบที่ไม่น่าพอใจเลย
สนิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.