У меня есть несколько меню css на моем сайте, которые расширяются с помощью :hover
(без js)
Это работает частично на iDevices, например, касание активирует :hover
правило и расширяет меню, но затем касание в другом месте не удаляет :hover
. Также, если есть ссылка внутри элемента, который является :hover
'ed, вам нужно дважды нажать, чтобы активировать ссылку (первое :hover
нажатие запускает ссылку, второе нажатие запускает ссылку).
Я смог заставить все работать на iphone, привязав touchstart
событие.
Проблема в том, что иногда мобильное сафари по-прежнему выбирает запуск :hover
правила из CSS, а не из моих touchstart
событий!
Я знаю, что это проблема, потому что, когда я :hover
вручную отключаю все правила в CSS, мобильное сафари работает отлично (но обычные браузеры, очевидно, больше не работают).
Есть ли способ динамически «отменять» :hover
правила для определенных элементов, когда пользователь находится в мобильном сафари?
Посмотрите и сравните поведение iOS здесь: http://jsfiddle.net/74s35/3/ Примечание: только некоторые свойства css вызывают поведение при двух щелчках, например display: none; но не фон: красный; или текст-украшение: подчеркивание;
источник
Ответы:
Я обнаружил, что ": hover" непредсказуемо в iPhone / iPad Safari. Иногда нажатие на элемент делает этот элемент «: hover», а иногда он перемещается к другим элементам.
В настоящее время у меня просто класс «без прикосновения» к телу.
И иметь все правила CSS с ": hover" ниже ".no-touch":
Где-то на странице у меня есть javascript для удаления класса без касания из тела.
Это не выглядит идеально, но все равно работает.
источник
:hover
здесь не проблема. Safari для iOS следует очень странному правилу. Он срабатываетmouseover
иmousemove
первым; если что-то изменится во время этих событий, событие click и связанные с ним события не будут запущены:mouseenter
иmouseleave
кажутся включенными, хотя в таблице они не указаны.Если вы измените что-либо в результате этих событий, события щелчка не будут запускаться. Это включает что-то более высокое в дереве DOM. Например, это предотвратит работу вашего веб-сайта с помощью jQuery с помощью одиночных кликов:
Изменить: для пояснения
hover
событие jQuery включает в себяmouseenter
иmouseleave
. Они оба предотвратить ,click
если содержание изменяется.источник
hover
обработчик jquery предотвращает попадание отдельногоclick
обработчика - что за шутка!mouseenter
jsbin.com/maseti/5/edit?html,js,outputБиблиотека обнаружения функций браузера Modernizer включает проверку событий касания.
По умолчанию он применяет классы к вашему элементу html для каждой обнаруженной функции. Затем вы можете использовать эти классы для стилизации вашего документа.
Если сенсорные события не включены, Modernizr может добавить класс
no-touch
:А затем используйте этот класс для ваших стилей наведения:
Вы можете скачать кастомную сборку Modernizr будет включать в себя как можно меньше или столько функций, сколько вам нужно.
Вот пример некоторых классов, которые можно применить:
источник
Некоторые устройства (как говорили другие) имеют события касания и мыши. Microsoft Surface, например, имеет сенсорный экран, трекпад И стилус, который фактически вызывает события наведения при наведении курсора на экран.
Любое решение, которое отключается
:hover
из-за наличия событий касания, также повлияет на пользователей Surface (и многие другие подобные устройства). Многие новые ноутбуки сенсорные и будут реагировать на сенсорные события, поэтому отключение зависания - действительно плохая практика.Это ошибка Safari, такому ужасному поведению нет абсолютно никаких оправданий. Я отказываюсь саботировать браузеры, отличные от iOS, из-за ошибки в iOS Safari, которая, по-видимому, существует уже много лет. Я очень надеюсь, что они исправят это для iOS8 на следующей неделе, но пока ....
Мое решение :
Некоторые уже предлагали использовать Modernizr, ну, Modernizr позволяет создавать свои собственные тесты. По сути, я здесь «абстрагирую» идею браузера, который поддерживает,
:hover
в тест Modernizr, который я могу использовать в своем коде без жесткого кодированияif (iOS)
.Тогда css становится примерно таким
Только на iOS этот тест завершится ошибкой и отключит опрокидывание.
Лучшая часть такой абстракции заключается в том, что если я обнаружу, что она ломается на определенном Android или если она исправлена в iOS9, я могу просто изменить тест.
источник
html:not(.no-hover) .category:hover { ...
Добавление библиотеки FastClick на вашу страницу приведет к тому, что все нажатия на мобильном устройстве будут преобразованы в события щелчка (независимо от того, где пользователь нажимает), поэтому это также должно решить проблему зависания на мобильных устройствах. Я отредактировал вашу скрипку в качестве примера: http://jsfiddle.net/FvACN/8/ .
Просто включите библиотеку fastclick.min.js на свою страницу и активируйте ее через:
В качестве дополнительного преимущества это также устранит раздражающую задержку onClick в 300 мс, от которой страдают мобильные устройства.
Есть несколько незначительных последствий использования FastClick, которые могут иметь или не иметь значения для вашего сайта:
источник
Лучшее решение, без каких-либо проверок JS, классов css и области просмотра: вы можете использовать функции взаимодействия с мультимедиа (уровень медиа-запросов 4)
Как это:
iOS Safari поддерживает это
Подробнее о: https://www.jonathanfielding.com/an-introduction-to-interaction-media-features/
источник
В основном есть три сценария:
:hover
:hover
элементыПервоначально принят ответ отлично работает , если только первые два возможных сценария, когда пользователь имеет либо указатель или сенсорный экран. Это было обычным явлением, когда ОП задал вопрос 4 года назад. Несколько пользователей отметили, что устройства с Windows 8 и Surface делают третий сценарий более вероятным.
Решение iOS для проблемы невозможности зависания на устройствах с сенсорным экраном (как описано в @Zenexer) является умным, но может привести к неправильному поведению простого кода (как отмечено OP). Отключение наведения только для устройств с сенсорным экраном означает, что вам все равно нужно будет написать альтернативу для сенсорного экрана. Обнаружение того, что у пользователя есть и указатель, и сенсорный экран, еще больше запутывает воду (как объяснил @Simon_Weaver).
На данный момент самое безопасное решение - избегать использования
:hover
как единственного способа взаимодействия пользователя с вашим сайтом. Эффекты наведения - хороший способ указать, что ссылка или кнопка активны, но от пользователя не требуется навести курсор на элемент для выполнения действия на вашем веб-сайте.Переосмысление функциональности «наведения» с учетом сенсорных экранов дает хорошее обсуждение альтернативных подходов к UX. Решения, представленные в ответе, включают:
В дальнейшем это, вероятно, будет лучшим решением для всех новых проектов. Принятый ответ, вероятно, является вторым лучшим решением, но обязательно учтите устройства, которые также имеют указательные устройства. Будьте осторожны, чтобы не исключить функциональность, когда на устройстве есть сенсорный экран, чтобы обойти
:hover
взлом iOS .источник
Версия JQuery в вашем .css использует .no-touch .my-element: hover для всех ваших правил наведения, включая JQuery и следующий скрипт
Затем в теге body добавьте class = "no-touch" ontouchstart = "removeHoverState ()"
как только ontouchstart запускает класс для всех состояний наведения, удаляется
источник
Вместо того, чтобы иметь только эффекты наведения, когда касание недоступно, я создал систему для обработки сенсорных событий, и это решило для меня проблему. Сначала я определил объект для тестирования событий «касания» (эквивалент «щелчка»).
Затем в моем обработчике событий я делаю что-то вроде следующего:
источник
Спасибо @Morgan Cheng за ответ, однако я немного изменил функцию JS для получения " touchstart " (код взят из ответа @Timothy Perez ), однако для этого вам понадобится jQuery 1.7+
источник
Учитывая ответ, предоставленный Zenexer, шаблон, не требующий дополнительных тегов HTML, выглядит следующим образом:
Этот метод сначала запускает наведение указателя мыши, а затем щелчок.
источник
Я согласен, что отключение наведения для касания - лучший вариант.
Однако, чтобы избавить себя от необходимости переписывать CSS, просто оберните любые
:hover
элементы в@supports not (-webkit-overflow-scrolling: touch) {}
источник
Для тех, кто часто использует отключение
:hover
событий в iOS Safari, самый простой способ - использовать медиа-запрос минимальной ширины для ваших:hover
событий, который остается выше ширины экрана устройств, которых вы избегаете. Пример:источник
Вы только посмотрите на размер экрана ....
источник
вот код, в который вы хотите его поместить
источник