Я хочу игнорировать все :hover
объявления CSS, если пользователь заходит на наш сайт через сенсорное устройство. Потому что :hover
CSS не имеет смысла, и это может даже беспокоить, если планшет запускает его при нажатии / нажатии, потому что тогда он может застрять, пока элемент не потеряет фокус. Честно говоря, я не знаю, почему сенсорные устройства чувствуют необходимость срабатывать :hover
в первую очередь - но это реальность, поэтому и эта проблема тоже реальность.
a:hover {
color:blue;
border-color:green;
// etc. > ignore all at once for touch devices
}
Итак, (как) я могу удалить / игнорировать все :hover
объявления CSS сразу (без необходимости знать каждое) для сенсорных устройств после их объявления?
Ответы:
tl; dr используйте это: https://jsfiddle.net/57tmy8j3/
Если вам интересно, почему или какие есть другие варианты, читайте дальше.
Quick'n'dirty - удалить: парить стили, используя JS
Вы можете удалить все правила CSS, содержащие
:hover
с помощью Javascript. Преимущество этого в том, что вам не нужно трогать CSS и быть совместимым даже с более старыми браузерами.Ограничения: таблицы стилей должны размещаться в одном и том же домене (это означает, что нет CDN). Отключает зависания на смешанных мышах и сенсорных устройствах, таких как Surface или iPad Pro, что вредно для UX.
Только CSS - используйте медиазапросы
Поместите все свои правила: hover в
@media
блок:или, альтернативно, переопределите все ваши правила наведения (совместимые со старыми браузерами):
Ограничения: работает только на iOS 9.0+, Chrome для Android или Android 5.0+ при использовании WebView.
hover: hover
устраняет эффекты парения в старых браузерах,hover: none
требует переопределения всех ранее определенных правил CSS. Оба несовместимы со смешанными мышью и сенсорными устройствами .Самое надежное - обнаруживать касания с помощью JS и добавлять CSS: правила наведения
Этот метод требует добавления всех правил наведения
body.hasHover
. (или имя класса по вашему выбору)hasHover
Класс может быть добавлен с помощьюhasTouch()
из первого примера:Однако это может иметь те же недостатки со смешанными сенсорными устройствами, что и в предыдущих примерах, что приводит нас к окончательному решению. Включить эффекты наведения при каждом перемещении курсора мыши, отключить эффекты при наведении при каждом касании.
Это должно работать в основном в любом браузере и включать / отключать стили при наведении.
Вот полный пример - современный: https://jsfiddle.net/57tmy8j3/
Legacy (для использования со старыми браузерами): https://jsfiddle.net/dkz17jc5/19/
источник
document.styleSheets
существует, а не использоватьtry/catch
?try/catch
только в случае, если появляется какая-то странная ошибка, которая может привести к сбою скрипта, например, deleteRule не работает из-за политики того же источника или нестабильной поддержки в IE (отредактировал комментарий, чтобы отразить это). Но да, в большинстве случаев достаточно простой проверки.Указатель адаптации к спасению!
Поскольку это не было затронуто некоторое время, вы можете использовать:
Посмотрите эту демонстрацию как в браузере своего компьютера, так и в браузере телефона . Поддерживается современными сенсорными устройствами .
Примечание . Имейте в виду, что поскольку основным входом (возможностью) Surface PC является мышь, он в конечном итоге станет синей ссылкой, даже если это отдельный экран (планшет). Браузеры всегда будут (по умолчанию) использовать наиболее точные возможности ввода.
источник
Я столкнулся с той же проблемой (в моем случае с мобильными браузерами Samsung) и поэтому наткнулся на этот вопрос.
Благодаря ответу Calsal я нашел то, что, как мне кажется, исключит практически все настольные браузеры, потому что оно, кажется, распознается мобильными браузерами, которые я пробовал (см. Скриншот из скомпилированной таблицы: таблица обнаружения функций указателя CSS) ).
В веб-документах MDN говорится, что
,
Я обнаружил, что указатель: грубый - это то, что неизвестно всем браузерам на рабочем столе в прилагаемой таблице, но известно всем мобильным браузерам в одной таблице. Это кажется наиболее эффективным выбором, потому что все другие значения ключевых слов указателя дают противоречивые результаты.
Следовательно, вы могли бы создать медиа-запрос, как Calsal описано но слегка измененный. Он использует обратную логику, чтобы исключить все сенсорные устройства.
Sass mixin:
Скомпилированный CSS:
Это также описано в этой сущности, которую я создал после исследования проблемы. Codepen для эмпирических исследований.
ОБНОВЛЕНИЕ : На момент написания этого обновления, 2018-08-23, и было отмечено @DmitriPavlutin, этот метод больше не работает с настольным компьютером Firefox.
источник
Согласно ответу Джейсона, мы можем обращаться только к тем устройствам, которые не поддерживают hover, с чисто медиа-запросами CSS. Мы также можем обращаться только к устройствам, поддерживающим зависание, например, к ответу moogal на аналогичный вопрос
@media not all and (hover: none)
. Это выглядит странно, но это работает.Из этого я сделал миксин Sass для более легкого использования:
Обновление 2019-05-15 : я рекомендую эту статью из Medium , в которой рассматриваются все различные устройства, на которые мы можем ориентироваться с помощью CSS. По сути, это микс этих медиа-правил, объединяющий их для определенных целей:
Пример для конкретных целей:
Мне нравятся миксины, вот как я использую свой парящий миксин только для целевых устройств, которые его поддерживают:
источник
Я имею дело с подобной проблемой в настоящее время.
У меня сразу возникает два основных варианта: (1) проверка пользовательских строк или (2) ведение отдельных мобильных страниц с использованием другого URL и предоставление пользователям выбора того, что лучше для них.
<link rel="mobile.css" />
обычным стилем вместо.Пользовательские строки содержат идентифицирующую информацию о браузере, рендерере, операционной системе и т. Д. Вам решать, какие устройства являются «сенсорными», а не не сенсорными. Возможно, вы сможете найти эту информацию где-нибудь и отобразить ее в своей системе.
О. Если вам разрешено игнорировать старые браузеры , вам просто нужно добавить одно правило в обычный немобильный css, а именно:EDIT : Erk. После выполнения некоторых экспериментов, я обнаружил , что ниже правила также отключает способность следовать ссылки на WebKit-браузеров в дополнение к просто вызывает эстетический эффект будет отключен - см http://jsfiddle.net/3nkcdeao/Таким образом , вы будете иметь быть немного более избирательным в отношении того, как вы изменяете правила для мобильного случая, чем то, что я показываю здесь, но это может быть полезной отправной точкой
В качестве идентификатора, отключение событий указателя на родительском элементе и затем явное включение их на дочернем элементе в настоящее время приводит к тому, что любые эффекты наведения на родительский элемент снова становятся активными, если входит дочерний элемент
:hover
.Смотрите http://jsfiddle.net/38Lookhp/5/
Б. Если вы поддерживаете устаревшие веб-рендереры, вам придется проделать немного больше работы, удаляя любые правила, которые устанавливают специальные стили во время
:hover
. Чтобы сэкономить время, вам может понадобиться создать команду автоматического копирования + sed, которую вы запускаете в своих стандартных таблицах стилей для создания мобильных версий. Это позволило бы вам просто написать / обновить стандартный код и удалить все правила стиля, которые используются:hover
для мобильной версии ваших страниц.Опять же, здесь вы можете просто добавить одно или два дополнительных правила к таблицам стилей или сделать что-то более сложное, используя sed или аналогичную утилиту. Возможно, это будет проще всего применить: не к вашим правилам стиля, например, к которым
div:not(.disruptive):hover {...
вы добавляетеclass="disruptive"
элементы, которые раздражают мобильных пользователей, использующих js или язык сервера, вместо манипулирования CSS.(II) Вы можете на самом деле объединить первые два и (если вы подозреваете, что пользователь перешел на неправильную версию страницы), вы можете предложить им переключаться на / из дисплея мобильного типа или просто иметь ссылку где-нибудь, что позволяет пользователям шлепаться взад и вперед. Как уже говорилось, запросы @media также могут быть полезны при определении того, что используется для посещения.
(III) Если вы готовы к решению jQuery, когда вы знаете, какие устройства являются «сенсорными», а какие нет, вам может оказаться полезным игнорирование наведения мыши на устройствах с сенсорным экраном .
источник
pointer-events
- это восхитительно! Это именно то, что я искал, большое спасибо!<a>
ссылки могут быть недоступны приpointer-events:none
. Если повезет, это изменится позже - или CSS 3.x или 4.0+ будутpointer-events:navigation-only
или похожи.попробуй это:
ОБНОВЛЕНИЕ: к сожалению, W3C удалил это свойство из спецификации ( https://github.com/w3c/csswg-drafts/commit/2078b46218f7462735bb0b5107c9a3e84fb4c4b1 ).
источник
Вы можете использовать Modernizr JS (см. Также этот ответ StackOverflow ) или создать собственную функцию JS:
чтобы обнаружить поддержку сенсорного события в браузере, а затем присвоить регулярное
CSS
свойство, пересекающий элемент сhtml.no-touch
классом, как это:источник
html
тега вместоbody
тега может сделать его немного лучше для чтения. Это на самом деле решение, которое я сейчас использую. В любом случае, спасибо.Это было полезно для меня: ссылка
источник
Это также возможный обходной путь, но вам нужно будет пройти через CSS и добавить
.no-touch
класс, прежде чем ваши стили наведения.Javascript:
Пример CSS:
Источник
PS Но мы должны помнить, что на рынке появляется все больше сенсорных устройств, которые одновременно поддерживают ввод с помощью мыши.
источник
Возможно, это еще не идеальное решение (и это с jQuery), но, возможно, это направление / концепция, над которой нужно работать: как насчет того, чтобы сделать это наоборот? Это означает, что по умолчанию необходимо деактивировать состояния: hover css и активировать их, если в любом месте документа обнаружено событие mousemove. Конечно, это не работает, если кто-то отключил JS. Что еще может говорить против этого?
Может быть так:
CSS:
JQuery:
источник
$('body').one.('mousemove', ...)
Попробуйте это (я использую background и background-color в этом примере):
CSS:
источник
Грязный путь ... Не элегантный, но самый простой способ, который может спасти вас.
Удалите все, что характеризует зависание.
источник
Если ваша проблема, когда вы касаетесь / нажимаете на Android и весь div покрыт синим прозрачным цветом! Тогда вам нужно просто изменить
КУРСОР: УКАЗАТЕЛЬ; КУРСОРУ: ПО УМОЛЧАНИЮ;
использовать mediaQuery, чтобы скрыть в мобильном телефоне / планшете.
Это работает для меня.
источник
Попробуйте это простое решение jquery 2019 года, хотя оно уже давно;
добавить этот плагин в голову:
SRC = "https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"
добавить это к JS:
$ ("*"). on ("touchend", function (e) {$ (this) .focus ();}); // применяется ко всем элементам
некоторые предлагаемые варианты этого:
$ (": input,: checkbox,"). on ("touchend", function (e) {(this) .focus);}); // указать элементы
$ ("*"). on ("click, touchend", function (e) {$ (this) .focus ();}); // включить событие клика
css: body {курсор: указатель; } // коснитесь где-нибудь, чтобы закончить фокус
Ноты
Ссылки:
https://code.jquery.com/ui/
https://api.jquery.com/category/selectors/jquery-selector-extensions/
источник