Як було сказано в інших відповідях, iOS Safari не запускає :active
псевдоклас, якщо до елемента не додається подія дотику, але поки така поведінка була "магічною". Я натрапив на цю маленьку розмитість у бібліотеці розробників Safari, яка пояснює це (моє значення):
Ви також можете використовувати -webkit-tap-highlight-color
властивість CSS у поєднанні з налаштуванням сенсорної події, щоб налаштувати кнопки так, як на робочому столі. На iOS події миші надсилаються так швидко, що ніколи або активний стан ніколи не надходить. Отже, :active
псевдо-стан запускається лише тоді, коли на елементі HTML є подія дотику, наприклад, коли для елемента встановлено ontouchstart таким чином:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Тепер, коли кнопка натискається і утримується на iOS, кнопка змінюється на вказаний колір без появи навколишнього прозорого сірого кольору.
Іншими словами, встановлення ontouchstart
події (навіть якщо вона порожня) явно сповіщає браузер про реакцію на події, що торкаються.
На мою думку, це хибна поведінка, і, ймовірно, датується тим часом, коли "мобільного" Інтернету в основному не було (подивіться на ці скріншоти на пов'язаній сторінці, щоб побачити, що я маю на увазі), і все було орієнтовано на мишу. Цікаво відзначити, що інші, новіші браузери для мобільних пристроїв, як-от на Android, відображають псевдо-стан `` active 'на дотик просто чудово, без будь-яких злому, як те, що потрібно для iOS.
(Побічна примітка. Якщо ви хочете використовувати власні власні стилі на iOS, ви також можете відключити сірий напівпрозорий вікно за замовчуванням, яке iOS використовує замість :active
псевдодержави, використовуючи -webkit-tap-highlight-color
властивість CSS, як пояснено на тій самій пов’язаній сторінці вище .)
Після деякого експерименту очікуване рішення встановити ontouchstart
подію на <body>
елемент, до якого всі торкаються події, а потім бульбашки, працює не повністю. Якщо елемент видно у вікні перегляду під час завантаження сторінки, він працює добре, але прокручування вниз та натискання елемента, який був поза вікном перегляду, не означає запускає :active
псевдо-стан як слід. Отже, замість
<!DOCTYPE html>
<html><body ontouchstart></body></html>
прикріпіть подію до всіх елементів, а не покладайтеся на те, що подія піднімається до тіла (використовуючи jQuery):
$('body *').on('touchstart', function (){});
Однак я не знаю наслідків цього для продуктивності, тому будьте обережні.
EDIT: У цьому рішенні є одна серйозна вада: навіть торкання елемента під час прокрутки сторінки активує :active
псевдо-стан. Чутливість занадто сильна. Android вирішує це, вводячи дуже невелику затримку до появи стану, яке скасовується, якщо сторінка прокручується. Зважаючи на це, я пропоную використовувати це лише для вибраних елементів. У моєму випадку я розробляю веб-додаток для використання у цій галузі, яка в основному є переліком кнопок для навігації по сторінках та подання дій. Оскільки у всій сторінці в деяких випадках є кнопки, це не працює для мене. Однак ви можете встановити :hover
псевдодержаву, щоб замість цього заповнити. Після відключення сірого поля за замовчуванням це працює чудово.
ontouchstart
без=""
? (HTML5)