การใช้ CSS ทำให้ผู้ใช้ไม่สามารถเลือกข้อความภายในองค์ประกอบโดยใช้ user-select: none
. เป็นที่เข้าใจได้ว่าทำไมการทำเช่นนั้นจึงถูกมองว่าเป็น "การโต้เถียง" ฉันหมายถึง, น่า เรากำลังปิดการใช้งานพฤติกรรมผู้ใช้มาตรฐาน? โดยทั่วไปไม่ เราไม่ควรทำอย่างนั้น. แต่การปิดใช้งานการเลือกข้อความมีกรณีการใช้งานที่ถูกต้อง (แม้ว่าจะหายาก) หรือไม่ ฉันคิดอย่างนั้น.
ในบทความนี้ เราจะมาสำรวจกรณีการใช้งานเหล่านี้และดูว่าเราจะใช้งานอย่างไรได้บ้าง user-select: none
เพื่อปรับปรุง (ไม่ขัดขวาง) ประสบการณ์ของผู้ใช้ นอกจากนี้ยังไม่มีค่าอะไรเลยที่ user-select
ทรัพย์สินมีค่าอื่นนอกจาก none
ที่สามารถใช้ปรับเปลี่ยนพฤติกรรมการเลือกข้อความแทนการปิดใช้งานโดยสิ้นเชิง และค่าอื่นที่สม่ำเสมอ บังคับใช้ การเลือกข้อความ ดังนั้นเราจะพิจารณาสิ่งเหล่านั้นด้วย
user-select
ค่า
เป็นไปได้ มาเริ่มต้นสิ่งต่าง ๆ ด้วยการวิ่งผ่านสิ่งต่าง ๆ user-select
ค่านิยมและสิ่งที่พวกเขาทำ
การประยุกต์ใช้ user-select: none;
กับองค์ประกอบหมายความว่าเนื้อหาข้อความและเนื้อหาข้อความที่ซ้อนกันจะไม่สามารถเลือกได้หรือมองเห็นได้ (เช่น ::selection
จะไม่ทำงาน) หากคุณต้องทำการเลือกที่มีเนื้อหาที่ไม่สามารถเลือกได้ เนื้อหาที่ไม่สามารถเลือกได้จะถูกละเว้นจากการเลือก ดังนั้นจึงมีการใช้งานค่อนข้างดี และการสนับสนุนนั้นยอดเยี่ยม
ข้อมูลสนับสนุนเบราว์เซอร์นี้มาจาก ฉันสามารถใช้ซึ่งมีรายละเอียดมากขึ้น ตัวเลขระบุว่าเบราว์เซอร์รองรับคุณสมบัติในเวอร์ชันนั้นขึ้นไป
เดสก์ทอป
Chrome | Firefox | IE | ขอบ | Safari |
---|---|---|---|---|
4* | 2* | * 10 | * 12 | * 3.1 |
มือถือ / แท็บเล็ต
android-chrome | แอนดรอยด์ ไฟร์ฟอกซ์ | Android | iOS ของซาฟารี |
---|---|---|---|
105 | 104 | * 2.1 | * 3.2 |
ในทางที่ผิด user-select: text
ทำให้สามารถเลือกเนื้อหาได้ คุณจะใช้ค่านี้เพื่อเขียนทับ user-select: none
.
user-select: contain
เป็นเรื่องที่น่าสนใจ การใช้หมายความว่าหากการเลือกเริ่มต้นภายในองค์ประกอบ การเลือกนั้นจะต้องสิ้นสุดภายในองค์ประกอบนั้นด้วย สิ่งนี้ใช้ไม่ได้เมื่อการเลือกเริ่มต้นขึ้น ก่อน อย่างไรก็ตามองค์ประกอบซึ่งอาจเป็นสาเหตุที่ไม่มีเบราว์เซอร์รองรับในปัจจุบัน (Internet Explorer และ Microsoft Edge เวอร์ชันก่อนหน้าสนับสนุนภายใต้หน้ากากของ user-select: element
.)
กับ user-select: all
การเลือกส่วนหนึ่งของเนื้อหาขององค์ประกอบส่งผลให้องค์ประกอบทั้งหมดถูกเลือกโดยอัตโนมัติ ทั้งหมดหรือไม่มีเลย ซึ่งไม่ประนีประนอมแต่มีประโยชน์ในสถานการณ์ที่ผู้ใช้มักจะคัดลอกเนื้อหาไปยังคลิปบอร์ดของตน (เช่น การแชร์และการฝังลิงก์ ข้อมูลโค้ด ฯลฯ) แทนที่จะดับเบิลคลิก ผู้ใช้จะต้องคลิกเพียงครั้งเดียวเพื่อให้เลือกเนื้อหาโดยอัตโนมัติ
แต่โปรดใช้ความระมัดระวัง เนื่องจากนี่ไม่ใช่คุณลักษณะที่คุณคิดเสมอไป จะเกิดอะไรขึ้นหากผู้ใช้ต้องการเลือกเท่านั้น ส่วนหนึ่ง ของเนื้อหา (เช่น เฉพาะส่วนชื่อแบบอักษรของข้อมูลโค้ด Google Fonts หรือส่วนหนึ่งของข้อมูลโค้ด) ก็ยังดีกว่าที่จะจัดการ”คัดลอกไปที่คลิปบอร์ด” โดยใช้ JavaScript ในหลายสถานการณ์
แอปพลิเคชั่นที่ดีกว่าของ user-select: all
คือเพื่อให้แน่ใจว่ามีการคัดลอกคำพูดทั้งหมดและถูกต้อง
พฤติกรรมของ user-select: auto
(ค่าเริ่มต้นของ user-select
) ขึ้นอยู่กับองค์ประกอบและวิธีการใช้งาน คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ใน ปูมของเรา.
ตอนนี้เรามาสำรวจกรณีการใช้งานสำหรับ user-select: none
...
การตัดข้อความที่ไม่ใช่ข้อความออกจากส่วนที่เลือก
เมื่อคุณคัดลอกเนื้อหาจากหน้าเว็บ อาจมาจากบทความหรือเนื้อหารูปแบบยาวประเภทอื่นๆ ใช่ไหม คุณอาจไม่ต้องการให้การเลือกของคุณรวมรูปภาพ อีโมจิ (ซึ่งบางครั้งสามารถคัดลอกเป็นข้อความได้ เช่น “:thinkingface:”) และสิ่งอื่น ๆ ที่คุณอาจคาดว่าจะพบใน <aside>
องค์ประกอบ (เช่น คำกระตุ้นการตัดสินใจในบทความ โฆษณา หรืออย่างอื่นที่ไม่ได้เป็นส่วนหนึ่งของเนื้อหาหลัก)
เพื่อป้องกันไม่ให้มีบางสิ่งรวมอยู่ในการเลือก ตรวจสอบให้แน่ใจว่ามันถูกรวมไว้ในองค์ประกอบ HTML แล้วจึงนำไปใช้ user-select: none
ไปที่มัน:
<p>lorem <span style="user-select: none">🤔</span> ipsum</p>
<aside style="user-select: none">
<h1>Heading</h1>
<p>Paragraph</p>
<a>Call to action</a>
</aside>
ในสถานการณ์เช่นนี้ เราไม่ได้ปิดใช้งานการเลือก แต่จะปิดใช้แทน การเพิ่มประสิทธิภาพ มัน. นอกจากนี้ยังควรกล่าวด้วยว่าการเลือกไม่ได้หมายถึงการคัดลอกเสมอไป ผู้อ่านจำนวนมาก (รวมถึงตัวฉันเอง) ชอบที่จะเลือกเนื้อหาในขณะที่อ่าน เพื่อให้พวกเขาจำได้ว่าพวกเขาอยู่ที่ไหน (เช่น บุ๊กมาร์ก) อีกเหตุผลหนึ่งในการปรับให้เหมาะสมมากกว่าที่จะปิดการใช้งานโดยสิ้นเชิง
ป้องกันการเลือกโดยไม่ได้ตั้งใจ
ใช้ user-select: none
ไปยังลิงก์ที่ดูเหมือนปุ่ม (เช่น <a href="/th/whatever" class="button">Click Me!</a>
).
ไม่สามารถเลือกเนื้อหาข้อความของ a <button>
or <input type="submit">
เพราะดี ทำไมคุณถึง? อย่างไรก็ตาม ลักษณะการทำงานนี้ใช้ไม่ได้กับลิงก์ เนื่องจากโดยปกติแล้วจะเป็นส่วนหนึ่งของย่อหน้าที่ควรเลือกได้
พอใช้ได้
เราอาจเถียงว่า การทำให้ลิงก์ดูเหมือนปุ่มเป็นรูปแบบการต่อต้านแต่อะไรก็ตาม มันไม่ทำลายเน็ตหรอกเหรอ? เรือลำนั้นแล่นไปแล้วอยู่แล้ว ดังนั้นหากคุณใช้ลิงก์ที่ออกแบบมาให้ดูเหมือนปุ่ม ลิงก์เหล่านั้นควรเลียนแบบพฤติกรรมของปุ่ม ไม่ใช่แค่เพื่อความสอดคล้องกันเท่านั้น แต่เพื่อป้องกันไม่ให้ผู้ใช้เลือกเนื้อหาโดยไม่ได้ตั้งใจแทนที่จะทริกเกอร์การโต้ตอบ
ฉันมักจะเลือกสิ่งต่าง ๆ โดยไม่ได้ตั้งใจเพราะฉันใช้แล็ปท็อปอยู่บนเตียงมากกว่าที่ฉันจะยอมรับ นอกจากนี้ยังมีเงื่อนไขทางการแพทย์หลายอย่างที่อาจส่งผลต่อการควบคุมและการประสานงาน เปลี่ยนการคลิกที่ตั้งใจเป็นการลาก/การเลือกโดยไม่ได้ตั้งใจ ดังนั้นจึงมีข้อกังวลด้านการเข้าถึงที่สามารถแก้ไขได้ user-select
เกินไป
แน่นอนว่าการโต้ตอบที่ต้องใช้การลาก (โดยเจตนา) ก็มีอยู่เช่นกัน (เช่น ในเกมเบราว์เซอร์) แต่สิ่งเหล่านี้ไม่ใช่เรื่องปกติ ยังไงก็แสดงว่า user-select
อันที่จริงมีกรณีการใช้งานค่อนข้างน้อย
หลีกเลี่ยงการขโมยเนื้อหาเพย์วอลล์
เนื้อหาแบบเพย์วอลล์ได้รับความเกลียดชังมากมาย แต่ถ้าคุณรู้สึกว่าจำเป็นต้องปกป้องเนื้อหาของคุณ เนื้อหานั้นเป็นเนื้อหาของคุณ ไม่มีใครมีสิทธิ์ขโมยได้เพียงเพราะพวกเขาไม่เชื่อว่าควรจ่ายเงิน
หากคุณต้องการลงเส้นทางนี้ มีหลายวิธีที่จะทำให้ผู้ใช้เลี่ยงผ่านเพย์วอลล์ได้ยากขึ้น (หรือในทำนองเดียวกัน คัดลอกเนื้อหาที่มีลิขสิทธิ์ เช่น งานที่เผยแพร่ของผู้อื่น)
เบลอเนื้อหาด้วย CSS:
article { filter: blur(<radius>); }
การปิดใช้งานแป้นพิมพ์ลัดสำหรับ DevTools:
document.addEventListener("keydown", function (e) {
if (e.keyCode == 123) e.preventDefault();
else if ((e.ctrlKey || e.metaKey) && e.altKey && e.keyCode == 73) e.preventDefault();
else if ((e.ctrlKey || e.metaKey) && e.altKey && e.keyCode == 74) e.preventDefault();
else if ((e.ctrlKey || e.metaKey) && e.altKey && e.keyCode == 85) e.preventDefault();
});
ปิดการใช้งานการเข้าถึง DevTools ผ่านเมนูบริบทโดยปิดการใช้งานเมนูบริบทเอง:
document.addEventListener("contextmenu", e => e.preventDefault())
และแน่นอน เพื่อป้องกันไม่ให้ผู้ใช้คัดลอกเนื้อหาเมื่อไม่ได้รับอนุญาตให้อ่านที่ต้นทาง การสมัคร user-select: none
:
<article style="user-select: none">
กรณีการใช้งานอื่น ๆ ?
นี่เป็นกรณีการใช้งานสามกรณีที่ฉันนึกถึงเพื่อป้องกันการเลือกข้อความ หลายคนคิดในใจของฉัน แต่ทั้งหมดดูเหมือนยืดเยื้อ แต่แล้วคุณล่ะ? คุณต้องปิดการใช้งานการเลือกข้อความในสิ่งใดหรือไม่? ฉันอยากรู้!