CSS

【Sass】hoverはメディアクエリのwidthではなくhoverで分岐させると楽ちん

最初に結論

最初に結論を言ってしまうと、私はしばらく以下のやり方でやっていこうと思いました。

mixinを定義

@mixin hover {
    @media (hover: hover) and (pointer: fine) {
        &:hover {
            @content;
        }
    }
    @media (hover: none) {
        &:active {
            @content;
        }
    }
}

mixinを使う時

.sample {
  background-color: red;
  @include hover {
    background-color: blue;
  }
}

これで、パソコンなどのカーソルがあるデバイスではhover、
スマホやダブレットなどのタッチデバイスではactiveが適用され、
コンパイル後は以下のように出力されます。

.sample {
  background-color: red;
}

@media (hover: hover) and (pointer: fine) {
    &:hover {
        background-color: blue;
    }
}

@media (hover: none) {
    &:active {
        background-color: blue;
    }
}

コードの説明

(hover: hover)

ユーザーがhoverに対応しているデバイスの場合の設定ができます。

(hover: none)

hoverとは逆に、ユーザーがhoverに対応していないデバイスの時の設定ができます。

(pointer: fine)

ユーザーが(マウスなどの)ポインティングデバイスを持っている場合の設定ができます。

@media (hover: hover) and (pointer: fine)

とすることで、
「ユーザーがhoverに対応している かつ ポインティングデバイスを持っている場合」
のCSSを設定することができます。

最近のサイトでは

https://webdesignclip.com/

などで最新のサイトを見てみると、タッチデバイスやタッチデバイスに相応するブレイクポイントではhoverもactiveも設定していないサイトがほとんどなので、以下のような設定だけでOKかもしれません。

@media (hover: hover) and (pointer: fine) {
    &:hover {
        background-color: blue;
    }
}

注意点

メディアクエリでのhoverやpointerはInternet Explorerでは使用できないため、サイトをInternet Explorerにも対応させる場合は、以下のようにしましょう。

@mixin hover {
    @media (hover: hover) and (pointer: fine) {
        &:hover {
            @content;
        }
    }
    @media (hover: none) {
        &:active {
            @content;
        }
    }

    // Internet Explorer用の設定
    @media all and (-ms-high-contrast: none) {
        &:hover {
            @content;
        }
    }
}

おすすめ書籍

1冊ですべて身につくWordPress入門講座 [ Mana ]

価格:2,200円
(2022/10/12 21:45時点)
感想(2件)

動くWebデザインアイディア帳 [ 久保田涼子 ]

価格:3,080円
(2022/10/12 21:45時点)
感想(8件)

動くWebデザインアイディア帳 実践編 [ 久保田 涼子 ]

価格:2,860円
(2022/10/12 21:46時点)
感想(3件)