スマホでもタップした感を出すためにhoverを実装して欲しいと要望を受けたのですが、
疑似要素の:hover
ではタップして変化した後、元に戻らなかったり思うような動作にならず…
色々調べた結果、なんとか納得のいく形になったのでスニペット的にメモを残します。
最終的に取った方法としては下記のような感じです。
- PCもスマホも、擬似クラス
:hover
は使用しない。 -
hover
の効果を付けたいhtmlの要素のclassにtouch-hover
を付けておく。 -
.touch-hover
に対してjQueryで-
touchstart
とmouseover
のイベント時にclassにhover
を付与する。 -
touchend
とtouchmove
とmouseout
とclick
のイベント時にclassからhover
を削除する。
-
##コード
jQuery
$("body").on({
"touchstart": function() {
return $(this).off("mouseover mouseout");
},
"touchstart mouseover": function() {
return $(this).addClass("hover");
},
"touchend touchmove mouseout click": function() {
return $(this).removeClass("hover");
}
}, ".touch-hover");
あとはCSSで対象の.hover
にhover時のスタイルを適用すれば良いはずです。
###補足
- タッチした時にマウスのイベントも呼ばれているらしく、それを回避するために
touchstart
のイベントでmouseover
とmouseout
のイベントを削除しています。 -
body
に対してイベントを登録しているのは、.touch-hover
を持った要素が動的に追加されることがあったので、それらにもイベントを登録するためにこのような記述にしています。 -
touchmove
でもhoverを解除しているのは、スクロールしたときにhover状態で指に追従してくるのがなんかイヤだったためです。 -
click
でもhoverを解除しているのは、タッチしてその位置から移動する要素があった時に、hoverが残ってしまうことがあったためです。このあたりは無理矢理感があります…
参考にさせていただいたサイト
http://uenomemo.sakura.ne.jp/pcmemo/767