วิธีปิดใช้งานการไฮไลต์การเลือกข้อความ


5201

สำหรับแองเคอว่าการกระทำเช่นปุ่ม (ตัวอย่างเช่นคำถาม , แท็ก , ผู้ใช้อื่น ๆ ที่ด้านบนของหน้ากองมากเกิน) หรือแท็บจะมีวิธีการมาตรฐาน CSS เพื่อปิดการใช้งานไฮไลท์ผลหากผู้ใช้ตั้งใจเลือกข้อความ?

ฉันรู้ว่าสิ่งนี้สามารถทำได้ด้วย JavaScript และ googling เล็กน้อยให้-moz-user-selectตัวเลือกMozilla เท่านั้น

มีวิธีที่เป็นไปตามมาตรฐานเพื่อให้บรรลุนี้ด้วย CSS และถ้าไม่วิธีการ "ปฏิบัติที่ดีที่สุด" คืออะไร?


7
องค์ประกอบภายในแม่มดองค์ประกอบสามารถไฮไลต์ที่ปิดใช้งานได้เปิดใช้งานการเน้นด้วยใน css ในสไตล์หรือแอตทริบิวต์ class? หรือกล่าวอีกนัยหนึ่งคือมีค่าอื่นสำหรับ -webkit-user-select ect นอกเหนือจากไม่มีใคร?

7
ที่เกี่ยวข้อง: stackoverflow.com/questions/16600479/… = วิธีการอนุญาตให้เลือกองค์ประกอบย่อยบางรายการเท่านั้น
— JK

9
มีข้อผิดพลาดในบางเบราว์เซอร์ที่ทำ "เลือกทั้งหมด" (CTRL + A และ CMD + A) ยังคงเลือกสิ่งต่าง ๆ สิ่งนี้สามารถต่อสู้ด้วยสีที่เลือกโปร่งใส: ::selection { background: transparent; } ::-moz-selection { background: transparent; }
— DaAwesomeP

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

3
ในปี 2017 มันเป็นวิธีที่ดีกว่าการใช้postcssและautoprefixerรุ่นเบราว์เซอร์ชุดแล้วpostcssทำให้ทุกอย่างเย็น
— AmerllicA

คำตอบ:


7322

อัพเดทมกราคม, 2017:

ตามที่ฉันสามารถใช้ใน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, Edge, Opera and Firefox */
}
<p>
  Selectable text.
</p>
<p class="noselect">
  Unselectable text.
</p>


โปรดทราบว่าuser-selectอยู่ในกระบวนการมาตรฐาน (ปัจจุบันอยู่ในร่างการทำงาน W3C ) ไม่รับประกันว่าจะทำงานได้ทุกที่และอาจมีความแตกต่างในการใช้งานระหว่างเบราว์เซอร์และในอนาคตเบราว์เซอร์สามารถรองรับการใช้งานได้


ข้อมูลเพิ่มเติมสามารถพบได้ในเอกสารเครือข่าย Mozilla Developer


38
รหัสที่ดี molokoloco: D แม้ว่าฉันจะอยู่ห่างจากการใช้งานเป็นส่วนตัว แต่บางครั้งคุณอาจต้องการค่าที่แตกต่างกันสำหรับเบราว์เซอร์ที่แตกต่างกันและพึ่งพา JavaScript การสร้างคลาสและเพิ่มลงในองค์ประกอบของคุณหรือการใช้ CSS กับองค์ประกอบของคุณในสไตล์ชีทของคุณนั้นเป็นระบบกันกระสุน
— Blowsie

58
'user-select'- ค่า: none | ข้อความ | สลับ องค์ประกอบ | องค์ประกอบ | ทั้งหมด | สืบทอด - w3.org/TR/2000/WD-css3-userint-20000216
— Blowsie

34
ที่จริง -o-user-select ไม่ได้ดำเนินการใน Opera มันใช้คุณลักษณะที่ไม่สามารถเลือกได้ของ IE แทน
— ทิมลง

30
ด้วยเหตุผลบางอย่างนี้คนเดียวไม่ได้ทำงานใน IE8 ฉันจึงเพิ่มหน่วย<div onselectstart="return false;">หลักของฉัน
— robasta

308
นี่มันไร้สาระ! มีวิธีที่แตกต่างกันมากมายในการทำสิ่งเดียวกัน มาสร้างมาตรฐานใหม่ให้ผู้ใช้เลือก standard-user-selectเราจะเรียกมันว่า จากนั้นเราจะไม่มีปัญหาเหล่านี้ ถึงแม้ว่าสำหรับความเข้ากันได้แบบย้อนหลังเราควรรวมที่อื่นเช่นกัน -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;ดังนั้นตอนนี้กลายเป็นรหัส ดีกว่ามาก
— Claudiu

854

ในเบราว์เซอร์ส่วนใหญ่สามารถทำได้โดยใช้รูปแบบที่เป็นกรรมสิทธิ์ในuser-selectคุณสมบัติCSS เดิมเสนอแล้วทิ้งใน CSS 3และตอนนี้เสนอในCSS UI ระดับ 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;
}

สำหรับ Internet Explorer <10 และOpera <15 คุณจะต้องใช้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"));

อัปเดต 30 เมษายน 2557 : ทราเวิร์ทรีนี้จำเป็นต้องรันใหม่ทุกครั้งที่มีการเพิ่มองค์ประกอบใหม่ลงในทรี แต่ดูเหมือนว่าจากความคิดเห็นโดย @Han ว่าเป็นไปได้ที่จะหลีกเลี่ยงปัญหานี้โดยการเพิ่มmousedownตัวจัดการเหตุการณ์ที่กำหนดunselectableเป้าหมาย เหตุการณ์ ดูhttp://jsbin.com/yagekiji/1สำหรับรายละเอียด


สิ่งนี้ยังไม่ครอบคลุมถึงความเป็นไปได้ทั้งหมด แม้ว่าจะเป็นไปไม่ได้ที่จะเริ่มต้นการเลือกในองค์ประกอบที่ไม่สามารถเลือกได้ในบางเบราว์เซอร์ (เช่น Internet Explorer และ Firefox) ก็ยังเป็นไปไม่ได้ที่จะป้องกันการเลือกที่เริ่มต้นก่อนและสิ้นสุดหลังจากองค์ประกอบที่ไม่สามารถเลือกได้


30
คุณควรลบ * ตัวเลือกออกจากตัวอย่างของคุณมันมีประสิทธิภาพจริงๆและไม่จำเป็นต้องใช้มันในตัวอย่างของคุณใช่ไหม?
— Blowsie

66
@Blowsie: ฉันไม่คิดอย่างนั้น: CSS 2 spec ระบุว่า*.fooและ.fooจะเทียบเท่าได้อย่างแม่นยำ (ในกรณีที่สองตัวเลือกสากล ( *) มีความหมายโดยนัย) ดังนั้นหากมีข้อ จำกัด เบราว์เซอร์เบราว์เซอร์ฉันไม่เห็นว่ารวมถึง*จะเป็นอันตราย ประสิทธิภาพ. เป็นนิสัยที่ยาวนานของฉันที่จะรวมสิ่ง*ที่ฉันเริ่มทำเพื่อการอ่าน: มันระบุไว้อย่างชัดเจนว่าผู้เขียนตั้งใจที่จะจับคู่องค์ประกอบทั้งหมด
— Tim Down

38
oooh หลังจากอ่านเพิ่มเติมดูเหมือนว่า * จะไม่ทำให้ผู้ใช้อ่อนแอเมื่อใช้เป็นกุญแจ (ตัวเลือก righmost) เช่น. unselectable * ข้อมูลเพิ่มเติมได้ที่นี่code.google.com/speed/page-speed/docs/…
— Blowsie

20
แทนที่จะใช้ class = "unselectable" เพียงใช้ตัวเลือกแอททริบิวต์ [unselectable = "on"] {…}
— Chris Calo

13
@ Francisc: ไม่อย่างที่ฉันบอกกับ Blowsie ในความคิดเห็นก่อนหน้านี้มันไม่ได้สร้างความแตกต่างอย่างแน่นอน
— Tim Down

196

โซลูชัน JavaScript สำหรับ Internet Explorer คือ:

onselectstart="return false;"

55
อย่าลืมondragstart!
— งัด Bynens

9
อีกสิ่งหนึ่งที่นี่ หากคุณเพิ่มสิ่งนั้นลงในเนื้อความคุณจะไม่สามารถเลือกข้อความภายใน textareas หรือช่องป้อนข้อมูลใน IE วิธีที่ฉันแก้ไขสำหรับ IE body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
— TheBrain

2
สามารถเพิ่มเป็นแอตทริบิวต์โดยใช้ jQuery - $ ("p"). attr ("onselectstart", "return false") นี่เป็นวิธีเดียวที่เชื่อถือได้สำหรับฉันใน IE8
— Matt

13
@Abudayah เพราะพวกเขาไม่ทำงานใน Internet Explorer รุ่นเก่าใช่ไหม นั่นคือทั้งหมดของคำตอบนี้
— Pekka

?? ฉันจะยังคงเสมอเลือกข้อความในองค์ประกอบแม้ว่าฉันจะใช้input user-select: noneฉันจำเป็นต้องรู้วิธีป้องกันสิ่งนี้
— oldboy

191

จนกว่าคุณสมบัติการเลือกของผู้ใช้ CSS 3 จะพร้อมใช้งานเบราว์เซอร์Gecko- based จะสนับสนุน-moz-user-selectคุณสมบัติที่คุณพบอยู่แล้ว เบราว์เซอร์ที่ใช้ WebKitและ Blink สนับสนุน-webkit-user-selectคุณสมบัติ

แน่นอนว่าไม่รองรับเบราว์เซอร์ที่ไม่ได้ใช้เครื่องมือแสดงผล Gecko

ไม่มี "มาตรฐาน" เป็นไปตามวิธีที่ง่ายและรวดเร็วในการทำ; ใช้ JavaScript เป็นตัวเลือก

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

ที่เดียวที่ฉันเห็นว่ามีประโยชน์คือถ้าคุณมีปุ่มสำหรับแบบฟอร์มที่ไม่ควรคัดลอกและวางหากผู้ใช้คัดลอกและวางเว็บไซต์


20
สิ่งที่ปุ่มจะเป็นแรงบันดาลใจของฉัน
— Kriem

27
อีกเหตุผลหนึ่งที่จำเป็นคือการคลิก Shift เพื่อเลือกหลายแถวในตารางหรือตาราง คุณไม่ต้องการเน้นข้อความคุณต้องการเลือกแถว
— Gordon Tucker

7
นอกจากนี้ยังมีปัญหาทางกฎหมายที่เนื้อหาของผู้อื่นถูกเผยแพร่ซ้ำตามกฎหมาย แต่ข้อในใบอนุญาตต้องมีผู้เผยแพร่เว็บเพื่อป้องกันข้อความจากการคัดลอกและวางได้อย่างง่ายดาย นี่คือสิ่งที่ทำให้ฉันพบคำถามนี้ ฉันไม่เห็นด้วยกับข้อกำหนด แต่ บริษัท ที่ฉันทำสัญญามีภาระผูกพันทางกฎหมายที่จะใช้วิธีนี้
— Craig M

5
@CraigM สไตล์ css ไม่ได้หยุดบุคคลจากการคว้าแหล่งที่มาของ HTML และคัดลอกมัน หากคุณต้องการปกป้องเนื้อหาของคุณคุณจะต้องหาวิธีที่ดีกว่า
— Agile Jedi

27
แอปพลิเคชันเว็บที่มีการโต้ตอบสูงพร้อมการลากและวาง ... การเน้นโดยไม่ได้ตั้งใจเป็นปัญหาการใช้งานที่ยิ่งใหญ่
— Marc Hughes

138

หากคุณต้องการปิดใช้งานการเลือกข้อความในทุกสิ่งยกเว้น<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;
}

12
ตรวจสอบให้แน่ใจว่าคุณได้เลือกฟิลด์ป้อนข้อมูล: p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
— joshuadelange

11
ระมัดระวังเกี่ยวกับการปิดการคาดหวัง UI เบราว์เซอร์ในรหัสทั้งหมดยกเว้นหนึ่งรายการ สิ่งที่เกี่ยวกับรายการในรายการ <li /> ข้อความเช่น?
— Jason T Featheringham

เพียงแค่อัปเดต ... ตาม MDN ตั้งแต่ Firefox 21 -moz-noneและnoneเหมือนกัน
— Kevin Fegan

2
สำหรับสิ่งนี้คุณสามารถเพิ่มเคอร์เซอร์: ค่าเริ่มต้นและเคอร์เซอร์: ข้อความตามลำดับ
— :)

ระเบิด กล่าวคือ. ตอนจบ. ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }[เลือกทุกอย่างในรายการที่ไม่ได้เรียงลำดับและทำให้ไม่สามารถเลือกได้แทนที่จะทรีทรีทรีทรีทั้งภาพ] ขอบคุณสำหรับบทเรียน รายการปุ่มของฉันดูดีมากและตอบสนองการแตะและกดบนหน้าจอได้อย่างถูกต้องแทนที่จะเปิดใช้ IME (วิดเจ็ตคลิปบอร์ด android)
— Hypersoft Systems

125

ในโซลูชันในการเลือกคำตอบก่อนหน้านี้หยุดทำงาน แต่ผู้ใช้ยังคงคิดว่าคุณสามารถเลือกข้อความได้เนื่องจากเคอร์เซอร์ยังคงเปลี่ยนไป เพื่อให้มันคงที่คุณจะต้องตั้งค่าเคอร์เซอร์ 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;
}
<p>
  Selectable text.
</p>
<p class="noselect">
  Unselectable text.
</p>

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


"แบน" ตรงข้ามกับอะไร
— kojow7

@ kojow7 ตรงข้ามกับ "layered" แทนที่จะเป็นข้อความที่ลอยอยู่ด้านบนขององค์ประกอบอื่น ๆ มันคล้ายกับความแตกต่างระหว่างภาพ SVG และ PNG
— Yeti

4
รู้สึกประหลาดใจที่ค้นพบว่า Firefox ยังคงต้องใช้คำนำหน้าของผู้จัดจำหน่ายในปี 2019 ฉันไม่สนใจการใช้งานเพียงอย่างเดียวuser-select: none;คิดว่ามาตรฐานจะได้รับการรับรองในตอนนี้ แต่น่าเสียดายที่มันยังไม่มี ทำให้คุณสงสัยว่าคนในคณะกรรมการมาตรฐานยังคงสามารถถกเถียงกันได้ "ไม่มีพวกคุณ ... ฉันจริงๆคิดว่ามันควรจะเป็นuser-select: cant;เพราะมันก็เหมือนกับการอธิบายเพิ่มเติมคุณรู้หรือไม่" “ เราได้รับสิ่งนี้ไมค์เราจะต้องละเว้นเครื่องหมายอะโพสโทรฟีและนั่นเป็นรูปแบบที่ไม่ดี!” "พอทุกคน! เราจะพิจารณาเรื่องนี้อีกครั้งในเดือนหน้าการประชุมคณะกรรมการมาตรฐานจะเลื่อนออกไป!"
— Mentalist

109

คุณสามารถทำได้ใน Firefox และ Safari (Chrome ด้วยหรือไม่)

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

121
ฉันจะไม่แนะนำให้ทำเช่นนี้เพราะมันไม่ได้แก้ไขปัญหาจริง; ปิดใช้งานการเลือกข้อความ - เพียงซ่อนไว้ สิ่งนี้สามารถนำไปสู่การใช้งานไม่ดีเพราะถ้าฉันลากเคอร์เซอร์ไปรอบ ๆ หน้าฉันสามารถเลือกข้อความใดก็ได้โดยไม่ทราบ สิ่งนี้สามารถทำให้ "บั๊ก" การใช้งานแปลก ๆ ทุกชนิด
— Keithamus

1
ไม่สามารถใช้งานกับภาพ PNG ที่มีพื้นที่โปร่งใสได้: ตัวเลือกจะเป็นสีน้ำเงินเสมอ ... วิธีแก้ไขใด ๆ
— AvL

80

วิธีแก้ปัญหาสำหรับWebKit :

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

ฉันพบมันในตัวอย่าง CardFlip


1
การใช้transparentrgba แทนสามารถใช้งานได้ใน Chrome 42 บน Android
— Clint Pachl

77

ฉันชอบโซลูชัน CSS + jQuery แบบไฮบริด

ในการทำให้องค์ประกอบทั้งหมดภายใน<div class="draggable"></div>ไม่สามารถเลือกได้ให้ใช้ CSS นี้:

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

และถ้าคุณใช้ jQuery ให้เพิ่มส่วนนี้ลงใน$(document).ready()บล็อก:

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

ฉันคิดว่าคุณยังคงต้องการให้องค์ประกอบอินพุตใด ๆ สามารถโต้ตอบได้ดังนั้น:not()ตัวเลือกหลอก คุณสามารถใช้'*'แทนหากคุณไม่สนใจ

Caveat: Internet Explorer 9 อาจไม่ต้องการ jQuery ชิ้นพิเศษนี้ดังนั้นคุณอาจต้องการเพิ่มการตรวจสอบรุ่น


5
ใช้ -ms-user-select: none; (สำหรับ IE10) และ jQuery ของคุณ "ถ้า" ควรเป็นเช่นนี้: if (($ .browser.msie && $ .browser.version <10) || $ .browser.opera)
— mhenry1384

ระวังตัวด้วย !!! เพื่อให้สามารถเลือกได้ใน Firefox คุณต้องใช้-moz-user-select: Normal;
— Nicolas Thery

7
@ mhenry1384 jQuery.browserถูกเลิกใช้แล้วในเวอร์ชัน 1.3 และถูกนำออกในเวอร์ชัน 1.9 - api.jquery.com/jQuery.browser
— WynandB

@ คะแนนดีมาก แต่ "การตรวจจับคุณสมบัติ" ประเภทใดที่มีอยู่เพื่อกำหนดคุณสมบัติ CSS ที่จะใช้
— Tom Auger

@TomAuger คุณสามารถใช้ jQuery.support ช่วยให้คุณสามารถตรวจสอบฟีเจอร์เดียว: ลิงก์
— Aequanox

69

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

มันไม่ใช่วิธีที่ดีที่สุด


3
คุณสามารถใช้titleเป็นแอตทริบิวต์
— แปรงสีฟัน

6
นั่นเป็นทางออกที่สร้างสรรค์มาก โดยเฉพาะอย่างยิ่งหากใช้แอตทริบิวต์ชื่อเพราะอาจจะดีกว่าสำหรับโปรแกรมอ่านหน้าจอ
— pseudosavant

4
ฉันลองแล้ว ( JSBin ) และมันไม่ทำงานใน IE น่าเสียดายที่ IEs ที่เก่ากว่านั้นเป็นตัวเดียวที่user-selectใช้งานไม่ได้
— pseudosavant

1
นี่เป็นทางเลือกที่ไม่ใช่ JS ที่ยอดเยี่ยมที่ใช้งานได้ใน Chrome! ! น่ากลัว
— saricden

gorgeous! ......
— Lonely

69

คุณสามารถใช้CSSหรือJavaScriptสำหรับสิ่งนั้น

JavaScriptวิธีที่ได้รับการสนับสนุนในเก่าเบราว์เซอร์เช่นเก่ารุ่นของ Internet Explorer เช่นกัน แต่ถ้ามันไม่ได้เป็นกรณีของคุณให้ใช้วิธี 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>

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

สำหรับ Internet Explorer ในนอกจากนี้คุณจะต้องเพิ่มระดับหลอกfocus (.ClassName: โฟกัส) 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
สิ่งนี้ใช้ได้ใน IE ตราบใดที่การเลือกเริ่มต้นที่องค์ประกอบที่มีclassNameคลาส ดูJSBinนี้
— pseudosavant

57

ลองแทรกแถวเหล่านี้ลงใน CSS และเรียกคุณสมบัติ "disHighlight" ที่ class:

.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

การอัพเดทแฮ็คด่วน

หากคุณใช้ค่าnoneสำหรับuser-selectคุณสมบัติCSS ทั้งหมด(รวมถึงส่วนนำหน้าเบราว์เซอร์ของมัน) แสดงว่ามีปัญหาที่อาจเกิดขึ้นได้

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

ดังที่CSS-Tricksกล่าวว่าปัญหาคือ:

WebKitยังช่วยให้ข้อความที่จะคัดลอกถ้าคุณเลือกองค์ประกอบรอบ ๆ มัน

คุณสามารถใช้องค์ประกอบด้านล่างเพื่อenforceเลือกองค์ประกอบทั้งหมดซึ่งหมายความว่าหากคุณคลิกที่องค์ประกอบข้อความทั้งหมดที่อยู่ในองค์ประกอบนั้นจะถูกเลือก ทั้งหมดนี้ที่คุณต้องทำคือการเปลี่ยนค่าไปnoneall

.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

สำหรับผู้ที่มีปัญหาในการบรรลุเหมือนกันในเบราว์เซอร์ 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;
}


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

การทำงาน

CSS:

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

สิ่งนี้ควรใช้งานได้ แต่จะไม่สามารถใช้ได้กับเบราว์เซอร์รุ่นเก่า มีปัญหาความเข้ากันได้ของเบราว์เซอร์


คุณสมบัติ CSS ที่ไม่ได้ใส่คำนำหน้าต้องเป็นอย่างเคร่งครัดในตอนท้ายของรายการของคุณสมบัติรุ่นที่มีคำนำหน้า เป็นวิธีปฏิบัติที่ถูกต้องและอื่น ๆ เป็นแนวทางปฏิบัติที่ไม่ดีในการสร้าง "IE ใหม่" จาก Chrome / Webkit และนำไปสู่สิ่งที่น่าเกลียดมากเช่นการแนะนำ -webkit prefix ในเบราว์เซอร์ webkit ไม่ใช่ ดูนี่มันมีอยู่แล้วในปี 2012: dev.opera.com/articles/…
— FlameStorm

และฉันพูด: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

ด้วยSASS (ไวยากรณ์ SCSS)

คุณสามารถทำได้ด้วย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;
}

ในแท็ก HTML:

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

ลองใช้ในCodePenนี้

หากคุณใช้โปรแกรมแก้ไขอัตโนมัติคุณสามารถลบส่วนนำหน้าอื่นได้

ความเข้ากันได้เบราว์เซอร์ที่นี่


36

นอกเหนือจากคุณสมบัติเฉพาะ Mozilla เท่านั้นไม่มีวิธีปิดการเลือกข้อความด้วย CSS มาตรฐาน (ณ ตอนนี้)

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


ขณะที่ฉันเห็นว่ามันมีการเปลี่ยนแปลงพฤติกรรมที่คาดว่าผู้ใช้ก็จะทำให้รู้สึกสำหรับสิ่งที่ต้องการ "เพิ่มความคิดเห็นที่ปุ่ม" ที่กำลังนั่งอยู่ถัดจากฟิลด์รูปแบบนี้ ...
— X-Istence

แต่นั่นไม่เปิดเผยรายละเอียดการใช้งานที่ไม่จำเป็น? ไม่สามารถเลือกข้อความอินพุตหรือปุ่ม

@ อานนท์: ผู้ใช้ส่วนใหญ่อาจไม่พยายามเลือกข้อความของปุ่มของคุณดังนั้นในทางปฏิบัติมันไม่ควรสำคัญอะไรมาก นอกจากนี้เพื่อที่จะทำเช่นนั้นพวกเขาจะต้องเริ่มเลือกนอกปุ่ม - หากพวกเขาคลิกภายในปุ่มตัวจัดการ onclick จะเปิดใช้งานแทน นอกจากนี้เบราว์เซอร์บางตัว (เช่น Safari) จริง ๆ ให้คุณเลือกข้อความของปุ่มปกติ…
— hbw

6
หากคุณกำลังเลือกชุดความคิดเห็นจากเธรดการแชทและความคิดเห็นแต่ละรายการมีปุ่ม upvote / downvote อยู่ข้างๆมันจะเป็นการดีถ้าเลือกข้อความโดยไม่มีสิ่งอื่นใด นั่นคือสิ่งที่ผู้ใช้คาดหวังหรือต้องการ เขาไม่ต้องการคัดลอก / วางป้ายชื่อปุ่มด้วยทุกความคิดเห็น
— Mnebuerquo

2
และถ้าคุณเป็นตัวอย่างให้ดับเบิลคลิกที่ปุ่มซึ่งแทนที่จะนำคุณไปยังหน้าอื่นจะเปิด div? จากนั้นข้อความสำหรับปุ่มจะถูกเลือกเนื่องจากดับเบิลคลิก!
— Gigala

34

วิธีนี้ใช้ได้ในเบราว์เซอร์บางตัว :

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

เพียงเพิ่มองค์ประกอบ / รหัสที่คุณต้องการต่อหน้าตัวเลือกคั่นด้วยเครื่องหมายจุลภาคโดยไม่มีช่องว่างเช่น:

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

คำตอบอื่น ๆ จะดีกว่า; สิ่งนี้น่าจะถูกมองว่าเป็นทางเลือกสุดท้าย


3
มีบางสิ่งที่สามารถทราบได้แน่นอน แต่วิธีนี้ไม่สามารถใช้ได้กับเบราว์เซอร์ทั้งหมด
— Volker E.

33

สมมติว่ามีสอง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 */
}
<div class="first">
  This is my first div
</div>

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

ตั้งค่าเคอร์เซอร์เป็นค่าเริ่มต้นเพื่อที่จะให้ความรู้สึกที่ไม่สามารถเลือกได้กับผู้ใช้

จำเป็นต้องใช้คำนำหน้าเพื่อรองรับในเบราว์เซอร์ทั้งหมด หากไม่มีคำนำหน้าสิ่งนี้อาจใช้ไม่ได้กับคำตอบทั้งหมด


30

สิ่งนี้จะเป็นประโยชน์หากไม่จำเป็นต้องเลือกสี:

::-moz-selection { background:none; color:none; }
::selection { background:none; color:none; }

... การแก้ไขเบราว์เซอร์อื่น ๆ ทั้งหมด มันจะทำงานในInternet Explorer 9หรือใหม่กว่า


1
ทำที่color: inherit;อาจจะ
— Yaakov Ainspan

ใช่ฉันรักมัน มันเป็นตัวเลือก css ระดับ 3 ตามMozilla docs
— Bariq Dharmawan

29

เพิ่มส่วนนี้ลงใน div แรกที่คุณต้องการปิดการเลือกข้อความ:

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

28

บันทึก:

คำตอบที่ถูกต้องนั้นถูกต้องซึ่งทำให้คุณไม่สามารถเลือกข้อความได้ อย่างไรก็ตามมันไม่ได้ป้องกันคุณจากการคัดลอกข้อความอย่างที่ฉันจะแสดงกับภาพหน้าจอคู่ถัดไป (ณ วันที่ 7 พฤศจิกายน 2014)

ก่อนที่เราจะเลือกอะไร

หลังจากที่เราได้เลือก

คัดลอกตัวเลขแล้ว

อย่างที่คุณเห็นเราไม่สามารถเลือกหมายเลขได้ แต่เราสามารถคัดลอกได้

ทดสอบกับ: Ubuntu , Google Chrome 38.0.2125.111


1
ฉันมีปัญหาเดียวกัน บน Mac Chrome 48.0.2564.116 และบน Mac Safari 9.0.3 โดยเฉพาะอย่างยิ่ง Mac Firefox 43.0 ไม่ได้คัดลอกตัวละคร สิ่งที่ควรทำเกี่ยวกับเรื่องนี้?
— NHDaly

26

เพื่อให้ได้ผลลัพธ์ที่ต้องการฉันพบว่าฉันต้องใช้ทั้งสองอย่าง::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;
}

finalyyyyyyy คำตอบที่ได้ผล
— oldboy

23

ทำได้ง่ายด้วย:

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

อีกวิธีหนึ่งคือ:

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

ตอนนี้ก็คิดว่ามันเป็นองค์ประกอบบล็อกและไม่ใช่ข้อความ



21

ตรวจสอบโซลูชันของฉันโดยไม่ใช้ 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>

ใช้เมนูป๊อปอัปที่มีเทคนิคของฉัน: http://jsfiddle.net/y4Lac/2/


21

แม้ว่าองค์ประกอบหลอกนี้จะอยู่ในร่างของ CSS Selectors ระดับ 3 แต่จะถูกลบออกในระหว่างขั้นตอนการแนะนำผู้สมัครเนื่องจากดูเหมือนว่าพฤติกรรมของมันจะมีการระบุน้อยเกินไปโดยเฉพาะอย่างยิ่งกับองค์ประกอบที่ซ้อนกันและการทำงานร่วมกันไม่ประสบความสำเร็จ

มันถูกกล่าวถึงในวิธี :: เลือกทำงานในองค์ประกอบที่ซ้อนกัน

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

การออกแบบ CSS ปกติ

p { color: white;  background: black; }

ในการคัดเลือก

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

การไม่อนุญาตให้ผู้ใช้เลือกข้อความจะทำให้เกิดปัญหาการใช้งาน


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