Saya telah membuat korsel dengan tombol sebelumnya dan selanjutnya yang selalu terlihat. Tombol-tombol ini memiliki status hover, berubah menjadi biru. Pada perangkat sentuh, seperti iPad, status hover lengket, sehingga tombol tetap biru setelah mengetuknya. Saya tidak menginginkan itu.
Saya dapat menambahkan
no-hover
kelasontouchend
untuk setiap tombol, dan membuat CSS saya seperti ini:button:not(.no-hover):hover { background-color: blue; }
tetapi itu mungkin sangat buruk untuk kinerja, dan tidak menangani perangkat seperti Chromebook Pixel (yang memiliki layar sentuh dan mouse) dengan benar.Saya bisa menambahkan
touch
kelas kedocumentElement
dan membuat CSS saya seperti ini:html:not(.touch) button:hover { background-color: blue; }
Tapi itu juga tidak berfungsi dengan baik pada perangkat dengan sentuhan dan mouse.
Yang saya inginkan adalah menghapus status hover ontouchend
. Tapi sepertinya itu tidak mungkin. Memfokuskan elemen lain tidak menghapus status hover. Mengetuk elemen lain secara manual, tetapi sepertinya saya tidak dapat memicunya di JavaScript.
Semua solusi yang saya temukan tampaknya tidak sempurna. Apakah ada solusi yang sempurna?
sumber
Setelah CSS Media Query Level 4 diimplementasikan, Anda akan dapat melakukan ini:
Atau dalam bahasa Inggris: "Jika browser mendukung hovering yang benar / benar / nyata / tidak-emulasi (mis. Memiliki perangkat input primer seperti mouse), maka terapkan gaya ini ketika
button
s berada di atas."Karena bagian dari Kueri Media Level 4 ini sejauh ini hanya diterapkan di Chrome yang berdarah, saya menulis polyfill untuk mengatasinya. Dengan menggunakannya, Anda dapat mengubah CSS futuristik di atas menjadi:
(Variasi pada
.no-touch
teknik) Dan kemudian menggunakan beberapa sisi-klien JavaScript dari polyfill yang sama yang mendeteksi dukungan untuk melayang, Anda dapat mengubah keberadaanmy-true-hover
kelas sesuai:sumber
Ini adalah masalah umum tanpa solusi sempurna. Perilaku melayang berguna dengan mouse dan sebagian besar merugikan dengan sentuhan. Yang menjadi masalah adalah perangkat yang mendukung sentuhan dan mouse (secara bersamaan, tidak kurang!) Seperti Chromebook Pixel dan Surface.
Solusi terbersih yang saya temukan adalah hanya mengaktifkan perilaku melayang jika perangkat tidak dianggap mendukung input sentuh.
Memang, Anda kehilangan kursor pada perangkat yang mungkin mendukungnya. Namun, terkadang hover dampak lebih dari tautan itu sendiri, mis. Mungkin Anda ingin menampilkan menu ketika sebuah elemen di-hover. Pendekatan ini memungkinkan Anda untuk menguji keberadaan sentuhan dan mungkin secara kondisional melampirkan peristiwa yang berbeda.
Saya sudah menguji ini di iPhone, iPad, Chromebook Pixel, Surface, dan berbagai perangkat Android. Saya tidak dapat menjamin bahwa itu akan berfungsi ketika input sentuh USB umum (seperti stylus) ditambahkan ke dalam mix.
sumber
Dengan Modernizr Anda dapat menargetkan hover Anda secara khusus untuk perangkat tanpa sentuhan:
(Catatan: ini tidak berjalan pada sistem potongan StackOverflow, periksa jsfiddle sebagai gantinya)
Catatan yang
:active
tidak perlu ditargetkan.no-touch
karena itu berfungsi seperti yang diharapkan pada ponsel dan desktop.sumber
.no-touch
ada padahtml
tag. Kalau tidak, jawaban ini mendapat cap persetujuan saya.Anda dapat mengesampingkan efek hover untuk perangkat yang tidak mendukung hover. Suka:
Diuji dan diverifikasi di iOS 12
Kiat tip untuk https://stackoverflow.com/a/50285058/178959 untuk menunjukkan ini.
sumber
sumber
Dari 4 cara menangani sticky hover di ponsel : Ini cara untuk menambah atau menghapus "
can touch
" kelas secara dinamis ke dokumen berdasarkan tipe input pengguna saat ini. Ini bekerja dengan perangkat hybrid juga di mana pengguna dapat beralih antara sentuhan dan mouse / trackpad:sumber
Saya akan memposting solusi saya sendiri, tetapi memeriksa apakah seseorang sudah mempostingnya, saya menemukan bahwa @Rodney hampir melakukannya. Namun, dia melewatkannya satu krusial terakhir yang membuatnya tidak menarik, setidaknya dalam kasus saya. Maksud saya, saya juga mengambil
.fakeHover
penambahan / penghapusan kelas yang samamouseenter
danmouseleave
deteksi acara, tetapi itu saja, per se , bertindak hampir persis seperti "asli":hover
. Maksud saya: ketika Anda mengetuk elemen di meja Anda, itu tidak akan mendeteksi bahwa Anda telah "meninggalkannya" - dengan demikian menjaga status "pemalsuan".Apa yang saya lakukan hanyalah mendengarkan
click
, jadi ketika saya "mengetuk" tombolnya, saya secara manual menyalakan amouseleave
.Si, ini kode terakhir saya:
Dengan cara ini Anda menjaga
hover
fungsionalitas Anda yang biasa saat menggunakan mouse saat hanya "melayang" pada tombol Anda. Yah, hampir semuanya: satu-satunya kelemahannya adalah, setelah mengklik tombol dengan mouse, itu tidak akan dalamhover
keadaan. Sama seperti jika Anda mengklik dan dengan cepat mengeluarkan pointer dari tombol. Tetapi dalam kasus saya, saya bisa hidup dengan itu.sumber
Inilah yang saya temukan sejauh ini setelah mempelajari sisa jawaban. Itu harus dapat mendukung pengguna sentuh saja, mouse saja atau hybrid.
Buat kelas hover terpisah untuk efek hover. Secara default, tambahkan kelas hover ini ke tombol kami.
Kami tidak ingin mendeteksi keberadaan dukungan sentuh dan menonaktifkan semua efek hover dari awal. Seperti yang disebutkan oleh orang lain, perangkat hybrid semakin populer; orang mungkin memiliki dukungan sentuh tetapi ingin menggunakan mouse dan sebaliknya. Oleh karena itu, hapus saja kelas hover ketika pengguna benar-benar menyentuh tombol.
Masalah selanjutnya adalah, bagaimana jika pengguna ingin kembali menggunakan mouse setelah menyentuh tombol? Untuk mengatasinya, kita perlu mencari momen yang tepat untuk menambahkan kembali kelas hover yang telah kita hapus.
Namun, kami tidak dapat menambahkannya kembali segera setelah menghapusnya, karena status hover masih aktif. Kami mungkin tidak ingin menghancurkan dan membuat ulang seluruh tombol juga.
Jadi, saya berpikir untuk menggunakan algoritma sibuk-menunggu (menggunakan setInterval) untuk memeriksa status hover. Setelah negara melayang dinonaktifkan, kita kemudian dapat menambahkan kembali kelas melayang dan menghentikan sibuk menunggu, membawa kita kembali ke keadaan awal di mana pengguna dapat menggunakan mouse atau sentuhan.
Saya tahu sibuk-menunggu tidak terlalu bagus tapi saya tidak yakin apakah ada acara yang tepat. Saya sudah mempertimbangkan untuk menambahkannya kembali di acara mouseleave, tapi itu tidak terlalu kuat. Misalnya, ketika peringatan muncul setelah tombol disentuh, posisi mouse bergeser tetapi acara mouseleave tidak terpicu.
Sunting: Pendekatan lain yang saya coba adalah menelepon
e.preventDefault()
dalam ontouchstart atau ontouchend. Tampaknya untuk menghentikan efek hover ketika tombol disentuh, tetapi juga menghentikan animasi klik tombol dan mencegah fungsi onclick dipanggil saat tombol disentuh, jadi Anda harus memanggil mereka secara manual di ontouchstart atau ontouchend handler. Bukan solusi yang sangat bersih.sumber
Itu membantu saya: tautan
sumber
Tambahkan kode JS ini ke halaman Anda:
sekarang di CSS Anda sebelum setiap hover menambahkan kelas hover seperti ini:
Jika perangkat disentuh, kelas tubuh akan kosong, jika tidak kelasnya akan mengambang dan aturan diterapkan!
sumber
document.body.className = 'ontouchstart' in window ? '' : 'hover';
Ini adalah titik awal yang tepat. Langkah berikutnya: menerapkan / menghapus kelas nohover pada acara-acara berikut (demo dengan jQuery)
Perhatian: Jika Anda ingin menerapkan kelas lain ke elemen tombol, the: not (.nohover) di CSS tidak akan berfungsi lagi seperti yang diharapkan. Daripada Anda harus menambahkan definisi yang terpisah dengan nilai default dan! Tag penting untuk menimpa gaya hover: .nohover {background-color: white! Important}
Ini bahkan harus menangani perangkat seperti Chromebook Pixel (yang memiliki layar sentuh dan mouse) dengan benar! Dan saya tidak berpikir, bahwa ini adalah pembunuh kinerja utama ...
sumber
Solusi yang berhasil bagi saya:
Tambahkan kode ini ke stylesheet Anda.
Saya ingin menyingkirkan latar belakang abu-abu yang muncul di iOS Safari ketika tautan diklik. Tetapi tampaknya melakukan lebih banyak. Sekarang mengklik tombol (dengan
:hover
pseudoclass!) Akan segera dibuka! Saya hanya mengujinya di iPad, saya tidak tahu apakah itu akan berfungsi pada perangkat lain.sumber
Saya pikir saya telah menemukan solusi elegan (minimum js) untuk masalah yang sama:
Menggunakan jQuery, Anda dapat memicu melayang di badan (atau elemen lainnya), menggunakan
.mouseover()
Jadi saya cukup melampirkan penangan ini ke acara elemen
ontouchend
seperti:Ini, bagaimanapun, hanya menghapus: letakkan pseudoclass dari elemen setelah beberapa peristiwa sentuhan lainnya telah dipicu, seperti menggesek atau sentuhan lain
sumber
Saya punya solusi bagus yang ingin saya bagikan. Pertama, Anda perlu mendeteksi apakah pengguna di ponsel seperti ini:
Kemudian tambahkan saja:
Dan dalam CSS:
sumber
Saya mengalami masalah yang sama, aplikasi saya kompatibel untuk semua ukuran layar memiliki banyak efek hover di ukuran layar desktop / mouse , dan kemudian saya menyadari bahwa perangkat berbasis sentuhan menyebabkan kondisi yang dikenal sebagai lengket -hover dan itu adalah rintangan bagi aplikasi untuk bekerja dengan baik untuk pengguna perangkat berbasis sentuhan.
Kami memanfaatkan SCSS di aplikasi kami. dan saya mendefinisikan mixin untuk menjaga perangkat berbasis sentuhan.
dan kemudian saya menempatkan semua kelas css saya di bawah cuplikan yang disebutkan di bawah ini.
Sebagai contoh, kami memiliki kelas untuk menggerakkan ikon, dan yang digunakan untuk memicu setelah kami mengarahkan ikon seperti yang Anda lihat dari css, tetapi di perangkat berbasis sentuhan itu dipengaruhi oleh efek hover yang lengket dan kemudian saya menempatkannya di dalam @ termasuk dukungan hover () untuk memastikan bahwa hover hanya berlaku untuk perangkat yang mendukung hover.
sumber
Berikut adalah beberapa kode JavaScript sederhana yang tidak mengharuskan pengembang untuk mengedit CSS atau menulis aturan CSS baru. Saya menulis ini untuk tombol Bootstrap
class="btn"
, tetapi akan bekerja dengan tombol apa pun yang memiliki nama kelas tertentu.Langkah-langkahnya adalah:
document.styleSheets
.btn
dan:hover
Penghapusan semua
.btn :hover
aturan CSS memastikan bahwa tidak akan ada efek melayang visual pada tombol.Langkah 1: Deteksi Perangkat Sentuh
Periksa kueri media untuk mengetahui keberadaan
(hover: none)
:Langkah 2: Hapus Aturan CSS yang Mengandung `btn` dan`: hover`
Kode lengkap ada di GitHub dan npm .
Demo langsung di terrymorse.com .
sumber
@media (hover:none)
, atau ketika pengguna pertama kali menyentuh layar. Anda dapat mencobanya di halaman demo langsung untuk memastikan.Anda dapat mengatur warna latar belakang pada
:active
status dan memberikan:focus
latar belakang defaut.jika Anda mengatur warna latar melalui
onfocus/ontouch
, gaya warna akan tetap setelah:focus
status hilang.Anda perlu mengatur ulang
onblur
juga untuk mengembalikan bg cacat saat fokus hilang.sumber
Ini bekerja untuk saya: letakkan hover styling di kelas baru
Kemudian tambahkan / hapus kelas saat dan ketika dibutuhkan
Ulangi untuk touchstart dan touchend acara. Atau acara apa pun yang Anda suka untuk mendapatkan hasil yang diinginkan, misalnya saya ingin efek hover diaktifkan di layar sentuh.
sumber
Berdasarkan jawaban Darren Cooks yang juga berfungsi jika Anda memindahkan jari Anda ke elemen lain.
Lihat Menemukan elemen jari aktif selama acara touchend
Codepen Demo
sumber
Anda bisa coba cara ini.
javascript:
css:
sumber
Apa yang saya lakukan sejauh ini dalam proyek-proyek saya adalah mengembalikan
:hover
perubahan pada perangkat sentuh:Semua nama kelas dan nama warna hanya untuk tujuan demonstrasi ;-)
sumber
Ini berfungsi sempurna dalam 2 langkah.
Atur tag tubuh Anda menjadi seperti ini
<body ontouchstart="">
. Saya bukan penggemar "peretasan" ini, tetapi memungkinkan Safari di iOS bereaksi terhadap sentuhan secara instan. Tidak yakin bagaimana, tetapi itu berhasil.Atur kelas terjamah Anda seperti ini:
Anda mungkin ingin menghapus animasi apa pun di kelas yang dapat Anda sentuh. Android Chrome tampaknya sedikit lebih lambat dari iOS.
Ini juga akan menghasilkan status aktif yang diterapkan jika pengguna menggulir halaman saat menyentuh kelas Anda.
sumber
Beberapa masalah lengket atau macet
:hover
:focus
:active
pada perangkat seluler mungkin disebabkan oleh hilangnya<meta name="viewport" content="width=device-width">
karena peramban mencoba memanipulasi layar.sumber
Solusi bagi saya adalah setelah touchend adalah untuk mengkloning dan mengganti node ... Aku benci melakukan ini tetapi bahkan mencoba mengecat ulang elemen dengan offsetHeight tidak bekerja
sumber
Ini dapat dilakukan dengan menukar kelas HTML. Seharusnya lebih rentan terhadap gangguan daripada menghapus seluruh elemen, terutama dengan tautan gambar besar, dll.
Kita juga dapat memutuskan apakah kita ingin melayang status dipicu saat menggulir dengan sentuhan (touchmove) atau bahkan menambahkan batas waktu untuk menunda mereka.
Satu-satunya perubahan signifikan dalam kode kami akan menggunakan kelas HTML tambahan seperti
<a class='hover'></a>
pada elemen yang menerapkan perilaku baru.HTML
CSS
JS (dengan jQuery)
Contoh
https://codepen.io/mattrcouk/pen/VweajZv
-
Saya tidak memiliki perangkat dengan mouse dan sentuh untuk mengujinya dengan benar.
sumber
Dari 2020 Anda dapat menambahkan gaya hover di dalam kueri media
Kueri media ini menunjukkan bahwa gaya akan berfungsi pada peramban yang tidak meniru: arahkan kursor sehingga TIDAK akan berfungsi pada peramban sentuh.
sumber