Untuk jangkar yang bertindak seperti tombol (misalnya, Pertanyaan , Tag , Pengguna , dll. Di bagian atas halaman Stack Overflow) atau tab, apakah ada cara standar CSS untuk menonaktifkan efek penyorotan jika pengguna secara tidak sengaja memilih teks?
Saya menyadari ini bisa dilakukan dengan JavaScript, dan sedikit googling menghasilkan opsi Mozilla-only -moz-user-select
.
Apakah ada cara yang sesuai standar untuk mencapai ini dengan CSS, dan jika tidak, apa pendekatan "praktik terbaik"?
css
cross-browser
highlight
textselection
Peter Mortensen
sumber
sumber
::selection { background: transparent; } ::-moz-selection { background: transparent; }
postcss
danautoprefixer
dan set versi browser, kemudianpostcss
membuat semuanya keren.Jawaban:
UPDATE Januari, 2017:
Menurut Can I use ,
user-select
saat ini didukung di semua browser kecuali Internet Explorer 9 dan versi sebelumnya (tetapi sayangnya masih membutuhkan awalan vendor).Semua variasi CSS yang benar adalah:
Perhatikan bahwa
user-select
sedang dalam proses standardisasi (saat ini dalam draft kerja W3C ). Itu tidak dijamin untuk bekerja di mana-mana, dan mungkin ada perbedaan dalam implementasi di antara browser dan di masa depan browser dapat menjatuhkan dukungan untuk itu.Informasi lebih lanjut dapat ditemukan di dokumentasi Jaringan Pengembang Mozilla .
sumber
<div onselectstart="return false;">
ke div utama saya.standard-user-select
. maka kita tidak akan memiliki masalah ini. meskipun untuk kompatibilitas mundur kita harus memasukkan yang lain juga. jadi sekarang kodenya jadi-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, jauh lebih baik.Di sebagian besar browser, ini dapat dicapai dengan menggunakan variasi kepemilikan pada
user-select
properti CSS , yang awalnya diusulkan dan kemudian ditinggalkan di CSS 3 dan sekarang diusulkan di CSS UI Level 4 :Untuk Internet Explorer <10 dan Opera <15, Anda harus menggunakan
unselectable
atribut elemen yang Anda inginkan tidak dapat dipilih. Anda dapat mengatur ini menggunakan atribut dalam HTML:Sayangnya properti ini tidak diwarisi, artinya Anda harus meletakkan atribut di tag awal setiap elemen di dalamnya
<div>
. Jika ini masalah, Anda bisa menggunakan JavaScript untuk melakukan ini secara rekursif untuk keturunan elemen:Pembaruan 30 April 2014 : Traversal pohon ini perlu dijalankan kembali setiap kali elemen baru ditambahkan ke pohon, tetapi tampaknya dari komentar oleh @Han bahwa mungkin untuk menghindari ini dengan menambahkan
mousedown
event handler yang menetapkanunselectable
target dari peristiwa. Lihat http://jsbin.com/yagekiji/1 untuk detailnya.Ini masih belum mencakup semua kemungkinan. Meskipun tidak mungkin untuk memulai pemilihan dalam elemen yang tidak dapat dipilih, di beberapa browser (Internet Explorer dan Firefox, misalnya) masih tidak mungkin untuk mencegah pilihan yang dimulai sebelum dan berakhir setelah elemen yang tidak dapat dipilih tanpa membuat seluruh dokumen tidak dapat dipilih.
sumber
*.foo
dan.foo
persis setara (dalam kasus kedua, pemilih universal (*
) tersirat), jadi cegah pembatasan browser, saya tidak bisa melihat bahwa termasuk*
kehendak akan membahayakan kinerja. Sudah lama kebiasaan saya untuk memasukkan*
, yang awalnya saya mulai lakukan untuk dibaca: secara eksplisit menyatakan sekilas bahwa penulis bermaksud untuk mencocokkan semua elemen.Solusi JavaScript untuk Internet Explorer adalah:
sumber
ondragstart
!body.onselectstart = function(e) { if (e.target.nodeName != "INPUT" && e.target.nodeName != "TEXTAREA") { e.preventDefault(); return false; } return true; }
input
elemen bahkan jika saya menggunakanuser-select: none
. saya perlu tahu bagaimana mencegah iniSampai properti pilihan pengguna CSS 3 menjadi tersedia, browser berbasis Gecko mendukung
-moz-user-select
properti yang sudah Anda temukan. Browser berbasis WebKit dan Blink mendukung-webkit-user-select
properti ini.Ini tentu saja tidak didukung di browser yang tidak menggunakan mesin rendering Tokek.
Tidak ada "standar" yang sesuai cara cepat dan mudah untuk melakukannya; menggunakan JavaScript adalah sebuah opsi.
Pertanyaan sebenarnya adalah, mengapa Anda ingin pengguna tidak dapat menyorot dan mungkin menyalin dan menempel elemen tertentu? Saya belum menemukan satu kali pun yang saya ingin agar pengguna tidak menyorot sebagian situs web saya. Beberapa teman saya, setelah menghabiskan berjam-jam membaca dan menulis kode akan menggunakan fitur highlight sebagai cara untuk mengingat di mana halaman itu berada, atau memberikan penanda sehingga mata mereka tahu ke mana harus mencari berikutnya.
Satu-satunya tempat yang saya anggap bermanfaat adalah jika Anda memiliki tombol untuk formulir yang tidak boleh disalin dan ditempelkan jika pengguna menyalin dan menempelkan situs web.
sumber
Jika Anda ingin menonaktifkan pemilihan teks pada segala hal kecuali pada
<p>
elemen, Anda dapat melakukan ini dalam CSS (perhatikan-moz-none
yang memungkinkan penggantian dalam sub-elemen, yang diizinkan di browser lain dengannone
):sumber
p, input { -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -o-user-select: text; user-select: text; }
-moz-none
dannone
sama.ul>* { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -o-user-select: none; user-select: none; }
[memilih segala sesuatu dalam daftar yang tidak diurutkan, dan membuatnya tidak dapat dipilih, daripada menghancurkan seluruh pohon tampilan.] Terima kasih atas pelajarannya. Daftar tombol saya terlihat hebat, dan merespons dengan benar terhadap ketukan dan penekanan layar, daripada meluncurkan IME (widget clipboard android).Dalam solusi di jawaban jawaban sebelumnya dihentikan, tetapi pengguna masih berpikir Anda dapat memilih teks karena kursor masih berubah. Agar tetap statis, Anda harus mengatur kursor CSS Anda:
Ini akan membuat teks Anda benar-benar rata, seperti pada aplikasi desktop.
sumber
user-select: none;
, berpikir standar akan diadopsi sekarang, tetapi sayangnya tidak. Membuat Anda bertanya-tanya apa yang masih bisa diperdebatkan oleh orang-orang di komite standar. "Tidak, kalian ... aku benar-benar berpikir itu harususer-select: cant;
karena itu lebih deskriptif, kau tahu?" "Kita sudah membahas ini, Mike. Kita harus menghilangkan tanda kutip, dan itu bentuk yang buruk!" "Cukup, semuanya! Kita akan membahas masalah ini lagi bulan depan. Rapat Komite Standar ditunda!"Anda dapat melakukannya di Firefox dan Safari (Chrome juga?)
sumber
Penanganan masalah untuk WebKit :
Saya menemukannya dalam contoh CardFlip.
sumber
transparent
sebagai pengganti rgba juga berfungsi di Chrome 42 di Android.Saya suka solusi hybrid CSS + jQuery.
Untuk membuat semua elemen di dalam
<div class="draggable"></div>
tidak dapat dipilih, gunakan CSS ini:Dan kemudian, jika Anda menggunakan jQuery, tambahkan ini di dalam
$(document).ready()
blok:Saya pikir Anda masih ingin elemen input untuk dapat berinteraksi, maka
:not()
pseudo-selector. Anda bisa menggunakannya'*'
sebagai gantinya jika Anda tidak peduli.Peringatan: Internet Explorer 9 mungkin tidak memerlukan bagian jQuery tambahan ini, jadi Anda mungkin ingin menambahkan versi cek di sana.
sumber
-moz-user-select: Normal;
jQuery.browser
telah ditinggalkan sejak versi 1.3 dan telah dihapus dalam versi 1.9 - api.jquery.com/jQuery.browserTapi itu bukan cara terbaik.
sumber
title
sebagai atribut.user-select
tidak berfungsi.Anda dapat menggunakan CSS atau JavaScript untuk itu.
The JavaScript Cara didukung dalam lebih tua browser, seperti lama versi Internet Explorer juga, tetapi jika itu tidak terjadi, gunakan cara CSS maka:
HTML / JavaScript:
HTML / CSS:
sumber
Sebagai tambahan untuk Internet Explorer, Anda perlu menambahkan kelas pseudo
focus
(.ClassName: fokus) danoutline-style: none
.sumber
className
kelas. Lihat JSBin ini .Cobalah untuk memasukkan baris-baris ini ke dalam CSS dan panggil "disHighlight" di properti kelas:
sumber
Pembaruan Peretas Cepat
Jika Anda menggunakan nilai
none
untuk semuauser-select
properti CSS (termasuk awalan peramban itu), ada masalah yang masih bisa terjadi dengan ini.Seperti kata CSS-Trik , masalahnya adalah:
WebKit masih memungkinkan teks untuk disalin, jika Anda memilih elemen di sekitarnya.
Anda juga dapat menggunakan yang di bawah ini untuk memilih
enforce
seluruh elemen yang berarti jika Anda mengklik suatu elemen, semua teks yang dibungkus dengan elemen itu akan dipilih. Untuk ini yang harus Anda lakukan adalah mengubah nilainyanone
menjadiall
.sumber
Bagi mereka yang kesulitan mencapai hal yang sama di browser Android dengan acara sentuh, gunakan:
sumber
Jika Anda menggunakan Less dan Bootstrap Anda bisa menulis:
sumber
sumber
Kerja
CSS:
Ini seharusnya bekerja, tetapi tidak akan berfungsi untuk browser lama. Ada masalah kompatibilitas browser.
sumber
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.
Dengan SASS (sintaks SCSS)
Anda dapat melakukan ini dengan mixin :
Dalam tag HTML:
Cobalah di CodePen ini .
Jika Anda menggunakan autoprefixer, Anda dapat menghapus awalan lainnya.
Kompatibilitas browser di sini .
sumber
Selain dari properti Mozilla saja, tidak, tidak ada cara untuk menonaktifkan pemilihan teks hanya dengan CSS standar (seperti yang sekarang).
Jika Anda perhatikan, Stack Overflow tidak menonaktifkan pemilihan teks untuk tombol navigasi mereka, dan saya akan merekomendasikan untuk tidak melakukannya dalam kebanyakan kasus, karena memodifikasi perilaku pemilihan normal dan membuatnya bertentangan dengan harapan pengguna.
sumber
Ini berfungsi di beberapa browser:
Cukup tambahkan elemen / id yang Anda inginkan di depan pemilih yang dipisahkan oleh koma tanpa spasi, seperti:
Jawaban lainnya lebih baik; ini mungkin harus dilihat sebagai jalan terakhir / catchall.
sumber
Misalkan ada dua
div
s seperti ini:Tetapkan kursor ke default sehingga akan memberikan nuansa yang tidak dapat dipilih untuk pengguna.
sumber
Ini akan berguna jika pemilihan warna juga tidak diperlukan:
... semua perbaikan browser lainnya. Ini akan bekerja di Internet Explorer 9 atau yang lebih baru.
sumber
color: inherit;
mungkin.Tambahkan ini ke div pertama di mana Anda ingin menonaktifkan pemilihan teks:
sumber
CATATAN:
Jawaban yang benar adalah benar karena itu mencegah Anda memilih teks. Namun, itu tidak menghalangi Anda untuk dapat menyalin teks, seperti yang akan saya tunjukkan dengan beberapa tangkapan layar berikutnya (per 7 November 2014).
Seperti yang Anda lihat, kami tidak dapat memilih angka, tetapi kami dapat menyalinnya.
Diuji pada: Ubuntu , Google Chrome 38.0.2125.111.
sumber
Untuk mendapatkan hasil yang saya butuhkan, saya menemukan saya harus menggunakan keduanya
::selection
danuser-select
sumber
Ini mudah dilakukan dengan:
Kalau tidak:
Katakanlah Anda punya
<h1 id="example">Hello, World!</h1>
. Anda harus menghapus innerHTML ituh1
, dalam hal ini Halo, Dunia . Maka Anda harus pergi ke CSS dan melakukan ini:Sekarang hanya berpikir itu adalah elemen blok, dan bukan teks.
sumber
Ini bukan CSS, tetapi perlu disebutkan:
jQuery UI Nonaktifkan Pilihan :
sumber
Periksa solusi saya tanpa JavaScript:
jsFiddle
Menu popup dengan teknik saya diterapkan: http://jsfiddle.net/y4Lac/2/
sumber
Meskipun pseudo-element ini dalam konsep CSS Selectors Level 3, elemen itu dihapus selama fase Calon Rekomendasi, karena kelihatannya perilakunya kurang spesifik, terutama dengan elemen bersarang, dan interoperabilitas tidak tercapai.
Ini sedang dibahas di How :: selection bekerja pada elemen bersarang .
Meskipun sedang diimplementasikan di browser, Anda dapat membuat ilusi teks tidak dipilih dengan menggunakan warna dan warna latar yang sama pada pemilihan pada desain tab (dalam kasus Anda).
Desain CSS normal
Saat seleksi
Menolak pengguna untuk memilih teks akan meningkatkan masalah kegunaan.
sumber