js スマホでタップ(click)後にCSSを変えたい(@media (hover: hover) {})

PCだと問題ないけどスマホだと不思議な挙動になる

作成日:2022-11-28, 更新日:2022-11-28

js スマホでタップ(click)後にCSSを変えたい(@media (hover: hover) {})
PCだと問題ないけどスマホだと不思議な挙動になる

状況

  • ボタンがある
  • ボタンには「.xxx:hover{color:red;}」みたいな感じのCSSを設定
  • ボタンクリックでclassを追加して色変更
  • PCだと問題無いけど、スマホだとボタンタップ後、別の場所をタップしないと色が変わらない

結局、解決せず

確認内容

スマホとPCを繋いで確認

JS AndroidでのJavascript処理をデバッグしたい(Chrome)

とくにエラーはでていないし、ステップ実行しながら確認してもエラーにはならない

scriptの修正

▼もとのソースはこんな感じ

if (***) {
  $(***).removeClass(***).html(***);
}
else {
  $(***).addClass(***).html(***);
}

click

たぶんタップ後、解除がされていないんだろうってコトでblur()を試すか悩んだ

▼関係のないトコをタップしたら動くならclick()イベントで強制的にしてみるがダメ

$(***).removeClass(***).html(***);
$(***).parents(***).click();

▼「trigger('click')」にしないとダメなの?ってコトで試すもダメ

$(***).removeClass(***).html(***);
$(***).parents(***).trigger('click');

touchend

スマホなんでclickよりtouchendとかのほうがいいの?ってことでtouchendにしてみる

▼関係ないトコをタッチさせてみるもダメ

$(***).removeClass(***).html(***);
$(***).parents(***).trigger('touchstart');
$(***).parents(***).trigger('touchend');

blur()

click()がダメならblur()を試す

▼hoverならフォーカス解除すればよくね?って感じでblur()。でもダメ。

$(***).blur();
$(***).removeClass(***).html(***);

▼順番を逆にしてもダメ

$(***).removeClass(***).html(***);
$(***).blur();

▼まさか「blur()」じゃなく「trigger('blur')」と思ったけど変わらず

$(***).removeClass(***).html(***);
$(***).trigger('blur');

mouseoutとかも試すもダメ。

innerHTML

まさか「html()」が悪さしてる?と推測するも関係ない感じ

$(***).removeClass(***);
$(***)[0] = innerHtml(***);

hover

hoverが原因?と推測
cssから「:hover{}」を削除して実行すると成功する

ということで「スマホでは :hover{}を使わない」と考えるも「PCとスマホを横幅で判断する」ってのはしたくない
で、さらに調べるとメディアクエリに良いのがいるっぽい

@media (hover: hover) {}

▼こんな感じ

@media (hover: none) { # hoverが使えない端末
  ~~~~
}
@media (hover: hover) { # hoverが使える端末
  ~~~~
}

サンプル: css

@mixin hover {
  @media (hover: none) {
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    &:active {
      color: #959799;
    }
  }

  @media (-ms-high-contrast: none), (-ms-high-contrast: active), (-moz-touch-enabled: 0), (hover: hover) {
    &:hover {
      color: #959799;
    }
  }
}

サンプル: sass

@mixin hover {
  @media (hover: none) {
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    &:active {
      @content;
    }
  }

  @media (-ms-high-contrast: none), (-ms-high-contrast: active), (-moz-touch-enabled: 0), (hover: hover) {
    &:hover {
      @content;
    }
  }
}

.xxxx {
  @include hover {
    color: #959799;
  }
}

PCでは動かない:バグ?

PCも「@media (hover: none) {}」の中に入っていることに気づいた

調べると下記の何かにたどり着いた
Issue 441613: @media (hover: none) should be false on a traditional desktop/laptop computer

バグ解消したとあったけど「Mon, Aug 23, 2021, 6:24 AM GMT+9」のタイミングで再発した?的なコトが記載されている

ひとまず、挫折