: торкнутися псевдокласу CSS чи чогось подібного?


85

Я намагаюся зробити кнопку такою, що коли користувач натискає на неї, вона змінює свій стиль, поки утримується кнопка миші. Я також хочу, щоб він змінив свій стиль подібним чином, якщо його торкнутися в мобільному браузері. Мені здавалося очевидним було використання CSS: активний псевдо-клас, але це не спрацювало. Я спробував: зосередитись, і це теж не спрацювало. Я спробував: навести, і це, здавалося, спрацювало, але він зберіг стиль після того, як я зняв палець з кнопки. Всі ці спостереження були на iPhone 4 та Droid 2.

Чи є спосіб відтворити ефект на мобільних браузерах (iPhone, iPad, Android і, сподіваюся, інші)? На даний момент я роблю щось подібне:

<style type="text/css">
    #testButton {
        background: #dddddd;
    }
    #testButton:active, #testButton.active {
        background: #aaaaaa;
    }
</style>

...

<button type="button" id="testButton">test</button>

...

<script type='text/javascript' src='http://code.jquery.com/jquery-1.6.1.min.js'></script>
<script type='text/javascript'>
    $("*").live("touchstart", function() {
      $(this).addClass("active");
    }).live("touchend", function() {
      $(this).removeClass("active");
    });
</script>

Активний псевдо-клас призначений для настільних браузерів, а активний клас - для сенсорних браузерів.

Мені цікаво, чи існує простіший спосіб зробити це, не залучаючи Javascript.


2
Майже кожен сенсорний браузер обробляє такі речі, як hoverі mousedown/ по- mouseupрізному, важко вмістити їх усі.
Чад,

В Android та iOS є: touchstart,: touchmove,: touchend та: touchcancel псевдоокуляри, якими ви можете користуватися.
Пол Хенбері

2
Я спробував встановити стилі для псевдокласів: touchstart і: touchend, і вони не працювали на iPhone або Droid. @ Пол Хенбері, ти впевнений, що не плутаєш псевдокласи CSS з подіями Javascript?
Еліас Замарія,

1
@ mikez302 - Думаю, ти маєш право. plugins.jquery.com/plugin-tags/touchstart
Дуг Чемберлен

2
Я би почував себе безглуздо, подаючи це як відповідь, але насправді відповідь: "Ні, це неможливо, ви повинні використовувати Javascript". Те, про що ви просите, не є частиною CSS2 або CSS3. Я думаю, що факт: актив не працює - це проблема агента користувача, про яку ви могли б повідомити як про помилку в браузерах iOS та Android, але просто для вирішення вашої проблеми з кінцевим користувачем ... так, ви повинні використовувати JS . Ви можете обернути код сумісності в чек на підтримку ontouchstart .
joelhardi

Відповіді:


49

Немає такого поняття, як :touchу специфікаціях W3C, http://www.w3.org/TR/CSS2/selector.html#pseudo-class-selectors

:active повинен працювати, я б подумав.

Порядок у :active/ :hoverпсевдокласі важливий для його правильної роботи.

Ось цитата з цього посилання вище

Інтерактивні агенти користувачів іноді змінюють візуалізацію у відповідь на дії користувача. CSS забезпечує три псевдокласи для загальних випадків:

  • Псевдо-клас: hover застосовується, поки користувач позначає елемент (за допомогою якогось вказівного пристрою), але не активує його. Наприклад, візуальний користувальницький агент може застосувати цей псевдо-клас, коли курсор (вказівник миші) наводить курсор на поле, сформоване елементом. Агенти користувачів, які не підтримують інтерактивні медіа, не повинні підтримувати цей псевдо-клас. Деякі відповідні користувацькі агенти, що підтримують інтерактивні носії, можуть не підтримувати цей псевдо-клас (наприклад, ручка).
  • Псевдо-клас: активний застосовується, коли елемент активується користувачем. Наприклад, між тим, як користувач натискає кнопку миші та відпускає її.
  • Псевдо-клас: focus застосовується, поки елемент має фокус (приймає події клавіатури або інші форми введення тексту).

9
Я знав, що не існує такого поняття, як: дотик. Мені було цікаво, чи є щось подібне. : active видався розумним, але в моїх тестах це не спрацювало.
Еліас Замарія,

@ mikez302 - Я зрозумів, ти знав, що я хочу цитувати своє джерело. Я згоден з Вами. Я не бачу жодної причини, щоб це не спрацювало, крім моєї думки щодо замовлення як дуже важливого. Я бачив, що хтось публікував щось про псевдоселектори css для IOS та Android, але я не міг говорити з цими технологіями.
Дуг Чемберлен,

Я змінив правила: active і: hover у моєму прикладі, і, здається, це нічого не робило.
Еліас Замарія,

36
@ mikez302: використовуйте :activeпсевдоклас. Він повинен працювати, але в деяких браузерах вам потрібен невеликий хак , щоб змусити його працювати: приєднати обробник події до touchstartподії на тілі (наприклад: <body ontouchstart="">)
gion_13

5
Щоб лише торкнутися коментаря @ mikez302 в останній відповіді, це чудове виправлення в мобільному шаблоні HTML5, яке посилається на цю статтю - alxgbsn.co.uk/2011/10/17/…
Джайлз Батлер

19

Оскільки мобільний пристрій не дає зворотного зв’язку при наведенні, я хочу, як користувач, бачити миттєвий зворотний зв’язок при натисканні на посилання. Я помітив, що -webkit-tap-highlight-colorна нього реагують найшвидше (суб’єктивно).

Додайте до свого тіла наступне, і ваші посилання матимуть ефект натискання.

body {
    -webkit-tap-highlight-color: #ccc;
}

Це здається найнадійнішим, але виглядає не найкращим чином. Колір фону, здається, трохи виходить за межі елемента, роблячи його вищим на мить.
Адам

@ Адам так, я не міг обійти це, як я пам'ятаю, але це лише на частку секунди не було для мене занадто великою угодою, особливо, що це дозволило користувачеві отримати зворотний зв'язок, що він натиснув (що є що для них важливо протягом цієї частки часу)
Абдо

Я насправді отримав: активний псевдостиль, що працював у підсумку, просто прив’язавши функцію до події document.ontouchstart (через jQuery), з порожнім зворотним викликом.
Адам

Непогана ідея :-) Для цього я взагалі уникав JavaScript.
Абдо

2
Просто обмін, який -webkit-tap-highlight-colorє нестандартною функцією CSS , я використовую :activeзамість цього, він справді підходить і має сенс.
Рікардо Форнес

0

У мене були проблеми із стилем оформлення мобільних сенсорних кнопок. Це вирішить ваші проблеми з кнопкою наведення курсора / активної кнопки.

body, html {
  width: 600px;
}
p {
  font-size: 20px;
}

button {
  border: none;
  width: 200px;
  height: 60px;
  border-radius: 30px;
  background: #00aeff;
  font-size: 20px;
}

button:active {
  background: black;
  color: white;
}

.delayed {
  transition: all 0.2s;
  transition-delay: 300ms;
}

.delayed:active {
  transition: none;
}
<h1>Sticky styles for better touch screen buttons!</h1>

<button>Normal button</button>

<button class="delayed"><a href="https://www.google.com"/>Delayed style</a></button>

<p>The CSS :active psuedo style is displayed between the time when a user touches down (when finger contacts screen) on a element to the time when the touch up (when finger leaves the screen) occures.   With a typical touch-screen tap interaction, the time of which the :active psuedo style is displayed can be very small resulting in the :active state not showing or being missed by the user entirely.  This can cause issues with users not undertanding if their button presses have actually reigstered or not.</p>

<p>Having the the :active styling stick around for a few hundred more milliseconds after touch up would would improve user understanding when they have interacted with a button.</p>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.