マウスがあるボタンの上にくる時に発生するイベントを、ホバー、マウスオーバー、ロールオーバーと言うそうです。
それぞれ少しずつ意味は違うそうですが、ここではその違いは、置いておきます。
ところで、Webのアプリケーションで、
あるボタンの上にマウスが来たら、色を変更する
あるボタンを押したら、更に別の色に変更する
という動きを考えた場合、
CSSの hover、active を使えば簡単に実現できます。
ところが、スマートフォンやタブレットなどのタッチ系デバイスでは、一度タッチして離しても色が hover の時のままで、元に戻りません。
どうもこれはよくある不具合?のようなので、何とか解決方法を探してみました。
スマホで擬似的にhoverを実装する
よくある解決策の一つが、JavaScriptで疑似的にhoverを実装する方法です。
class名をあてて擬似的にhoverを実装するのです。
これが一つのサンプルです。
1 2 3 4 5 |
$( 'a' ).bind('touchstart', function(){ $(this).addClass( 'hover' ); }).bind('touchend', function(){ $(this).removeClass( 'hover' ); }); |
ただ、よく考えてみると、タッチデバイスでは、そもそも hover が不要なので、スマホでhoverを無効にする方法を考えてみました。
スマホでCSSの hover を無効にする
スマホでCSSの hover を無効にするには、以下のJavaScriptを利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var touch = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; if (touch) { // remove all :hover stylesheets try { // prevent exception on browsers not supporting DOM styleSheets properly for (var si in document.styleSheets) { var styleSheet = document.styleSheets[si]; if (!styleSheet.rules) continue; for (var ri = styleSheet.rules.length - 1; ri >= 0; ri--) { if (!styleSheet.rules[ri].selectorText) continue; if (styleSheet.rules[ri].selectorText.match(':hover')) { styleSheet.deleteRule(ri); } } } } catch (ex) {} } |
このコードは、CSSの中で、:hover を使っている、すべてのルールを削除することが出来るので、極めて有効です。
プログラミングの無料レッスン体験
約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp
<Codecampの特徴>
1 現役エンジニアによる指導
2オンラインでのマンツーマン形式の講義
3大手企業にも導入されている実践的なカリキュラム
↓無料体験レッスン実施中です。
コメント