Який найбезпечніший спосіб зробити медіа-запити, щоб щось сталося, коли не на пристрої з сенсорним екраном? Якщо немає можливості, чи пропонуєте ви використовувати таке рішення JavaScript, як !window.Touch
Modernizr?
Який найбезпечніший спосіб зробити медіа-запити, щоб щось сталося, коли не на пристрої з сенсорним екраном? Якщо немає можливості, чи пропонуєте ви використовувати таке рішення JavaScript, як !window.Touch
Modernizr?
Відповіді:
Я б запропонував використовувати modernizr та використовувати його функції медіа-запитів.
if (Modernizr.touch){
// bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
// bind to normal click, mousemove, etc
}
Однак, використовуючи CSS, існують такі псевдокласи, як, наприклад, у Firefox. Ви можете використовувати : -moz-system-metric (сенсорний ввімкнено) . Але ці функції доступні не для кожного браузера.
Для пристроїв Apple можна просто користуватися:
if(window.TouchEvent) {
//.....
}
Спеціально для Ipad:
if(window.Touch) {
//....
}
Але це не працює на Android .
Modernizr надає можливості виявлення функцій, а виявлення функцій - це хороший спосіб кодування, а не кодування на основі браузерів.
Модернізатор додає класи до тегу HTML саме для цієї мети. В цьому випадку, touch
і no-touch
тому ви можете стилізувати ваші дотики аспектів , пов'язаних випереджаючи ваші селектори з .touch. напр .touch .your-container
. Кредити: Бен Свінберн
modernizr
буде ідеально :)
Modernizr.touch
Тест показує тільки якщо підтримує браузер помацати події, які не обов'язково відображають сенсорний екран пристрою. Наприклад, телефони Palm Pre / WebOS (touch) не підтримують сенсорні події і тому проходять цей тест.
touch
і no-touch
тому ви можете стилізувати ваш сенсорні аспекти , пов'язані з випереджаючи ваші селектори з .touch
. Напр..touch .your-container
Насправді це властивість для цього в чернетку запитів медіа-запитів CSS4 .
Функція медіа-вказівника використовується для запиту про наявність та точність вказівного пристрою, такого як миша. Якщо пристрій має кілька механізмів введення, рекомендується UA повідомляти про характеристики найменш здатного вказівного пристрою первинних механізмів введення. Цей медіа-запит приймає такі значення:
'none'
- механізм введення пристрою не включає вказівний пристрій.'груба'
- Механізм введення пристрою включає вказівний пристрій обмеженої точності.'штраф'
- механізм введення пристрою включає в себе точний вказівний пристрій.
Це буде використано як таке:
/* Make radio buttons and check boxes larger if we have an inaccurate pointing device */
@media (pointer:coarse) {
input[type="checkbox"], input[type="radio"] {
min-width:30px;
min-height:40px;
background:transparent;
}
}
Я також знайшов квиток у проекті Chromium, пов’язаний із цим.
Сумісність веб-переглядача можна перевірити на Quirksmode . Це мої результати (22 січня 2013 р.):
Здається, рішення CSS не є широко доступними з середини 2013 року. Натомість ...
Ніколас Закас пояснює, що Modernizr застосовує no-touch
клас CSS, коли браузер не підтримує дотик.
Або виявляйте в JavaScript за допомогою простого фрагмента коду, що дозволяє реалізувати власне рішення, схоже на Modernizr:
<script>
document.documentElement.className +=
(("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
</script>
Тоді ви можете написати свій CSS так:
.no-touch .myClass {
...
}
.touch .myClass {
...
}
Типи медіа не дозволяють виявляти сенсорні можливості як частину стандарту:
http://www.w3.org/TR/css3-mediaqueries/
Отже, немає можливості це робити послідовно за допомогою CSS або медіа-запитів, доведеться вдаватися до JavaScript.
Не потрібно використовувати Modernizr, ви можете просто використовувати звичайний JavaScript:
<script type="text/javascript">
var is_touch_device = 'ontouchstart' in document.documentElement;
if(is_touch_device) alert("touch is enabled!");
</script>
window.touch
&& window.TouchEvent
працюють лише для яблучних пристроїв.
У 2017 році запит на медіа CSS з другої відповіді все ще не працює на Firefox. Я знайшов для цього солютон : -moz-touch-enable
Отже, ось медіа-запит між браузерами:
@media (-moz-touch-enabled: 1), (pointer:coarse) {
.something {
its: working;
}
}
-moz-touch-enabled
не буде потрібно незабаром
-moz-touch-enabled
нібито не підтримується у Firefox 58+. Як і в даному рішенні, це рішення не охоплює Firefox 58-63 (оскільки Firefox 64+ підтримує запит вказівника). Джерело: developer.mozilla.org/en-US/docs/Web/CSS/@media/…
Насправді існує медіа-запит щодо цього:
@media (hover: none) { … }
Крім Firefox, він досить добре підтримується . Сафарі та Chrome, що є найпоширенішими браузерами на мобільних пристроях, може бути достатньою для швидшого використання.
Це рішення працюватиме до тих пір, поки CSS4 не отримає глобальну підтримку всіх браузерів. Коли настає цей день, просто використовуйте CSS4. але до цього часу це працює для поточних браузерів.
browser-util.js
export const isMobile = {
android: () => navigator.userAgent.match(/Android/i),
blackberry: () => navigator.userAgent.match(/BlackBerry/i),
ios: () => navigator.userAgent.match(/iPhone|iPad|iPod/i),
opera: () => navigator.userAgent.match(/Opera Mini/i),
windows: () => navigator.userAgent.match(/IEMobile/i),
any: () => (isMobile.android() || isMobile.blackberry() ||
isMobile.ios() || isMobile.opera() || isMobile.windows())
};
onload:
старий спосіб:
isMobile.any() ? document.getElementsByTagName("body")[0].className += 'is-touch' : null;
новіший спосіб:
isMobile.any() ? document.body.classList.add('is-touch') : null;
Вищевказаний код додасть клас "is-touch" до тега body, якщо пристрій має сенсорний екран. Тепер будь-яке місце у вашій веб-програмі, де ви мали б css для: наведіть курсор, ви можете зателефонуватиbody:not(.is-touch) the_rest_of_my_css:hover
наприклад:
button:hover
стає:
body:not(.is-touch) button:hover
Це рішення дозволяє уникнути використання модернізатора, оскільки модернізатор lib - це дуже велика бібліотека. Якщо ви лише намагаєтесь виявити сенсорні екрани, це буде найкраще, коли розмір остаточного скомпільованого джерела є вимогою.
Мені вдалося вирішити цю проблему, скориставшись цим
@media (hover:none), (hover:on-demand) {
Your class or ID{
attributes
}
}
on-demand
був вилучений з специфікації і з браузерів: github.com/w3c/csswg-drafts/commit / ...