Как указывалось в других ответах, 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 (){});
Однако я не знаю, как это повлияет на производительность, так что будьте осторожны.
РЕДАКТИРОВАТЬ: В этом решении есть один серьезный недостаток: даже прикосновение к элементу во время прокрутки страницы активирует :active
псевдосостояние. Чувствительность слишком сильная. Android решает эту проблему, вводя очень небольшую задержку перед отображением состояния, которая отменяется при прокрутке страницы. В свете этого я предлагаю использовать это только для избранных элементов. В моем случае я разрабатываю веб-приложение для использования в поле, которое в основном представляет собой список кнопок для навигации по страницам и отправки действий. Поскольку в некоторых случаях вся страница состоит из кнопок, для меня это не сработает. Однако вы можете :hover
вместо этого установить псевдосостояние. После отключения серого поля по умолчанию это работает отлично.
ontouchstart
без=""
? (HTML5)