С таким HTML:
<p>Some Text</p>
Затем немного CSS вроде этого:
p {
color:black;
}
p:hover {
color:red;
}
Как я могу позволить долгому касанию на устройстве с сенсорным экраном воспроизводить наведение? Я могу изменить разметку / использовать JS и т. Д., Но не могу придумать простого способа сделать это.
Ответы:
Хорошо, я разобрался! Это включает в себя небольшое изменение CSS и добавление JS.
Использование jQuery для упрощения:
На английском языке: когда вы начинаете или заканчиваете прикосновение, включаете
hover_effect
или выключаете класс .Затем в вашем HTML добавьте указатель класса на все, с чем вы хотите, чтобы это работало. В своем CSS замените любой экземпляр:
с участием
И просто для большей полезности добавьте это в свой CSS:
Чтобы браузер не просил вас скопировать / сохранить / выбрать изображение или что-то еще.
Легко!
источник
toggle
все испортится, если пользователь коснется одного элемента и перетащит его на другой (например, если они коснулись не того элемента иtouchend
иpreventDefault()
на своем веб-сайте, и он работает хорошо, но теперь меню не закрываются автоматически при выходе за пределы цели.touchstart
на теле может быть другой слушатель (или аналогичный), но я подумал, есть ли лучший способ. Спасибо!Все, что вам нужно сделать, это привязать touchstart к родительскому объекту. Примерно так будет работать:
В функции ничего делать не нужно, оставьте поле пустым. Этого будет достаточно, чтобы навести курсор мыши при касании, поэтому прикосновение будет вести себя больше как: hover, а не как: active. Магия iOS.
источник
Попробуй это:
И в вашем CSS:
С этим кодом вам не нужен дополнительный класс .hover!
источник
Чтобы ответить на ваш главный вопрос: «Как имитировать наведение при касании в браузерах с сенсорным экраном?»
Просто разрешите «щелкнуть» элемент (нажав на экран), а затем инициируйте
hover
событие с помощью JavaScript.Это должно работать, пока
hover
на вашем устройстве есть событие (даже если оно обычно не используется).Обновление: я только что протестировал эту технику на своем iPhone, и, похоже, она работает нормально. Попробуйте здесь: http://jsfiddle.net/mathias/YS7ft/show/light/
Если вместо этого вы хотите использовать «долгое касание» для запуска наведения курсора, вы можете использовать приведенный выше фрагмент кода в качестве отправной точки и получать удовольствие от таймеров и прочего;)
источник
Дальнейшее улучшенное решение
Сначала я использовал подход Рича Брэдшоу , но потом начали появляться проблемы. Выполняя e.preventDefault () в событии touchstart , страница больше не прокручивается, и ни долгое нажатие не может вызвать меню параметров, ни масштабирование двойным щелчком не может завершить выполнение.
Решением может быть определение того, какое событие вызывается, и просто e.preventDefault () в последнем, «touchend» . Так как «touchmove» прокрутки идет перед «touchend», он остается таким же по умолчанию, и «щелчок» также запрещен, поскольку он идет после слов в цепочке событий, применяемой к мобильному устройству, например:
Но затем, когда появляется меню опций, оно больше не запускает touchchend, отвечающий за выключение класса, и в следующий раз поведение при наведении будет наоборот, полностью перепутанным.
Решением будет, опять же, условное определение того, в каком событии мы находимся, или просто выполнение отдельных событий , и использование addClass () и removeClass () соответственно для touchstart и touchend , гарантируя, что оно всегда начинается и заканчивается соответственно добавление и удаление вместо условного принятия решения о нем. В завершение мы также свяжем обратный вызов удаления с типом события focusout , оставаясь ответственным за очистку любого класса при наведении курсора ссылки, который может оставаться включенным и никогда больше не посещаться, например так:
Внимание: некоторые ошибки все еще возникают в двух предыдущих решениях, и, также думаю (не проверено), масштабирование двойным щелчком по-прежнему не работает.
Аккуратное и, надеюсь, свободное от ошибок (не :)) решение Javascript
Теперь для второго, более чистого, аккуратного и отзывчивого подхода, просто используя javascript (без смешения между классом .hover и псевдо: hover), и откуда вы могли бы напрямую вызывать свое поведение ajax в универсальном (мобильном и настольном) событии click. , Я нашел довольно хорошо ответ на вопрос, из которого я наконец понял, как я могу смешивать события касания и мыши вместе, без того, чтобы несколько обратных вызовов событий неизбежно меняли друг друга в цепочке событий. Вот как:
источник
Эффект мыши
hover
не может быть реализован на сенсорном устройстве. Когда у меня возникла такая же ситуация,safari
ios
я использовал:active
CSS для достижения эффекта.то есть.
В моем случае это работает. Может быть, это также тот случай, который можно использовать без использования javascript. Просто попробуйте.
источник
Добавьте этот код, а затем установите класс «tapHover» для элементов, с которыми вы хотели бы работать таким образом. При первом нажатии на элемент он получит псевдокласс «: hover» и класс «tappped». Событие щелчка будет предотвращено. Во второй раз вы нажмете тот же элемент - событие щелчка будет запущено.
источник
Я уверен, что без JS для конкретного устройства (или, скорее, браузера) вам не повезло.
Изменить: думал, что вы хотите избежать этого, пока я не перечитаю ваш вопрос. В случае Mobile Safari вы можете зарегистрироваться, чтобы получать все события касания, аналогично тому, что вы можете делать с помощью собственных UIView-ов. Не могу найти документацию прямо сейчас, но постараюсь.
источник
Один из способов сделать это - создать эффект наведения при начале касания, а затем удалить эффект наведения при перемещении или завершении касания.
Это то, что Apple должна сказать о работе с сенсорным экраном в целом, когда вы упомянули iPhone.
источник
Лично я предпочитаю относить
:hover
стили к:focus
состоянию, например:Затем со следующим HTML:
И следующий JavaScript:
источник
Решено 2019 - Hover on Touch
Теперь кажется, что лучше вообще избегать использования наведения на iOS или сенсорного ввода в целом. Приведенный ниже код применяет ваш CSS до тех пор, пока поддерживается сенсорный ввод, и без других всплывающих окон ios. Сделай это;
JQuery добавляет: $ ("p"). On ("touchstart", function (e) {$ (this) .focus (); e.preventDefault ();});
CSS: замените p: hover на p: focus и добавьте p: active
Параметры;
заменить селектор jquery p любым классом и т. д.
чтобы эффект остался, также удерживайте p: hover и добавьте body {cursor: ponter;} так, чтобы касание в любом месте заканчивало его
попробуйте события щелчка и наведения мыши, а также сенсорный запуск в том же коде (но не проверено)
удалить e.preventDefault (); чтобы пользователи могли использовать всплывающие окна iOS, например, копировать
Ноты
проверено только для текстовых элементов, iOS может обрабатывать вводы и т. д. по-разному
Проверено только на iphone XR ios 12.1.12 и ipad 3 ios 9.3.5 с использованием Safari или Chrome.
источник
Смесь собственного Javascript и jQuery:
источник
Самое простое решение, которое я нашел: у меня было несколько тегов <span> с правилами: hover css. Я переключился на <a href = "javascript: void (0)"> и вуаля. Начали работать стили наведения в iOS.
источник
Можно также использовать CSS, добавить фокус и актив (для IE7 и ниже) к скрытой ссылке. Пример меню ul внутри div с меню класса:
Это поздно и непроверено, должно работать ;-)
источник