Подтвердить что ты не робот

Мобильные сафари-ссылки сохраняют фокус после прикосновения

Моя навигация довольно проста. У меня есть состояние зависания, которое добавляет границу и прозрачный градиент png-фон к некоторому тексту, и дополнительный класс, который при добавлении jQuery добавляет цвет за это прозрачное изображение.

Если вы нажмете, чтобы переключить класс в веб-браузере, вы увидите, что цвет входит и выходит, но фоновое изображение остается, если вы никогда не отводите мышь от кнопки. Это ожидаемое поведение.

Моя проблема заключается в том, что при использовании iPad touch, похоже, сохраняет состояние зависания, и свойства: hover никогда не исчезают, если вы не нажмете еще одну кнопку, и в этом случае к этой кнопке добавятся свойства persive: hover, пока другая нажат.

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

Помощь?

enter image description here

Обычный - Hover - активный (через addClass())

4b9b3361

Ответ 1

Hover - это псевдо-класс CSS, предназначенный для работы с указателем не столько с событиями касания. Вы обычно хотели бы избежать использования наведения вообще, поскольку на мобильном телефоне нет никакого смысла. Один из самых простых способов справиться с этим - поместить ваш hover CSS внутри медиа-запроса. Вы можете сделать это, ориентируясь на планшеты или настольные экраны, вот два решения:

1- Ориентация iPads:

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) {
    RE.no-touch .my-element:hover {
         /* in here you cancel all hover styles you applied for desktop */ 
    }
}

2- Настольные компьютеры для таргетинга:

@media only screen 
and (min-width : 1224px) {
    RE.no-touch .my-element:hover {
         /* in here you apply hover styles that will only work on desktop */ 
    }
}

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

Ответ 2

Если вы используете Modernizr, класс no-touch будет добавлен в корневой элемент html для устройств без касания. Затем вы можете сделать это:

a.myclass {
   color:#999;
}

.no-touch a.myclass:hover,
a.myclass:active {
   color:#ccc;
}

Ответ 3

Вот как я исправил его для своего списка с помощью наведения:

CSS

ul {background-color:#f3f3f3;}
li:hover {background-color: #e7e7e7}

JQuery

$(document).ready(function () {
    $('li').on('touchstart', function () { $(this).css('background-color', ''); });
    $('li').on('touchend', function () { $(this).css('background-color', 'inherit'); });
});

И исправление для наведения на задний ход навигации...

<body onunload="$('a').blur();">

или

$(window).unload( function () { $('a').blur(); } );

Для непосвященных событие разгрузки происходит непосредственно перед тем, как браузер покинет страницу. Размывая все ссылки на странице при разгрузке, я смог отменить наведение. Возврат к исходной странице с помощью кнопки "Назад" показывает ссылку на клик в состоянии по умолчанию.

К сожалению, событие onclick, похоже, не вызывает выгрузку, но обновление происходит в iOS 5?!

Stuck On: hover - http://www.aaronpinero.com/articulated/2011/05/28/stuck-on-hover/ Использовать jQuery для замены - http://www.nerdboy.co.uk/2009/01/use-jquery-to-replace-body-onunload/

Ответ 4

Я столкнулся с этой проблемой. Моя проблема была на iPad, если я постучал якорем и немного прокрутился, событие щелчка не срабатывало, но элемент сохранил бы состояние CSS наведения. Я убежден, что iPad действительно сохранил состояние фокусировки и применяет стили CSS: hover, чтобы имитировать работу на рабочем столе.

Не-JS и практическое обходное решение - не доставлять стили наведения для прикосновения к устройствам, если они не нужны. Сенсорные устройства не имеют "реального" состояния зависания, однако, похоже, он отображается, когда элемент сфокусирован или прослушивается и прокручивается.

Итак, с Modernizr.js загружен, я переместил стили hover в область .no-touch -

то есть.

/* Only deliver hover styles to non-touch devices */
.no-touch .my-element:hover {
  /* hover styles */
}

Затем, когда элемент щелкнут, я переключу на него активный класс.

.my-element.active {
  /* active styles */
}

Единственным отрицательным выводом является то, что вы не получаете "состояние прослушивания". Я еще не исследовал решение для этого, поскольку это не очень важно для моих приложений.

Ответ 5

вам нужно поймать следующие события

touchstart - когда ваш палец касается экрана

touchhend - когда ваш палец покидает экран

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

$('element').on('touchstart', function(){
    // apply hover styles, or better yet addClass() of hover styles
});

$('element').on('touchend', function(){
    // removeClass or remove styles, in here you set it to default so even if it is focused, it makes no difference
});

Дайте некоторый пример кода, сенсорный старт и конец должны решить проблему.

Ответ 6

Если вы используете SCSS, я рекомендую вам сделать следующее:

// primary-buttons
.primary-button, .primary-button:visited,
.primary-button:focus {
    background: red;
    color: white;
}

.primary-button:hover {
    background: green; // Only for big screens
    @media(max-width: 768px) {
        background: red;
    }
}

Если вы сбросите значение фона до начального значения, у вас больше не будет проблем с нажатием кнопки на устройствах с разрешением <= 768 пикселей

Ответ 7

Это обходное решение:

var btn = jQuery(".nav-menu ul li:first");
var btn_new = btn.clone(true);
btn.remove();
jQuery(".nav-menu ul").append(btn_new);