HTML
Tips
動作確認で見つけたOS・ブラウザ別の不具合色々
動作確認時に見つけた(見つかった)諸々の不具合をまとめている覚え書きです。対象バージョンは遭遇したもので他でも起こる可能性があります。
何はともあれ、jQueryでは色々あるのでユーザーエージェント判別は必須です。
//モバイルユーザーエージェント判別 var _ua = (function(u){ return { Tablet:(u.indexOf("windows") != -1 && u.indexOf("touch") != -1 && u.indexOf("tablet pc") == -1) || u.indexOf("ipad") != -1 || (u.indexOf("android") != -1 && u.indexOf("mobile") == -1) || (u.indexOf("firefox") != -1 && u.indexOf("tablet") != -1) || u.indexOf("kindle") != -1 || u.indexOf("silk") != -1 || u.indexOf("playbook") != -1, Mobile:(u.indexOf("windows") != -1 && u.indexOf("phone") != -1) || u.indexOf("iphone") != -1 || u.indexOf("ipod") != -1 || (u.indexOf("android") != -1 && u.indexOf("mobile") != -1) || (u.indexOf("firefox") != -1 && u.indexOf("mobile") != -1) || u.indexOf("blackberry") != -1 }; })(window.navigator.userAgent.toLowerCase()); //safari判別 var _ua_isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/);
参照元: 2015年版JavaScriptユーザエージェント判別・判定
iOS/safari
iOS8.4.1でhoverの設定がされていると2回タップしないといけない
- 理由:
- hoverにopacityがかかっている
- 対応:
- hover指定の振り分け
iOS9ではこの不具合はなくなっています。aタグをタップしてもリンクせず、もう一度タップするとリンク先に飛べるというもの。
jQueryを使えない場合はメディアクエリでhoverの動きを変えるしかありませんが、
iPadに対応させると1024pxで切らなければならないので、ウインドウサイズを小さめに開いているPCもかなりの部分で対象に...。
そもそもiOSではhoverの挙動自体がClickしたら、そのままでは戻ってくれないとか色々あるので、jQueryでbodyにclassを追加して、PC以外にhoverが効かないようにしています。
上のブラウザ判別を入れたら、後はpc時にclassを追加。hoverの指定のある所を分離して、頭にbody.pc-hover a.sample-btn:hover{…}
みたいに指定すればOKです。
var PChover = function() { $(window).on('load resize orientationchange', function() { if(_ua.Mobile || _ua.Tablet) { //この中のコードはスマホとタブレットにのみ適用 $('body').removeClass('pc-hover'); } else { //この中のコードはスマホとタブレット以外に適用 $('body').addClass('pc-hover'); } }); }; $(function(){ PChover(); });
参照元: iOS8.4.1でhoverの設定がされていると2回タップしないといけない
iOS(safari)でposition:fixedした要素がスクロール中だけz-indexを無視して前面に表示されてしまうバグ
- 理由:
- position:fixedを指定した要素がz-indexを無視する
- 対応:
- -webkit-transform: translate3d(0,0,0);
iOSにカテゴライズしていますがMac/safari5でも起こります。見出しだけ見るとナビとか最前面にあるなら問題無さそうですが、スクロール中にチカチカするので気にはなります。
該当箇所のclassに-webkit-transform: translate3d(0,0,0);
を追加すれば解決!
と思いきや...translate3dを設定することによって、
Androidでは別のtransformが効かなくなるバグがあるので。
ユーザーエージェント判別でclassを出し分けて、safariにだけ適用する必要があります。
参照元ではiOS/Chromeも対象になっていますが2016.04現在iOS9/Chrome50では起こらないようです。
if(_ua_isSafari) {$('.class').css('-webkit-transform','translate3d(0,0,0)');}
参照元:
iOS(safari)でiframe内のレスポンシブ対応のカルーセルプラグインがはみ出す
- 理由:
- iframeにwidth:100%;を指定する
- 対応:
- iframeを使わない
jQueryプラグインのSwiper、jcarousel.responsiveで確認。ブレークポイントを認識せずに画面外まではみ出して挙動もカクカクに。 元々iframeを使った理由がページの特定部分の読み込むタイミングを遅らせるためだけだったので、指定したidに.loadで外部ファイルを読み込み、 ファイルが読み込んだのを確認してからプラグインを実行することで解決しました。
$('#load').load('contents.html', function() { $('.swiper-container').swiper({ … }); });