: sentuh kelas semu CSS atau yang serupa?

87

Saya mencoba membuat tombol, sehingga ketika pengguna mengkliknya, gayanya berubah saat tombol mouse ditekan. Saya juga ingin mengubah gayanya dengan cara yang sama jika disentuh di browser seluler. Hal yang tampaknya jelas bagi saya adalah menggunakan CSS: pseudo-class aktif, tetapi itu tidak berhasil. Saya mencoba: fokus, dan itu tidak berhasil juga. Saya mencoba: arahkan kursor, dan sepertinya berhasil, tetapi gaya tetap dipertahankan setelah saya melepaskan jari dari tombol. Semua pengamatan ini dilakukan pada iPhone 4 dan Droid 2.

Adakah cara untuk meniru efeknya pada browser seluler (iPhone, iPad, Android, dan semoga yang lainnya)? Untuk saat ini, saya melakukan sesuatu seperti ini:

<style type="text/css">
    #testButton {
        background: #dddddd;
    }
    #testButton:active, #testButton.active {
        background: #aaaaaa;
    }
</style>

...

<button type="button" id="testButton">test</button>

...

<script type='text/javascript' src='http://code.jquery.com/jquery-1.6.1.min.js'></script>
<script type='text/javascript'>
    $("*").live("touchstart", function() {
      $(this).addClass("active");
    }).live("touchend", function() {
      $(this).removeClass("active");
    });
</script>

Kelas semu: aktif untuk browser desktop, dan kelas aktif untuk browser sentuh.

Saya ingin tahu apakah ada cara yang lebih sederhana untuk melakukannya, tanpa melibatkan Javascript.

Elias Zamaria
sumber
2
Hampir setiap browser sentuh menangani hal-hal seperti hoverdan mousedown/ mouseupberbeda, sulit untuk mengakomodasi semuanya.
Chad
Android dan iOS keduanya memiliki: touchstart,: touchmove,: touchend, dan: touchcancel pseudoclasses yang dapat Anda gunakan.
Paul Hanbury
2
Saya mencoba mengatur gaya untuk: touchstart dan: touchend pseudo-class dan tidak berfungsi di iPhone atau Droid. @Paul Hanbury, apakah Anda yakin tidak mengacaukan pseudo-class CSS dengan acara Javascript?
Elias Zamaria
1
@ mikez302 - Saya pikir hak Anda. plugins.jquery.com/plugin-tags/touchstart
Doug Chamberlain
2
Saya akan merasa konyol mengirimkan ini sebagai jawaban, tetapi kenyataannya, jawabannya adalah "Tidak, itu tidak mungkin, Anda harus menggunakan Javascript." Apa yang Anda minta bukanlah bagian dari CSS2 atau CSS3. Menurut saya fakta bahwa: aktif tidak berfungsi adalah masalah agen pengguna yang berpotensi Anda laporkan sebagai bug di browser iOS dan Android, tetapi hanya untuk menyelesaikan masalah pengguna akhir Anda ... ya, Anda harus menggunakan JS . Anda dapat membungkus kode kompatibilitas Anda untuk memeriksa dukungan ontouchstart .
joelhardi

Jawaban:

51

Tidak ada yang namanya :touchdalam spesifikasi W3C, http://www.w3.org/TR/CSS2/selector.html#pseudo-class-selectors

:active harus bekerja, saya pikir.

Urutan pada kelas :active/ :hoverpseudo penting agar dapat berfungsi dengan benar.

Berikut adalah kutipan dari tautan di atas

Agen pengguna interaktif terkadang mengubah rendering sebagai tanggapan atas tindakan pengguna. CSS menyediakan tiga kelas pseudo untuk kasus umum:

  • Pseudo-class: hover berlaku saat pengguna menentukan elemen (dengan beberapa perangkat penunjuk), tetapi tidak mengaktifkannya. Misalnya, agen pengguna visual dapat menerapkan kelas semu ini saat kursor (penunjuk mouse) mengarahkan kursor ke kotak yang dibuat oleh elemen. Agen pengguna yang tidak mendukung media interaktif tidak harus mendukung kelas semu ini. Beberapa agen pengguna yang mendukung media interaktif mungkin tidak dapat mendukung kelas semu ini (misalnya, perangkat pena).
  • Pseudo-class: aktif berlaku saat sebuah elemen sedang diaktifkan oleh pengguna. Misalnya, di antara waktu pengguna menekan tombol mouse dan melepaskannya.
  • Pseudo-class: fokus berlaku saat elemen memiliki fokus (menerima acara keyboard atau bentuk lain dari input teks).
Doug Chamberlain
sumber
9
Saya tahu tidak ada yang namanya: sentuhan. Saya bertanya-tanya apakah ada yang serupa. : aktif tampak masuk akal tetapi tidak berhasil dalam pengujian saya.
Elias Zamaria
@ mikez302 - Saya rasa Anda tahu bahwa saya ingin mengutip sumber saya. Saya setuju dengan Anda, saya tidak melihat alasan apa pun itu tidak akan berhasil, selain poin saya tentang pesanan yang sangat penting. Saya melihat bahwa seseorang memposting sesuatu tentang pemilih semu css untuk iOS dan Android, tetapi saya tidak dapat berbicara tentang teknologi tersebut.
Doug Chamberlain
Saya beralih di sekitar: aturan aktif dan: hover dalam contoh saya dan tampaknya tidak melakukan apa-apa.
Elias Zamaria
37
@ mikez302: gunakan :activepseudoclass. Ini harus bekerja, tetapi di beberapa browser Anda memerlukan hack kecil untuk membuatnya bekerja: melampirkan sebuah event handler untuk touchstartevent pada tubuh (ex: <body ontouchstart="">)
gion_13
5
Sekadar menyentuh komentar @ mikez302 di jawaban terakhir, mereka adalah perbaikan rapi di HTML5 Mobile Boilerplate yang tertaut ke artikel ini - alxgbsn.co.uk/2011/10/17/…
Giles Butler
21

Karena seluler tidak memberikan umpan balik hover, saya ingin, sebagai pengguna, melihat umpan balik instan ketika tautan diketuk. Saya perhatikan itu -webkit-tap-highlight-coloradalah yang tercepat untuk merespons (subjektif).

Tambahkan yang berikut ini ke tubuh Anda dan tautan Anda akan memiliki efek ketuk.

body {
    -webkit-tap-highlight-color: #ccc;
}
Abdo
sumber
Tampaknya ini yang paling dapat diandalkan, tetapi tampaknya bukan yang terbaik. Warna latar belakang tampaknya sedikit memanjang keluar dari elemen, membuatnya terlihat lebih besar untuk sesaat.
Adam
@Adam yup, saya tidak bisa mengatasinya seperti yang saya ingat tetapi ini hanya untuk sepersekian detik bukanlah masalah besar bagi saya, terutama itu akan membuat pengguna mendapatkan umpan balik yang dia klik (yaitu apa yang penting bagi mereka selama fraksi waktu ini)
Abdo
Saya benar-benar mendapatkan: gaya semu aktif yang bekerja pada akhirnya hanya dengan mengikat fungsi ke acara document.ontouchstart (melalui jQuery), dengan callback kosong.
Adam
Bukan ide yang buruk :-) Saya sama sekali menghindari javascript untuk tujuan ini.
Abdo
2
Hanya berbagi itu -webkit-tap-highlight-coloradalah fitur CSS Non standar , saya menggunakan :activesebagai gantinya, itu sangat cocok & masuk akal.
Ricardo Fornes
0

Saya mengalami masalah dengan gaya tombol layar sentuh seluler. Ini akan memperbaiki masalah hover-stick / tombol aktif Anda.

body, html {
  width: 600px;
}
p {
  font-size: 20px;
}

button {
  border: none;
  width: 200px;
  height: 60px;
  border-radius: 30px;
  background: #00aeff;
  font-size: 20px;
}

button:active {
  background: black;
  color: white;
}

.delayed {
  transition: all 0.2s;
  transition-delay: 300ms;
}

.delayed:active {
  transition: none;
}
<h1>Sticky styles for better touch screen buttons!</h1>

<button>Normal button</button>

<button class="delayed"><a href="https://www.google.com"/>Delayed style</a></button>

<p>The CSS :active psuedo style is displayed between the time when a user touches down (when finger contacts screen) on a element to the time when the touch up (when finger leaves the screen) occures.   With a typical touch-screen tap interaction, the time of which the :active psuedo style is displayed can be very small resulting in the :active state not showing or being missed by the user entirely.  This can cause issues with users not undertanding if their button presses have actually reigstered or not.</p>

<p>Having the the :active styling stick around for a few hundred more milliseconds after touch up would would improve user understanding when they have interacted with a button.</p>

mxxn
sumber