javascript CSSから「:hover」で指定されているスタイルを無効にする
スマホ端末でリンクやボタンをタッチした後に「:hover」のスタイルが残ってしまうので、どうにかしたい
作成日:2018-03-07, 更新日:2018-03-07
求めている内容と経緯
スマホ端末でリンクやボタンをタッチした後に「:hover」のスタイルが残ってしまう。
・PCだとマウスが乗ると「:hover」のスタイルが適用。外れると「:hover」のスタイルが適用解除。クリック時も同様にマウスが乗る or 乗らないで判別してくれる。
・スマホだとマウスの乗る・乗らないは関係なく、タッチしたあとも「:hover」のスタイルが適用されたままになる。
対策
よくある対策は「a:hover」などは使わずに「.hover」を設定してjqueryなどでCSSの追加・削除する。
→CSSはいじりたくないし、色々なトコで設定するのが面倒。
タッチイベントが存在するときは「:hover」を無効化する
修正箇所は出来る限り少なくしたい。かつ、複雑にしたくない。
→「ontouchstart」が使える場合のみ「:hover」を無効にする
▼サンプル
if ('ontouchstart' in document.documentElement) { for (var sheetI = document.styleSheets.length - 1; sheetI >= 0; sheetI--) { var sheet = document.styleSheets[sheetI]; if (sheet.cssRules) { for (var ruleI = sheet.cssRules.length - 1; ruleI >= 0; ruleI--) { var rule = sheet.cssRules[ruleI]; if (rule.selectorText) { rule.selectorText = rule.selectorText.replace(':hover', ':active'); } } } } }
メモ
「document.styleSheets」を絡めて調べると他にも色々と見つかる。
▼読み込んだCSSをすべて無効にする
$.each($.makeArray(document.styleSheets), function(){ this.disabled=true; }); $('*').removeAttr('style');