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


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.