hover / any-hover メディアクエリの違いと使い方
目次
概要
CSSの hover / any-hover メディアクエリについて仕様や違い、ブラウザ対応状況などをざっくりまとめてみた。
hover / any-hover メディアクエリとは
hover と any-hover は、ユーザーの入力デバイスが「ホバー操作(マウスオーバー)」に対応しているかどうかを判定できるCSSのメディアクエリ。
hover: 主な入力デバイス(primary pointer)がホバー対応かどうかany-hover: どれか一つでもホバー対応デバイスがあればOK
最近のPCやタブレットはタッチとマウスが両方使えたりするので、こういう判定ができるようになったらしい。
仕様の変遷と追加の背景
昔のメディアクエリ(Level 3)だと、画面幅や向きは判定できても「入力デバイスの種類」までは分からなかった。
Level 4で hover / any-hover(と pointer / any-pointer も)が追加されて「主なデバイス」だけではなく「全部のデバイス」の特性も見られるようになった。
Surfaceみたいな2-in-1のノートPCや、Bluetoothマウスをつないだタブレットみたいな複数入力の環境でも、スタイルを分けられるようになったという話らしい。
仕様の違いと判定の仕組み
| メディア特性 | 判定対象 | 例(タッチ+マウス) |
|---|---|---|
hover: hover | 主入力デバイスのみ | 主がタッチなら false |
any-hover: hover | どれか一つでもOK | マウスあれば true |
hoverは「主なデバイス」だけ見るので、主がタッチだと false になることもany-hoverは「どれか一つでも」ホバー対応なら true
例
@media (hover: hover) {
.button:hover {
background-color: tomato;
}
}
@media (any-hover: hover) {
.button:hover {
background-color: tomato;
}
}
サポート状況
主要なモダンブラウザ(Chrome, Edge, Firefox, Safari, iOS, Android)で利用可能。
2018年以降にだいたい実装されていて、今は困ることはほぼないはず。
参照: Can I use…
実装例と使い分けのポイント
- PCだけでホバースタイルを出したい場合:
@media (hover: hover) - マウスやペンなど、どれか一つでもホバー対応なら出したい場合:
@media (any-hover: hover)
@media (any-hover: hover) {
.button:hover {
background-color: tomato;
}
}
タッチデバイスで hover スタイルを消したい場合は any-hover: none で上書きもできる。
@media (any-hover: none) {
.button:hover {
background-color: none;
}
}
分かったこと・雑感
hover/any-hoverは「今使ってるデバイス」ではなく「接続されてるデバイスの能力」を見ている- タッチ+マウス両対応の端末で、マウスがつながってれば
any-hover: hoverになる - ただ、スマホやタブレットでマウスを使う人は少ないと思うので、実際のところ
hoverとany-hoverの違いが効いてくる場面はそこまで多くない気がしている