Как уже говорилось в других ответах, iOS Safari не вызывает псевдокласс :active
, если к элементу не присоединено событие касания, но пока это поведение было "волшебным". Я наткнулся на эту маленькую рекламу в Safari Developer Library , которая объясняет это (выделено мной):
Также можно использовать свойство CSS -webkit-tap-highlight-color
в сочетании с установкой события касания, чтобы настроить кнопки на поведение, аналогичное рабочему столу. В 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>
, который всех событий touch, а затем всплывающих, не работает полностью. Если элемент отображается в окне просмотра при загрузке страницы, то он работает нормально, но прокрутка вниз и касание элемента, который был вне области просмотра, не вызывает псевдо-состояние :active
, как и должно , Итак, вместо
<!DOCTYPE html>
<html><body ontouchstart></body></html>
прикрепить событие ко всем элементам вместо того, чтобы полагаться на событие, всплывающее до тела (используя jQuery):
$('body *').on('touchstart', function (){});
Однако я не знаю о последствиях этого для производительности, так что будьте осторожны.
РЕДАКТИРОВАТЬ: Есть один серьезный недостаток этого решения: даже прикосновение к элементу во время прокрутки страницы активирует псевдо-состояние :active
. Чувствительность слишком сильная. Android решает эту проблему, вводя очень небольшую задержку перед отображением состояния, которая отменяется при прокрутке страницы. В свете этого я предлагаю использовать это только для отдельных элементов. В моем случае я разрабатываю веб-приложение для использования в полевых условиях, которое представляет собой список кнопок для навигации по страницам и отправки действий. Так как в некоторых случаях вся страница содержит много кнопок, у меня это не сработает. Однако вы можете установить псевдо-состояние :hover
, чтобы заполнить его вместо этого. После отключения стандартного серого поля это работает отлично.