Перейти к содержимому

Как отключить hover на мобильной версии

  • автор:

How to disable hover effects for mobile devices using CSS

Let's assume that we are working with the following button:

If we want this element to change the background on hover:

On mobile devices, the hover effect doesn't make sense and it can cause issues if a user clicks on the button. So, we want to allow to hover only in allowed devices. We can use @media (hover:hover) to achieve it.

Let's redefine the CSS:

Hi, I'm Erik, an engineer from Barcelona. If you like the post or have any comments, say hi.

How to disable CSS hover styles on phones

CSS styles for hovering (like a:hover ) can be janky and annoying on touch screen devices that don’t support hovering.

You can easily fix this by wrapping your hover styles with a CSS media query that detects whether the current device has a cursor that can hover.

Now, the styles inside that @media block will only be applied if the device supports hover.

The opposite of this is also possible — applying styles only to devices that do not support hovering.

Subscribe to my newsletter!

A weekly round-up of new blog posts and updates to projects I’m working on.

Несколько полезных CSS-трюков

Во время работы над последним проектом накопилось несколько интересных CSS-трюков, о которых хочу рассказать. Хотя, возможно, это уже придумано до нас и все об этом уже знают. В примерах используется LESS, а не чистый CSS.

Событие автоподстановки в инпут поля

Проблема: узнать, что пользователь воспользовался функцией автоподстановки. Задача была в том, чтобы подсвечивать кнопку Login, если в полях e-mail и password введено что-либо. Проблема в том, что если эти поля заполняются автоподстановкой из ключницы браузера, то событие change на инпутах не выстреливает.

Решение: использовать псевдокласс :valid. Он срабатывает у инпута, если в нем есть контент, который удовлетворяет типу инпута (text, e-mail) и если у этого инпута стоит атрибут required. Правда решение не работает в IE, но нам не требуется поддержка этого браузера.

:hover в мобильных устройствах

Проблема: отключить реакцию браузера в мобильном устройстве на псевдокласс :hover в CSS (в случае если у нас один общий файл стилей для мобильной и десктопной версий). Поскольку мобильные браузеры реагируют на этот псевдокласс не всегда так, как нужно разработчику: иногда блокируют обработчик клика по элементу (он срабатывает со второго раза) или оставляют элемент в состоянии ховера (до тех пор, пока не кликнешь по другому элементу).

Решение: поскольку мы используем Modernizr и LESS, у нас из коробки есть классы touch и no-touch. Поэтому при описании ховеров просто пишем использовать ховер только для версий с мышой, а для версий с тачем использовать :active (если надо):

Прячем placeholder при получении фокуса инпутом

Проблема: стандартное поведение браузеров (не всех, но многих) предусматривает скрытие placeholder сразу, как только в поле введен хотя бы один символ. Нам хотелось, чтобы placeholder скрывался сразу при заходе в инпут. И сделать это нужно было без использования JS.

Решение: использовать псевдокласс :placeholder вместе с псевдоклассом :focus чтобы делать цвет текста placeholder невидимым при получении фокуса. Работает опять же не во всех браузерах, но нам все и не нужны были.

Пример поправлен в соответствии с замечаниями от хабраюзера rWeb

Некорректный рендер картинки при background-size:cover в webkit браузерах (и не только).

Проблема: картинка иногда не занимает весь контейнер, и остаются однопиксельные пропуски по краям контейнера.

Первое решение: если допустимо отрезать от картинки немного лишнего сверх того что отрезает cover, тогда используя :after или :before вставляем псевдоэлемент в контейнер, назначаем фоновую картинку ему, а размеры его делаем больше родителя на пару пикселей (http://jsfiddle.net/NVu3d/).

Второе решение: если эта картинка используется в качестве фоновой и занимает всегда все окно, тогда можно динамически вставить media query, которое будет мониторить текущее соотношение сторон окна браузера с соотношением сторон картинки и соответственно проставлять background-size: auto 100% вместо дефолтного background-size: 100% auto; (http://jsfiddle.net/NRDA9/)

Лесенка вокруг элемента при применении к нему трехмерных трансформаций в Firefox

Проблема: при применении 3d трансформаций к панельке, которая сложным образом складывалась в пространстве, в FireFox по контуру элемента рендерилась ужасная «лесенка».

Как отключить hover на мобильной версии

CSS styles for hovering (like a:hover ) can be janky and annoying on touch screen devices that don’t support hovering.

You can easily fix this by wrapping your hover styles with a CSS media query that detects whether the current device has a cursor that can hover.

Now, the styles inside that @media block will only be applied if the device supports hover.

The opposite of this is also possible — applying styles only to devices that do not support hovering.

Subscribe to my newsletter!

A weekly round-up of new blog posts and updates to projects I’m working on.

How to disable hover effects for mobile devices using CSS

Let's assume that we are working with the following button:

If we want this element to change the background on hover:

On mobile devices, the hover effect doesn't make sense and it can cause issues if a user clicks on the button. So, we want to allow to hover only in allowed devices. We can use @media (hover:hover) to achieve it.

Let's redefine the CSS:

Hi, I'm Erik, an engineer from Barcelona. If you like the post or have any comments, say hi.

Несколько полезных CSS-трюков

Во время работы над последним проектом накопилось несколько интересных CSS-трюков, о которых хочу рассказать. Хотя, возможно, это уже придумано до нас и все об этом уже знают. В примерах используется LESS, а не чистый CSS.

Событие автоподстановки в инпут поля

Проблема: узнать, что пользователь воспользовался функцией автоподстановки. Задача была в том, чтобы подсвечивать кнопку Login, если в полях e-mail и password введено что-либо. Проблема в том, что если эти поля заполняются автоподстановкой из ключницы браузера, то событие change на инпутах не выстреливает.

Решение: использовать псевдокласс :valid. Он срабатывает у инпута, если в нем есть контент, который удовлетворяет типу инпута (text, e-mail) и если у этого инпута стоит атрибут required. Правда решение не работает в IE, но нам не требуется поддержка этого браузера.

:hover в мобильных устройствах

Проблема: отключить реакцию браузера в мобильном устройстве на псевдокласс :hover в CSS (в случае если у нас один общий файл стилей для мобильной и десктопной версий). Поскольку мобильные браузеры реагируют на этот псевдокласс не всегда так, как нужно разработчику: иногда блокируют обработчик клика по элементу (он срабатывает со второго раза) или оставляют элемент в состоянии ховера (до тех пор, пока не кликнешь по другому элементу).

Решение: поскольку мы используем Modernizr и LESS, у нас из коробки есть классы touch и no-touch. Поэтому при описании ховеров просто пишем использовать ховер только для версий с мышой, а для версий с тачем использовать :active (если надо):

Прячем placeholder при получении фокуса инпутом

Проблема: стандартное поведение браузеров (не всех, но многих) предусматривает скрытие placeholder сразу, как только в поле введен хотя бы один символ. Нам хотелось, чтобы placeholder скрывался сразу при заходе в инпут. И сделать это нужно было без использования JS.

Решение: использовать псевдокласс :placeholder вместе с псевдоклассом :focus чтобы делать цвет текста placeholder невидимым при получении фокуса. Работает опять же не во всех браузерах, но нам все и не нужны были.

Пример поправлен в соответствии с замечаниями от хабраюзера rWeb

Некорректный рендер картинки при background-size:cover в webkit браузерах (и не только).

Проблема: картинка иногда не занимает весь контейнер, и остаются однопиксельные пропуски по краям контейнера.

Первое решение: если допустимо отрезать от картинки немного лишнего сверх того что отрезает cover, тогда используя :after или :before вставляем псевдоэлемент в контейнер, назначаем фоновую картинку ему, а размеры его делаем больше родителя на пару пикселей (http://jsfiddle.net/NVu3d/).

Второе решение: если эта картинка используется в качестве фоновой и занимает всегда все окно, тогда можно динамически вставить media query, которое будет мониторить текущее соотношение сторон окна браузера с соотношением сторон картинки и соответственно проставлять background-size: auto 100% вместо дефолтного background-size: 100% auto; (http://jsfiddle.net/NRDA9/)

Лесенка вокруг элемента при применении к нему трехмерных трансформаций в Firefox

Проблема: при применении 3d трансформаций к панельке, которая сложным образом складывалась в пространстве, в FireFox по контуру элемента рендерилась ужасная «лесенка».

How to remove :hover on touch devices?

How to remove :hover on touch devices

How to remove :hover on touch devices?

As touch devices like mobiles and tablets do not have mouse cursors like desktops and laptops, they display a hover state whenever you touch the element. They keep on displaying the hover state even when you are not touching the element anymore. Due to this, the overall user experience becomes confusing for the users as your website or web application is not giving the correct feedback.

The best way to display the touch state on mobile devices is to use “:active” pseudo-selector on an element.

To avoid hover styles to display on touch devices you can use one of the following strategies:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *