Dengan beberapa HTML seperti ini:
<p>Some Text</p>
Lalu beberapa CSS seperti ini:
p {
color:black;
}
p:hover {
color:red;
}
Bagaimana cara mengizinkan sentuhan lama pada perangkat yang mendukung sentuhan untuk mereplikasi hover? Saya dapat mengubah markup / menggunakan JS dll, tetapi tidak dapat memikirkan cara mudah untuk melakukan ini.
Jawaban:
Oke, saya sudah berhasil! Ini melibatkan sedikit mengubah CSS dan menambahkan beberapa JS.
Menggunakan jQuery untuk mempermudah:
Dalam bahasa Inggris: saat Anda memulai atau mengakhiri sentuhan, aktifkan
hover_effect
atau nonaktifkan kelas .Kemudian, di HTML Anda, tambahkan hover kelas ke apa pun yang Anda ingin ini bekerja dengannya. Di CSS Anda, ganti contoh apa pun dari:
dengan
Dan hanya untuk kegunaan tambahan, tambahkan ini ke CSS Anda juga:
Untuk menghentikan browser yang meminta Anda untuk menyalin / menyimpan / memilih gambar atau apapun.
Mudah!
sumber
toggle
akan mengacaukan jika pengguna menyentuh satu elemen dan menyeret ke elemen lain (misalnya jika mereka menyentuh item yang salah dan mencoba membatalkan sentuhan)touchend
danpreventDefault()
di situs web saya dan berfungsi dengan baik tetapi sekarang menu tidak ditutup secara otomatis oleh tap di luar target.touchstart
pendengar lain di tubuh (atau serupa) tetapi saya bertanya-tanya apakah ada cara yang lebih baik. Terima kasih!Yang perlu Anda lakukan hanyalah mengikat touchstart pada orang tua. Sesuatu seperti ini akan berhasil:
Anda tidak perlu melakukan apa pun dalam fungsi tersebut, biarkan kosong. Ini akan cukup untuk membuat hover saat disentuh, sehingga sentuhan berperilaku lebih seperti: hover dan kurang seperti: aktif. Keajaiban iOS.
sumber
Coba ini:
Dan di CSS Anda:
Dengan kode ini, Anda tidak memerlukan kelas .hover ekstra!
sumber
Untuk menjawab pertanyaan utama Anda: “Bagaimana cara menyimulasikan gerakan kursor dengan sentuhan pada browser yang diaktifkan?”
Cukup izinkan 'mengklik' elemen (dengan mengetuk layar), lalu picu
hover
acara menggunakan JavaScript.Ini seharusnya berfungsi, selama ada
hover
acara di perangkat Anda (meskipun biasanya tidak digunakan).Pembaruan: Saya baru saja menguji teknik ini di iPhone saya dan tampaknya berfungsi dengan baik. Coba di sini: http://jsfiddle.net/mathias/YS7ft/show/light/
Jika Anda ingin menggunakan 'sentuhan panjang' untuk memicu hover, Anda dapat menggunakan cuplikan kode di atas sebagai titik awal dan bersenang-senang dengan timer dan lainnya;)
sumber
Solusi Lebih Lanjut
Pertama saya menggunakan pendekatan Rich Bradshaw , tetapi kemudian masalah mulai muncul. Dengan melakukan e.preventDefault () pada 'touchstart' acara , halaman tidak lagi menggulung dan, tekan lama tidak dapat mengaktifkan menu opsi atau zoom klik ganda tidak dapat menyelesaikan eksekusi.
Solusinya bisa menemukan acara mana yang dipanggil dan hanya e.preventDefault () di yang kemudian, 'touchend' . Karena scroll 'touchmove' muncul sebelum 'touchend', ia tetap seperti secara default, dan 'klik' juga dicegah karena muncul kata penutup dalam rangkaian peristiwa yang diterapkan ke seluler, seperti:
Tapi kemudian, ketika menu opsi muncul, itu tidak lagi mengaktifkan 'sentuhan' yang bertanggung jawab untuk mematikan kelas, dan lain kali perilaku hover akan sebaliknya, benar-benar bercampur.
Sebuah solusi kemudian akan, sekali lagi, secara kondisional mencari tahu di acara mana kita berada, atau hanya melakukan yang terpisah, dan menggunakan addClass () dan removeClass () masing-masing pada 'touchstart' dan 'touchend' , memastikan itu selalu dimulai dan diakhiri dengan masing-masing menambah dan menghapus alih-alih memutuskannya secara bersyarat. Untuk menyelesaikannya, kami juga akan mengikat callback penghapusan ke jenis peristiwa 'focusout' , tetap bertanggung jawab untuk menghapus kelas hover link apa pun yang mungkin tetap aktif dan tidak pernah dikunjungi kembali, seperti:
Perhatian: Beberapa bug masih terjadi di dua solusi sebelumnya dan, juga berpikir (belum diuji), zoom klik dua kali masih gagal juga.
Rapi dan Semoga Solusi Javascript Bebas Bug (bukan :))
Sekarang , untuk yang kedua, lebih bersih, rapi dan responsif, lakukan pendekatan hanya menggunakan javascript (tidak ada campuran antara kelas .hover dan pseudo: hover) dan dari mana Anda dapat memanggil langsung perilaku ajax Anda pada acara 'klik' universal (seluler dan desktop) , Saya telah menemukan pertanyaan yang dijawab dengan cukup baik yang akhirnya saya mengerti bagaimana saya dapat mencampur peristiwa sentuh dan mouse bersama-sama tanpa beberapa peristiwa panggilan balik pasti mengubah satu sama lain di atas rantai peristiwa. Begini caranya:
sumber
hover
Efek mouse tidak dapat diterapkan di perangkat sentuh. Ketika saya muncul dengan situasi yang sama disafari
ios
saya dulu:active
di css untuk membuat efek.yaitu.
Dalam kasus saya ini bekerja. Mungkin ini juga kasus yang dapat digunakan tanpa menggunakan javascript. Coba saja.
sumber
Tambahkan kode ini dan kemudian setel kelas "tapHover" ke elemen yang Anda ingin gunakan dengan cara ini. Pertama kali Anda menge-tap elemen, Anda akan mendapatkan pseudoclass ": hover" dan class "tapped". Acara klik akan dicegah. Kedua kalinya Anda mengetuk elemen yang sama - peristiwa klik akan diaktifkan.
sumber
Tanpa perangkat (atau lebih tepatnya browser) JS khusus, saya cukup yakin Anda kurang beruntung.
Sunting: pikir Anda ingin menghindari itu sampai saya membaca ulang pertanyaan Anda. Dalam hal Mobile Safari, Anda dapat mendaftar untuk mendapatkan semua acara sentuh yang serupa dengan apa yang dapat Anda lakukan dengan UIView-s asli. Tidak dapat menemukan dokumentasinya sekarang, akan mencoba.
sumber
Salah satu cara untuk melakukannya adalah dengan melakukan efek hover saat sentuhan dimulai, lalu menghilangkan efek hover saat sentuhan bergerak atau berakhir.
Inilah yang dikatakan Apple tentang penanganan sentuh secara umum, karena Anda menyebut iPhone.
sumber
Selera pribadi saya adalah menghubungkan
:hover
gaya dengan:focus
negara, seperti:Kemudian dengan HTML berikut:
Dan JavaScript berikut:
sumber
Dipecahkan 2019 - Arahkan Saat Menyentuh
Sekarang tampaknya lebih baik untuk menghindari penggunaan hover sama sekali dengan ios atau sentuhan secara umum. Kode di bawah ini menerapkan css Anda selama sentuhan dipertahankan, dan tanpa flyout ios lainnya. Melakukan hal ini;
Jquery add: $ ("p"). On ("touchstart", function (e) {$ (this) .focus (); e.preventDefault ();});
CSS: ganti p: hover dengan p: focus, dan tambahkan p: active
Pilihan;
ganti selektor jquery p dengan kelas apapun dll
agar efek tetap ada, pertahankan p: hover juga, dan tambahkan body {cursor: ponter;} jadi ketukan di mana saja akan mengakhirinya
coba peristiwa klik & gerakan mouse serta touchstart dalam kode yang sama (tetapi tidak diuji)
hapus e.preventDefault (); untuk memungkinkan pengguna menggunakan ios flyout, misalnya menyalin
Catatan
hanya diuji untuk elemen teks, ios mungkin memperlakukan input dll secara berbeda
hanya diuji di iphone XR ios 12.1.12, dan ipad 3 ios 9.3.5, menggunakan Safari atau Chrome.
sumber
Campuran Javascript dan jQuery asli:
sumber
Solusi termudah yang saya temukan: Saya memiliki beberapa tag <span> dengan: hover aturan css di dalamnya. Saya beralih ke <a href = "javascript: void (0)"> dan voilà. Gaya hover di iOS mulai berfungsi.
sumber
Gunakan dapat menggunakan CSS juga, menambahkan fokus dan aktif (untuk IE7 dan di bawah) ke tautan tersembunyi. Contoh menu ul di dalam div dengan menu kelas:
Ini terlambat dan belum teruji, harus bekerja ;-)
sumber