В Webkit на iPhone / iPad / iPod указание стиля для псевдокласса: active для <a>
тега не срабатывает при нажатии на элемент. Как я могу заставить это сработать? Пример кода:
<style>
a:active {
background-color: red;
}
</style>
<!-- snip -->
<a href="#">Click me</a>
iphone
css
webkit
mobile-safari
pseudo-class
Джесси Русак
источник
источник
ontouchstart
без=""
? (HTML5)Как указывалось в других ответах, iOS Safari не запускает
:active
псевдокласс, если к элементу не привязано событие касания, но до сих пор это поведение было «волшебным». Я наткнулся на эту небольшую аннотацию к библиотеке разработчика Safari, которая объясняет это (выделено мной):Другими словами, установка
ontouchstart
события (даже если оно пустое) явно указывает браузеру реагировать на события касания.На мой взгляд, это ошибочное поведение и, вероятно, восходит к тому времени, когда «мобильный» Интернет практически не существовал (взгляните на эти скриншоты на связанной странице, чтобы понять, что я имею в виду), и все было ориентировано на мышь. Интересно отметить, что другие, более новые мобильные браузеры, такие как Android, отображают псевдосостояние `: active 'при касании нормально, без каких-либо взломов, подобных тому, что требуется для iOS.
(Примечание: если вы хотите использовать свои собственные стили в iOS, вы также можете отключить серый полупрозрачный блок по умолчанию, который iOS использует вместо
:active
псевдосостояния, используя-webkit-tap-highlight-color
свойство CSS, как описано на той же связанной странице выше .)После некоторых экспериментов ожидаемое решение по установке
ontouchstart
события для<body>
элемента, к которому затем всплывают все события касания, не работает полностью. Если элемент виден в области просмотра при загрузке страницы, то он работает нормально, но прокрутка вниз и нажатие на элемент, который находился вне области просмотра, не вызывает:active
псевдосостояние, как должно. Итак, вместоприкрепите событие ко всем элементам вместо того, чтобы полагаться на всплытие события до тела (используя jQuery):
Однако я не знаю, как это повлияет на производительность, так что будьте осторожны.
РЕДАКТИРОВАТЬ: В этом решении есть один серьезный недостаток: даже прикосновение к элементу во время прокрутки страницы активирует
:active
псевдосостояние. Чувствительность слишком сильная. Android решает эту проблему, вводя очень небольшую задержку перед отображением состояния, которая отменяется при прокрутке страницы. В свете этого я предлагаю использовать это только для избранных элементов. В моем случае я разрабатываю веб-приложение для использования в поле, которое в основном представляет собой список кнопок для навигации по страницам и отправки действий. Поскольку в некоторых случаях вся страница состоит из кнопок, для меня это не сработает. Однако вы можете:hover
вместо этого установить псевдосостояние. После отключения серого поля по умолчанию это работает отлично.источник
Добавьте обработчик событий для ontouchstart в свой тег <a>. Это заставляет CSS волшебным образом работать.
источник
Это работает для меня:
Примечание. Если вы проделаете этот трюк, также стоит удалить цвет выделения по умолчанию, применяемый в Mobile Safari, используя следующее правило CSS.
источник
По состоянию на 8 декабря 2016 года принятый ответ (
<body ontouchstart="">...</body>
) не работает для меня в Safari 10 (iPhone 5s): этот хакерский метод работает только для тех элементов, которые были видны при загрузке страницы.Однако добавление:
to the
head
действительно работает так, как я хочу, с обратной стороной, что теперь все события касания во время прокрутки также запускают:active
псевдосостояние для затронутых элементов. (Если это проблема для вас, вы можете рассмотреть обходной:hover
путь FighterJet .)источник
Это работает для меня, добавьте в свой CSS элемент, который вы хотите выделить
источник
Вы используете все псевдоклассы или только один? Если вы используете как минимум два, убедитесь, что они в правильном порядке, иначе все сломаются:
..в этой последовательности. Кроме того, если вы просто используете: active, добавьте ссылку:, даже если вы ее не стилизуете.
источник
Я опубликовал инструмент, который должен решить эту проблему за вас.
На первый взгляд проблема выглядит простой, но на самом деле поведение касания и щелчка нужно настраивать довольно широко, включая функции тайм-аута и такие вещи, как «что происходит, когда вы прокручиваете список ссылок» или «что происходит, когда вы нажимаете ссылку, а затем переместите мышь / палец из активной области "
Это должно решить все сразу: https://www.npmjs.com/package/active-touch
Вам нужно либо назначить: active стили классу .active, либо выбрать собственное имя класса. По умолчанию скрипт будет работать со всеми элементами ссылки, но вы можете перезаписать его своим собственным массивом селекторов.
Честные, полезные отзывы и вклад очень ценятся!
источник
Для тех, кто не хочет использовать ontouchstart, вы можете использовать этот код
источник
Я пробовал этот ответ и его варианты, но, похоже, ни один из них не работал надежно (и мне не нравится полагаться на «магию» для подобных вещей). Вместо этого я сделал следующее, которое отлично работает на всех платформах, а не только на Apple:
:active
для.active
.Составлен список всех затронутых элементов и добавлены
pointerdown/mousedown/touchstart
обработчики событий для применения.active
класса иpointerup/mouseup/touchend
обработчики событий для его удаления. Используя jQuery:Это было немного утомительно, но теперь у меня есть решение, которое менее уязвимо для сбоев между версиями ОС Apple. (А кому нужна такая поломка?)
источник
Решение состоит в том, чтобы полагаться на
:target
вместо:active
:Стиль будет срабатывать, когда привязка будет нацелена на текущий URL-адрес, который устойчив даже на мобильных устройствах. Недостатком является то, что вам нужна другая ссылка, чтобы очистить привязку в URL-адресе. Полный пример:
источник
Нет 100% -ного отношения к этому вопросу, но вы также можете использовать взлом css sibling для достижения этого
HTML
SCSS
Если вы хотите использовать чистую подсказку html / css
источник
источник