Seperti jawaban lain telah menyatakan, iOS Safari tidak memicu :active
pseudo-class kecuali peristiwa sentuh dilampirkan ke elemen tersebut, tetapi sejauh ini perilaku ini "ajaib". Saya menemukan uraian kecil ini di Perpustakaan Pengembang Safari yang menjelaskannya (penekanan milik saya):
Anda juga dapat menggunakan -webkit-tap-highlight-color
properti CSS dalam kombinasi dengan menyetel peristiwa sentuh untuk mengonfigurasi tombol agar berperilaku mirip dengan desktop. Di iOS, peristiwa mouse dikirim begitu cepat sehingga status aktif atau nonaktif tidak pernah diterima. Oleh karena itu, status :active
semu hanya dipicu saat ada peristiwa sentuh yang disetel pada elemen HTML — misalnya, saat ontouchstart disetel pada elemen sebagai berikut:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Sekarang ketika tombol diketuk dan ditahan di iOS, tombol berubah menjadi warna yang ditentukan tanpa muncul warna abu-abu transparan di sekitarnya.
Dengan kata lain, menyetel ontouchstart
acara (meskipun kosong) secara eksplisit memberi tahu browser untuk bereaksi terhadap acara sentuh.
Menurut pendapat saya, ini adalah perilaku yang salah, dan mungkin berasal dari masa ketika web "seluler" pada dasarnya tidak ada (lihat screenshot di halaman yang ditautkan untuk melihat apa yang saya maksud), dan semuanya berorientasi mouse. Menarik untuk dicatat bahwa peramban seluler lain yang lebih baru, seperti di Android, menampilkan status semu ': aktif' saat disentuh dengan baik, tanpa peretasan seperti yang diperlukan untuk iOS.
(Catatan samping: Jika Anda ingin menggunakan gaya kustom Anda sendiri di iOS, Anda juga dapat menonaktifkan kotak transparan abu-abu default yang digunakan iOS sebagai pengganti status :active
semu dengan menggunakan-webkit-tap-highlight-color
properti CSS, seperti yang dijelaskan di halaman tertaut yang sama di atas .)
Setelah beberapa percobaan, solusi yang diharapkan dari pengaturan ontouchstart
peristiwa pada <body>
elemen yang semua peristiwa sentuh kemudian gelembung ke tidak bekerja sepenuhnya. Jika elemen terlihat di viewport saat halaman dimuat, maka itu berfungsi dengan baik, tetapi menggulir ke bawah dan menge-tap elemen yang berada di luar viewport tidak memicu status :active
semu seperti yang seharusnya. Jadi, bukan
<!DOCTYPE html>
<html><body ontouchstart></body></html>
lampirkan acara ke semua elemen alih-alih mengandalkan acara yang menggelembung ke badan (menggunakan jQuery):
$('body *').on('touchstart', function (){});
Namun, saya tidak mengetahui implikasi kinerja dari ini, jadi waspadalah.
EDIT: Ada satu kelemahan serius dengan solusi ini: bahkan menyentuh elemen saat menggulir halaman akan mengaktifkan status :active
semu. Sensitivitasnya terlalu kuat. Android memecahkan masalah ini dengan memberikan penundaan yang sangat kecil sebelum status ditampilkan, yang dibatalkan jika halaman di-scroll. Sehubungan dengan hal ini, saya sarankan menggunakan ini hanya pada elemen tertentu. Dalam kasus saya, saya sedang mengembangkan aplikasi web untuk digunakan di lapangan yang pada dasarnya adalah daftar tombol untuk menavigasi halaman dan mengirimkan tindakan. Karena seluruh halaman berisi cukup banyak tombol dalam beberapa kasus, ini tidak akan berhasil untuk saya. Namun, Anda dapat menyetel status :hover
semu untuk mengisi ini sebagai gantinya. Setelah menonaktifkan kotak abu-abu default, ini berfungsi dengan sempurna.
ontouchstart
tanpa=""
? (HTML5)