Я пишу веб-сайт, предназначенный для использования как с настольных компьютеров, так и с планшетов. Когда его посещают с рабочего стола, я хочу, чтобы области экрана, на которые можно нажимать, подсвечивались эффектами :hover
(другой цвет фона и т. Д.). На планшете нет мыши, поэтому я не хочу никаких эффектов наведения мыши.
Проблема в том, что когда я нажимаю что-то на планшете, браузер, очевидно, имеет какой-то «невидимый курсор мыши», который перемещается в место, которое я коснулся, и затем оставляет его там - так что вещь, которую я только что нажал, горит с эффектом парения, пока я не коснусь чего-то другого.
Как получить эффекты наведения при использовании мыши, но подавить их при использовании сенсорного экрана?
В случае, если кто-то подумал предложить это, я не хочу использовать сниффинг пользовательского агента. Одно и то же устройство может иметь как сенсорный экран, так и мышь (может быть, не так часто сегодня, но гораздо больше в будущем). Меня не интересует устройство, меня интересует, как оно используется в настоящее время: мышь или сенсорный экран.
Я уже пытался перехватить события touchstart
, touchmove
и touchend
и вызвать preventDefault()
для всех из них, что иногда подавляет «невидимый курсор мыши»; но если я быстро нажму вперед и назад между двумя различными элементами, после нескольких нажатий он начнет перемещать «курсор мыши» и, в любом случае, подсвечивать эффекты наведения - это как будто мой preventDefault
не всегда соблюдается. Я не буду утомлять вас деталями без необходимости - я даже не уверен, что это правильный подход; если у кого-то есть более простое решение, я весь в ушах.
Редактировать: Это может быть воспроизведено с помощью стандартного болотного CSS :hover
, но вот краткое повторение для справки.
<style>
.box { border: 1px solid black; width: 150px; height: 150px; }
.box:hover { background: blue; }
</style>
<div class="box"></div>
<div class="box"></div>
Если навести указатель мыши на любое из полей, оно получит синий фон, который я хочу. Но если вы нажмете на любое из полей, оно также получит синий фон, что я и пытаюсь предотвратить.
Я также опубликовал пример здесь , который выполняет вышеприведенное, а также перехватывает события мыши jQuery. Вы можете использовать его, чтобы увидеть, что события касания также будут запускать mouseenter
, mousemove
и mouseleave
.