デバイスがタッチスクリーンかどうかを検出するメディアクエリ


122

メディアクエリを使用して、タッチスクリーンデバイス上にないときに何かを実行する最も安全な方法は何ですか?方法がない場合、!window.TouchまたはModernizr などのJavaScriptソリューションを使用することをお勧めしますか?


2
2018年に早送りされ、CSSはネイティブでこのstackoverflow.com/a/50285058/1717735
Buzut

回答:


37

modernizrとそのメディアクエリ機能を使用することをお勧めします。

if (Modernizr.touch){
   // bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
   // bind to normal click, mousemove, etc
}

ただし、CSSを使用すると、たとえばFirefoxのような疑似クラスがあります。あなたは使用することができます:-moz-システム・メトリック(タッチ対応します)。ただし、これらの機能はすべてのブラウザで利用できるわけではありません。

以下のためのAppleデバイスは、簡単な使用をすることができます:

if(window.TouchEvent) {
   //.....
}

特にiPadの場合:

if(window.Touch) {
    //....
}

ただし、これらはAndroidでは機能しません

Modernizrは機能検出機能を提供します。機能の検出は、ブラウザーに基づいてコーディングするのではなく、コーディングするための優れた方法です。

タッチ要素のスタイル

Modernizerは、まさにこの目的のためにHTMLタグにクラスを追加します。この場合、touchそしてno-touchあなたが.touchとあなたのセレクタを付けることによって、あなたのタッチ関連の側面のスタイルを設定することができますので。例えば.touch .your-containerクレジット:Ben Swinburne


最近のすべてのデバイス/ブラウザで動作するpsedoクラスはないと思いますか?
JJジョリージム2012

@ JJ56、はい、すべてのブラウザがタッチ疑似クラスをサポートしているわけではありません。しかし、それがmodernizr完璧になる場所です:)
Starx

18
このModernizr.touchテストは、ブラウザーがタッチイベントをサポートしているかどうかを示すだけで、必ずしもタッチスクリーンデバイスを反映しているわけではありません。たとえば、Palm Pre / WebOS(タッチ)電話はタッチイベントをサポートしていないため、このテストは失敗します。
numediaweb 2013

5
とにかくモダナイザーを含める場合は、これに追加します。Modernizerは、まさにこの目的のためにbodyタグにクラスを追加します。この場合、touchそしてno-touchあなたとあなたのセレクタを付けることによって、あなたのタッチ関連の側面のスタイルを設定することができますので.touch。例えば.touch .your-container
ベンスウィンバーン

2
私にとって、modernizrはbodyタグではなくhtmlタグにtouchクラスを追加しているようです。
Robin Cox

162

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でテストできます。これらは私の結果です(2013年1月22日):

  • Chrome / Win:機能
  • Chrome / iOS:機能しません
  • Safari / iOS6:機能しません

3
提供されたソリューションがポスターに従っても機能しない場合、これはどのようにして最も多くのポイントを持つ答えになりますか?
erdomester

5
これに対するブラウザのサポートはそれほど悪くありません:Edge、Chrome、Safari、iOS、Android。参照:caniuse.com/#feat=css-media-interaction
Josa


私のために働く;)これを研究してくれてありがとう!
Verri

51

2013年半ばの時点で、CSSソリューションは広く利用可能ではないようです。代わりに...

  1. Nicholas Zakasはno-touch、ブラウザがタッチをサポートしていない場合、ModernizrがCSSクラスを適用すると説明しています。

  2. または、JavaScriptで簡単なコードを検出して、独自のModernizrのようなソリューションを実装できます。

    <script>
        document.documentElement.className += 
        (("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
    </script>

    次に、CSSを次のように記述します。

    .no-touch .myClass {
        ...
    }
    .touch .myClass {
        ...
    }

二つ目はとてもいいです。私にとって魅力的な作品です!ありがとう。
Garavani、2014

@ bjb568より近代的な代替案である提案された編集に感謝しますが、IE 10以降でのみ機能するため、当面はこのバージョンを維持することをお勧めします。
Simon East

そのクラスのような音はhtmlタグにあります。これは、CSPを使用する場合、デフォルトで無効になることを意味します。
レオ、

35

メディアタイプでは、標準の一部としてタッチ機能を検出できません。

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>

AFAIK、window.touch&& window.TouchEventはApple デバイスでのみ機能します。
Starx

22
@vsync Modernizrは、すべてのテストを開発者にとって便利なライブラリに配置する優れた方法です。開発者は、タッチイベントやこのページを見つける必要があるなど、特定の機能をテストする必要があるたびにGoogleにアクセスする必要がないためです。参考までに、必要なテストでカスタマイズできるカスタムのModernizrビルドがあります。これは、JS構文(Modernizr.touch)またはCSSクラス(.touch .my-element {})を使用して、プロジェクト間で常に同じ方法で機能をテストする優れた方法です。毎回車輪を再発明することなく、私たちが物事を行うことができることを認識しない人間の知性への侮辱だと思います。
アレハンドロガルシアイグレシアス2013

11
ええと、私は何百ものプロジェクトに取り組んできましたが、そのようなことはまったく必要ありませんでした。ほとんどの場合、必要なのは非常に小さなテストのセットであり、5つを超えることはありません(ほとんどの場合)。これら5つを直接コードに挿入します。実際にModernizer Webサイトにアクセスしたり、カスタムビルドを作成したり、ページに組み込んだりする必要はありません。開発者はそんなに怠惰であってはなりません。Web開発者は、常に「コードを軽量化する方法を教えてください」という考え方を持ち、IMHOと長年の経験を持っている必要があります。最近の開発者は、大量のスクリプトを含めることが好きなようです:/
vsync

2
怠惰と言う人もいます。なぜ車輪を再発明するのか?新しいデバイス/バージョン/プラットフォームが表示され、特別なケースを変更する必要がある場合はどうですか?あなたはa)特別なケース検出コードを自分で作成し、カスタムコードにバックポートして、その過程でそれを再確認しますか、それともb)Modernizrのより新しいバージョンをダウンロードしてドロップしますか?私はどちらをするか知っています。GarciaWebDevへの+1。
Sc0ttyD 2013

@ Sc0ttyD私の個人的な好みは、Modernizrなどのライブラリに依存せずに、最初にコーディングすることを学ぶことです。いつの日か、その人が新しいデバイスをコーディングする必要があり、ライブラリなしではそれを行うことができないために行き詰まってほしくありません。言うまでもなく、新しいライブラリを学ぶ時間がない仕事をしている人はおそらくたくさんいるでしょう。
Alex W

28

2017年、2番目の回答からのCSSメディアクエリはFirefoxではまだ機能しません。そのためのソリューションを見つけました:-moz-touch-enabled


だから、ここにクロスブラウザのメディアクエリがあります:

@media (-moz-touch-enabled: 1), (pointer:coarse) {
    .something {
        its: working;
    }
}

これはより高く、承認された答えでなければなりません。firefoxは仕様の実装に取り​​組んでいるため、-moz-touch-enabledすぐには必要ありません
Dogoku


@ user3445853 OPは、タッチスクリーンを備えたデバイスを(メディアクエリを介して)検出する方法を尋ねます。ルール "(pointer:none)"がtrueの場合、デバイスには確かにタッチスクリーンがありません。しかし、誰かが:)(ないか)私の意見を確認するべきではありません
Sokołow

-moz-touch-enabledFirefox 58以降ではおそらくサポートされていません。同様に、このソリューションはFirefox 58-63をカバーしていません(Firefox 64+はポインタークエリをサポートしているため)。出典:developer.mozilla.org/en-US/docs/Web/CSS/@media/…–
fgblomqvist

24

実際にはそのためのメディアクエリがあります:

@media (hover: none) {  }

Firefoxは別として、かなりサポートされています。SafariとChromeはモバイルデバイスで最も一般的なブラウザであるため、採用がさらに進むまでは十分かもしれません。


2
... FFについても、次の週にサポートが提供される予定です。
retrovertigo

5

これは機能します。知らない場合

@media (hover: none) and (pointer: coarse) {
    /* Touch screen device style goes here */
}

編集:ホバーオンデマンドはサポートされなくなりました


3

このソリューションは、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タグに追加します。これで、:hoverのcssがあるWebアプリケーションの任意の場所で、呼び出すことができますbody:not(.is-touch) the_rest_of_my_css:hover

例えば:

button:hover

になる:

body:not(.is-touch) button:hover

このソリューションでは、modernizer libが非常に大きなライブラリであるため、modernizerの使用を避けています。タッチスクリーンを検出するだけの場合は、最終的なコンパイル済みソースのサイズが要件である場合に最適です。


0

JSまたはjQueryを使用してボディにクラスタッチスクリーンを追加する

  //allowing mobile only css
    var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));
    if(isMobile){
        jQuery("body").attr("class",'touchscreen');
    }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.