Я создал карусель с предыдущей и следующей кнопками, которые всегда видны. Эти кнопки находятся в состоянии наведения, они становятся синими. На сенсорных устройствах, таких как iPad, состояние зависания остается липким, поэтому кнопка после нажатия остается синей. Я не хочу этого
Я мог бы добавить
no-hover
классontouchend
для каждой кнопки и сделать свой CSS таким:button:not(.no-hover):hover { background-color: blue; }
но это, вероятно, очень плохо сказывается на производительности и неправильно обрабатывает устройства, такие как Chromebook Pixel (с сенсорным экраном и мышью).Я мог бы добавить
touch
класс кdocumentElement
и сделать мой CSS следующим образом:html:not(.touch) button:hover { background-color: blue; }
Но это также не работает на устройствах с сенсорным и мыши.
То, что я бы предпочел, это удаление состояния наведения ontouchend
. Но не похоже, что это возможно. Фокусировка на другом элементе не устраняет состояние наведения. Касание другого элемента выполняется вручную, но я не могу вызвать это в JavaScript.
Все решения, которые я нашел, кажутся несовершенными. Есть ли идеальное решение?
источник
Как только CSS Media Queries Level 4 будет реализован, вы сможете сделать это:
Или по-английски: «Если браузер поддерживает правильное / истинное / реальное / неэмулируемое наведение (например, имеет основное устройство ввода, похожее на мышь), тогда применяйте этот стиль, когда
button
s наведен на».Поскольку эта часть Media Queries Level 4 до сих пор была реализована только в новейшем Chrome, я написал для этого полифилл . Используя его, вы можете преобразовать вышеупомянутый футуристический CSS в:
(Разновидность
.no-touch
техники) И затем, используя некоторый клиентский JavaScript из того же полифилла, который обнаруживает поддержку зависания, вы можете соответствующим образом переключать присутствиеmy-true-hover
класса:источник
Это обычная проблема без идеального решения. Поведение при наведении курсора полезно с мышью и в основном вредно при касании. Усугубляют проблему устройства, поддерживающие сенсорное управление и мышь (одновременно, не меньше!), Такие как Chromebook Pixel и Surface.
Самое чистое решение, которое я нашел, - включить поведение при наведении, только если устройство не поддерживает сенсорный ввод.
Конечно, вы теряете зависание на устройствах, которые могут его поддерживать. Однако иногда при наведении указывается больше, чем на саму ссылку, например, возможно, вы хотите показать меню при наведении на элемент. Такой подход позволяет проверить наличие прикосновения и, возможно, условно прикрепить другое событие.
Я проверил это на iPhone, iPad, Chromebook Pixel, Surface и различных устройствах Android. Я не могу гарантировать, что он будет работать, когда к миксу будет добавлен общий сенсорный ввод USB (например, стилус).
источник
С Modernizr вы можете ориентировать свои зависания специально для устройств без касания:
(Примечание: это не работает в системе фрагментов StackOverflow, вместо этого проверьте jsfiddle )
Обратите внимание, что на
:active
него не нужно ориентироваться,.no-touch
так как он работает как на мобильном, так и на настольном компьютере.источник
.no-touch
оно присутствует вhtml
теге. В противном случае этот ответ получит мою печать одобрения.Вы можете переопределить эффект наведения для устройств, которые не поддерживают наведение. Подобно:
Протестировано и проверено на iOS 12
Шляпа для https://stackoverflow.com/a/50285058/178959 за указание на это.
источник
источник
Из 4 способов борьбы с зависанием на мобильном устройстве : вот способ динамически добавлять или удалять
can touch
класс « » в документе на основе текущего типа ввода пользователя. Он также работает с гибридными устройствами, где пользователь может переключаться между касанием и мышью / трекпадом:источник
Я собирался опубликовать свое собственное решение, но проверив, уже кто-то опубликовал его, я обнаружил, что @Rodney почти сделал это. Тем не менее, он упустил последний момент, который сделал его бесполезным, по крайней мере, в моем случае. Я имею в виду, что я тоже использовал одно и то же
.fakeHover
добавление / удаление классовmouseenter
иmouseleave
обнаружение событий, но само по себе оно действует почти так же, как «подлинный»:hover
. Я имею в виду: когда вы нажимаете на элемент в вашей таблице, он не обнаружит, что вы его «оставили» - таким образом, сохраняя состояние «поддельного».Я тоже просто слушал
click
, поэтому, когда я «нажимаю» на кнопку, я вручную запускаю amouseleave
.Si это мой окончательный код:
Таким образом вы сохраняете свою обычную
hover
функциональность при использовании мыши, когда просто «зависаете» на кнопках. Ну, почти все: единственный недостаток в том, что после нажатия кнопки мышью она не будет вhover
состоянии. Как если бы вы нажали и быстро вынули указатель из кнопки. Но в моем случае я могу жить с этим.источник
Это то, что я придумал до сих пор после изучения остальных ответов. Он должен поддерживать только сенсорные, мышиные или гибридные пользователи.
Создайте отдельный класс наведения для эффекта наведения. По умолчанию добавьте этот класс наведения к нашей кнопке.
Мы не хотим обнаруживать наличие сенсорной поддержки и отключать все эффекты наведения с самого начала. Как уже упоминалось, гибридные устройства набирают популярность; люди могут иметь сенсорную поддержку, но хотят использовать мышь и наоборот. Поэтому удаляйте класс наведения только тогда, когда пользователь фактически касается кнопки.
Следующая проблема заключается в том, что если пользователь захочет вернуться к использованию мыши после нажатия кнопки? Чтобы решить эту проблему, нам нужно найти подходящий момент, чтобы добавить обратно класс hover, который мы удалили.
Однако мы не можем добавить его обратно сразу после его удаления, потому что состояние наведения все еще активно. Мы можем не захотеть уничтожить и воссоздать всю кнопку также.
Итак, я подумал об использовании алгоритма ожидания занятости (используя setInterval) для проверки состояния наведения. После того как состояние наведения деактивировано, мы можем добавить обратно класс наведения и остановить ожидание занятости, возвращая нас в исходное состояние, в котором пользователь может использовать мышь или касание.
Я знаю, что ожидание не так уж и здорово, но я не уверен, что есть подходящее событие. Я решил добавить его обратно в событие mouseleave, но это было не очень надежно. Например, когда после нажатия кнопки появляется предупреждение, положение мыши смещается, но событие отпускания мыши не вызывается.
Изменить: Другой подход, который я попробовал, это позвонить
e.preventDefault()
в ontouchstart или ontouchend. Кажется, что он останавливает эффект наведения при нажатии кнопки, но он также останавливает анимацию нажатия кнопки и предотвращает вызов функции onclick при касании кнопки, поэтому вы должны вызывать их вручную в обработчике ontouchstart или ontouchend. Не очень чистое решение.источник
Это было полезно для меня: ссылка
источник
Добавьте этот код JS на свою страницу:
Теперь в вашем CSS перед каждым наведением мыши добавьте класс наведения так:
Если устройство сенсорное, класс тела будет пустым, в противном случае его класс будет зависать, и правила будут применены!
источник
document.body.className = 'ontouchstart' in window ? '' : 'hover';
Это правильная отправная точка. Следующий шаг: применить / удалить класс nohover для следующих событий (демонстрация с jQuery)
Примечание: Если вы хотите применить другие классы к элементу buttonelement, то: not (.nohover) в CSS больше не будет работать должным образом. Чем вы должны добавить вместо этого отдельное определение со значением по умолчанию и тег! Важный для перезаписи стиля наведения: .nohover {background-color: white! Важный}
Это должно даже правильно обрабатывать устройства, такие как Chromebook Pixel (с сенсорным экраном и мышью)! И я не думаю, что это главный убийца производительности ...
источник
Решение, которое сработало для меня:
Добавьте этот код в вашу таблицу стилей.
Я хотел избавиться от серого фона, который появляется в iOS Safari при нажатии на ссылку. Но, похоже, сделать больше. Теперь нажатие кнопки (с
:hover
псевдоклассом!) Открывается сразу же! Я тестировал его только на iPad, не знаю, будет ли он работать на других устройствах.источник
Я думаю, что нашел элегантное (минимум JS) решение для аналогичной проблемы:
Используя jQuery, вы можете запустить hover на теле (или любом другом элементе), используя
.mouseover()
Поэтому я просто присоединяю этот обработчик к
ontouchend
событию элемента следующим образом:Это, однако, удаляет псевдокласс: hover из элемента только после запуска какого-либо другого события касания, например, удара или другого касания
источник
У меня есть хорошее решение, которым я хотел бы поделиться. Во-первых, вам нужно определить, находится ли пользователь на мобильном телефоне, например:
Затем просто добавьте:
И в CSS:
источник
Я столкнулся с подобной проблемой, мое приложение было совместимо для всех размеров экрана и имело огромное количество эффектов наведения на экране рабочего стола. / мыши, а позже я понял, что сенсорные устройства вызывали состояние, известное как липкое - однако, это было препятствием для правильной работы приложения для пользователей сенсорных устройств.
Мы использовали SCSS в нашем приложении. и я определил миксин, чтобы позаботиться о сенсорном устройстве.
и затем я поместил все свои классы CSS под нижеупомянутый фрагмент.
Например, у нас был класс для анимации значка, который использовался, когда мы наводим курсор на значок, как вы можете видеть его из css, но на сенсорном устройстве на него воздействовал липкий эффект наведения, а затем я помещал его внутрь @ включите hover-support () , чтобы гарантировать, что наведение относится только к тем устройствам, которые поддерживают наведение.
источник
Вот простой код JavaScript, который не требует от разработчика редактирования CSS или написания новых правил CSS. Я написал это для кнопок Bootstrap с помощью кнопки
class="btn"
, но она будет работать с любой кнопкой с определенным именем класса.Шаги:
document.styleSheets
.btn
и:hover
Исключение всех
.btn :hover
правил CSS гарантирует, что на кнопке не будет визуального эффекта наведения мыши.Шаг 1. Обнаружение сенсорного устройства
Проверьте медиа-запрос на наличие
(hover: none)
:Шаг 2: Удалить правила CSS, содержащие `btn` и`: hover`
Полный код на GitHub и npm .
Живая демоверсия на terrymorse.com .
источник
@media (hover:none)
или когда пользователь впервые касается экрана. Вы можете попробовать это на демо-странице, чтобы быть уверенным.Вы можете установить цвет фона для
:active
состояния и:focus
задать фон по умолчанию.если вы установите фоновый цвет через
onfocus/ontouch
, стиль цвета останется после того, как:focus
состояние исчезнет.Вам также необходимо выполнить сброс,
onblur
чтобы восстановить значение по умолчанию bg при потере фокуса.источник
Это сработало для меня: положить стиль наведения в новый класс
Затем добавьте / удалите класс по мере необходимости
Повторите для TouchStart и Touchend событий. Или любые другие события, которые вам нравятся, чтобы получить желаемый результат, например, я хотел, чтобы эффект зависания был переключен на сенсорном экране.
источник
Основано на ответе Даррена Кука, который также работает, если вы переместили палец на другой элемент.
См. Поиск элемента, палец включен во время события касания
Codepen Demo
источник
Вы можете попробовать это так.
JavaScript:
CSS:
источник
То, что я делал до сих пор в своих проектах, состояло в том, чтобы отменить
:hover
изменения на сенсорных устройствах:Все имена классов и названные цвета только для демонстрационных целей ;-)
источник
Это прекрасно работает в 2 этапа.
Установите свой тег тела, чтобы быть таким
<body ontouchstart="">
. Я не фанат этого «хака», но он позволяет Safari на iOS мгновенно реагировать на прикосновения. Не уверен, как, но это работает.Настройте свой осязательный класс следующим образом:
Возможно, вы захотите удалить любую анимацию в вашем сенсорном классе. Android Chrome немного медленнее, чем iOS.
Это также приведет к тому, что активное состояние будет применено, если пользователь прокручивает страницу, касаясь вашего класса.
источник
Некоторые из зависших или застрявших
:hover
:focus
:active
проблем на мобильных устройствах могут быть вызваны отсутствием,<meta name="viewport" content="width=device-width">
поскольку браузеры пытаются манипулировать экраном.источник
Для меня решение было после того, как touchend должен был клонировать и заменить узел ... я ненавижу делать это, но даже попытка перекрасить элемент с помощью offsetHeight не работает
источник
Это может быть достигнуто путем замены класса HTML. Он должен быть менее подвержен глюкам, чем удаление всего элемента, особенно с большими ссылками на изображения и т. Д.
Мы также можем решить, хотим ли мы парить запускать состояния при при прокрутке касанием (touchmove) или даже добавить тайм-аут, чтобы задержать их.
Единственным существенным изменением в нашем коде будет использование дополнительного класса HTML, например,
<a class='hover'></a>
элементов, которые реализуют новое поведение.HTML
CSS
JS (с помощью jQuery)
пример
https://codepen.io/mattrcouk/pen/VweajZv
-
У меня нет устройства с мышью и сенсорным экраном, чтобы проверить его должным образом.
источник
С 2020 года вы можете добавлять стили наведения в медиа-запрос
Этот медиазапрос указывает, что стили будут работать в браузерах, которые не эмулируют: hover, поэтому он не будет работать в сенсорных браузерах.
источник