Saya memiliki beberapa menu css di situs saya yang berkembang dengan :hover
(tanpa js)
Ini berfungsi dengan cara semi-rusak di iDevices, misalnya ketukan akan mengaktifkan :hover
aturan dan memperluas menu, tetapi kemudian mengetuk di tempat lain tidak menghapus file :hover
. Juga jika ada tautan di dalam elemen yang :hover
'ed, Anda harus mengetuk dua kali untuk mengaktifkan tautan (ketuk pemicu pertama :hover
, tautan pemicu ketuk kedua).
Saya dapat membuat semuanya bekerja dengan baik di iphone dengan mengikat touchstart
acara tersebut.
Masalahnya adalah terkadang safari seluler masih memilih untuk memicu :hover
aturan dari css daripadatouchstart
acara saya !
Saya tahu ini masalahnya karena ketika saya menonaktifkan semua :hover
aturan secara manual di css, safari seluler berfungsi dengan baik (tetapi browser biasa jelas tidak lagi).
Adakah cara untuk "membatalkan" :hover
aturan secara dinamis untuk elemen tertentu saat pengguna menggunakan safari seluler?
Lihat dan bandingkan perilaku iOS di sini: http://jsfiddle.net/74s35/3/ Catatan: hanya beberapa properti css yang memicu perilaku dua-klik, misalnya display: none; tapi bukan background: merah; atau dekorasi teks: garis bawah;
sumber
Jawaban:
Saya menemukan bahwa ": hover" tidak dapat diprediksi di iPhone / iPad Safari. Terkadang mengetuk elemen membuat elemen itu ": hover", sementara terkadang elemen itu melayang ke elemen lain.
Untuk saat ini, saya hanya memiliki kelas "tanpa sentuhan" di tubuh.
Dan memiliki semua aturan CSS dengan ": hover" di bawah ".no-touch":
Di suatu tempat di halaman, saya memiliki javascript untuk menghapus kelas no-touch dari body.
Ini tidak terlihat sempurna, tapi tetap berhasil.
sumber
:hover
bukan masalahnya di sini. Safari untuk iOS mengikuti aturan yang sangat aneh. Ini menyalamouseover
danmousemove
pertama; jika ada yang berubah selama acara ini, 'klik' dan acara terkait jangan diaktifkan:mouseenter
danmouseleave
tampaknya disertakan, meskipun tidak ditentukan dalam bagan.Jika Anda mengubah apa pun sebagai akibat dari peristiwa ini, peristiwa klik tidak akan diaktifkan. Itu termasuk sesuatu yang lebih tinggi di pohon DOM. Misalnya, ini akan mencegah satu klik berfungsi di situs web Anda dengan jQuery:
Edit: Untuk klarifikasi,
hover
acara jQuery termasukmouseenter
danmouseleave
. Keduanya akan mencegahclick
jika konten diubah.sumber
hover
pawangclick
lelucon mencegah pawang terpisah dipukul - sungguh lelucon!mouseenter
aktifPerpustakaan deteksi fitur browser Modernizer menyertakan pemeriksaan untuk peristiwa sentuh.
Perilaku defaultnya adalah menerapkan kelas ke elemen html Anda untuk setiap fitur yang terdeteksi. Anda kemudian dapat menggunakan kelas-kelas ini untuk mengatur gaya dokumen Anda.
Jika acara sentuh tidak diaktifkan, Modernizr dapat menambahkan kelas
no-touch
:Dan kemudian lingkup gaya hover Anda dengan kelas ini:
Anda dapat mengunduh build Modernizr khusus untuk menyertakan deteksi fitur sesedikit atau sebanyak yang Anda butuhkan.
Berikut contoh beberapa kelas yang dapat diterapkan:
sumber
Beberapa perangkat (seperti yang dikatakan orang lain) memiliki peristiwa sentuh dan mouse. Microsoft Surface misalnya memiliki layar sentuh, trackpad, DAN stylus yang benar-benar memunculkan peristiwa hover ketika di-hover di atas layar.
Solusi apa pun yang menonaktifkan
:hover
berdasarkan adanya peristiwa 'sentuh' juga akan memengaruhi pengguna Surface (dan banyak perangkat serupa lainnya). Banyak laptop baru yang disentuh dan akan merespons peristiwa sentuh - jadi menonaktifkan hovering adalah praktik yang sangat buruk.Ini adalah bug di Safari, sama sekali tidak ada pembenaran untuk perilaku buruk ini. Saya menolak untuk menyabotase browser non iOS karena bug di Safari iOS yang tampaknya telah ada selama bertahun-tahun. Saya sangat berharap mereka memperbaiki ini untuk iOS8 minggu depan tetapi sementara itu ....
Solusi saya :
Beberapa telah menyarankan untuk menggunakan Modernizr, baik Modernizr memungkinkan Anda membuat pengujian Anda sendiri. Apa yang pada dasarnya saya lakukan di sini adalah 'mengabstraksi' ide tentang browser yang mendukung
:hover
pengujian Modernizr yang dapat saya gunakan di seluruh kode saya tanpa hardcodeif (iOS)
seluruhnya.Kemudian css menjadi seperti ini
Hanya di iOS pengujian ini akan gagal dan menonaktifkan rollover.
Bagian terbaik dari abstraksi tersebut adalah jika saya menemukannya rusak pada android tertentu atau jika diperbaiki di iOS9 maka saya dapat memodifikasi tesnya.
sumber
html:not(.no-hover) .category:hover { ...
Menambahkan perpustakaan FastClick ke halaman Anda akan menyebabkan semua ketukan di perangkat seluler diubah menjadi peristiwa klik (di mana pun pengguna mengklik), jadi itu juga harus memperbaiki masalah hover di perangkat seluler. Saya mengedit biola Anda sebagai contoh: http://jsfiddle.net/FvACN/8/ .
Cukup sertakan lib fastclick.min.js di halaman Anda, dan aktifkan melalui:
Sebagai keuntungan tambahan, ini juga akan menghilangkan penundaan 300ms onClick yang mengganggu yang diderita perangkat seluler.
Ada beberapa konsekuensi kecil untuk menggunakan FastClick yang mungkin menjadi masalah atau tidak untuk situs Anda:
sumber
Solusi yang lebih baik, tanpa JS, kelas css, dan pemeriksaan viewport: Anda dapat menggunakan Fitur Media Interaksi (Media Queries Level 4)
Seperti ini:
iOS Safari mendukungnya
Lebih lanjut tentang: https://www.jonathanfielding.com/an-introduction-to-interaction-media-features/
sumber
Pada dasarnya ada tiga skenario:
:hover
:hover
elemenJawaban yang diterima awalnya karya-karya besar jika hanya dua skenario pertama yang mungkin, di mana pengguna memiliki baik pointer atau touchscreen. Hal ini biasa terjadi ketika OP mengajukan pertanyaan 4 tahun lalu. Beberapa pengguna telah menunjukkan bahwa perangkat Windows 8 dan Surface membuat skenario ketiga lebih mungkin terjadi.
Solusi iOS untuk masalah tidak dapat mengarahkan pada perangkat layar sentuh (seperti yang dijelaskan oleh @Zenexer) cerdas, tetapi dapat menyebabkan kode langsung menjadi tidak benar (seperti dicatat oleh OP). Menonaktifkan hover hanya untuk perangkat layar sentuh berarti Anda masih perlu membuat kode alternatif ramah layar sentuh. Mendeteksi saat pengguna memiliki penunjuk dan layar sentuh semakin mengaburkan air (seperti dijelaskan oleh @Simon_Weaver).
Pada titik ini, solusi teraman adalah menghindari penggunaan
:hover
sebagai satu-satunya cara pengguna dapat berinteraksi dengan situs web Anda. Efek arahkan kursor adalah cara yang baik untuk menunjukkan bahwa link atau tombol dapat ditindaklanjuti, tetapi pengguna tidak perlu mengarahkan kursor ke elemen untuk melakukan tindakan di situs Anda.Memikirkan ulang fungsionalitas "arahkan kursor" dengan layar sentuh memiliki diskusi yang baik tentang pendekatan UX alternatif. Solusi yang diberikan oleh jawabannya di sana meliputi:
Ke depannya, ini mungkin akan menjadi solusi terbaik untuk semua proyek baru. Jawaban yang diterima mungkin adalah solusi terbaik kedua, tetapi pastikan untuk memperhitungkan perangkat yang juga memiliki perangkat penunjuk. Berhati-hatilah untuk tidak menghilangkan fungsionalitas saat perangkat memiliki layar sentuh hanya untuk mengatasi
:hover
peretasan iOS .sumber
Versi JQuery di .css Anda menggunakan .no-touch .my-element: hover untuk semua aturan hover Anda termasuk JQuery dan skrip berikut
Kemudian di tag tubuh tambahkan class = "no-touch" ontouchstart = "removeHoverState ()"
segera setelah ontouchstart mengaktifkan kelas untuk semua status hover dihapus
sumber
Alih-alih hanya memiliki efek hover saat sentuhan tidak tersedia, saya membuat sistem untuk menangani peristiwa sentuh dan itu telah memecahkan masalah bagi saya. Pertama, saya menetapkan objek untuk menguji peristiwa "tap" (setara dengan "klik").
Kemudian, di event handler saya, saya melakukan sesuatu seperti berikut:
sumber
Terima kasih @Morgan Cheng untuk jawabannya, namun saya sedikit memodifikasi fungsi JS untuk mendapatkan " touchstart " (kode diambil dari jawaban @Timothy Perez ), meskipun, Anda memerlukan jQuery 1.7+ untuk ini
sumber
Mengingat tanggapan yang diberikan oleh Zenexer, pola yang tidak memerlukan tag HTML tambahan adalah:
Metode ini mengaktifkan gerakan mouse terlebih dahulu, klik kedua.
sumber
Saya setuju menonaktifkan hover untuk disentuh adalah cara yang tepat.
Namun, untuk menghindari masalah menulis ulang css Anda, cukup bungkus
:hover
item apa saja@supports not (-webkit-overflow-scrolling: touch) {}
sumber
Bagi mereka yang memiliki kasus penggunaan umum untuk menonaktifkan
:hover
acara di Safari iOS, cara paling sederhana adalah menggunakan kueri media dengan lebar minimum untuk:hover
acara Anda yang tetap berada di atas lebar layar perangkat yang Anda hindari. Contoh:sumber
Lihat saja ukuran layarnya ....
sumber
inilah kode yang ingin Anda tempatkan
sumber