スマートフォンで要素を固定するサンプルです。
対応範囲によってはposition: fixed;でもいいのですが、
iOS4以下やAndroid2.3以下まで対応が必要な場合、JavaScriptでの対応が必要になります。
サンプルコード
HTML、CSSは必要個所の抜粋になりますので、詳しくはデモページをご確認ください。
HTML
<div id="page"> <header id="header">ヘッダー</header> <div id="contents"> <div>コンテンツ</div> </div> <footer id="footer">フッター</footer> <div id="under-btn"><a href="">固定要素</a></div> </div>
CSS
#under-btn { display: none; position: relative; z-index: 9000; width: 100%; }
JavaScript
// スマホの振り分け用 var ua = navigator.userAgent; var isiPhoneMb = (ua.indexOf('iPhone') > -1 && ua.indexOf('iPad') == -1) || ua.indexOf('iPod') > -1; var isAndroidMb = (ua.indexOf('Android') > -1 && ua.indexOf('Mobile') > -1); var isSp = (isiPhoneMb || isAndroidMb); $(function() { // 固定する要素の指定 var fixElement = $('#under-btn'); // 閲覧端末がスマホのときの処理 if(isSp) { $(window).on('load', function() { // 固定する要素を表示・position指定 fixElement.show().css({ position: 'absolute' }); }); // ページアクセス・スクロール・リサイズ時に固定位置を指定する $(window).on('load scroll resize', function() { elementFix(); }); // 要素を固定する処理 function elementFix() { // 固定する要素の高さ var fixHeight = fixElement.outerHeight(); // 現在のスクロール位置 var scTop = $(window).scrollTop(); // 表示領域の高さ var winHeight = window.innerHeight; // 固定する要素の位置を指定 fixElement.css({ top: scTop + winHeight - fixHeight }); // 固定する要素でフッターが隠れないように余白を作成 $('body').css({ paddingBottom: fixHeight }); } } });
デモは手持ちの端末(iOS6.1.6、Android4.4.3、Android2.3.3)で確認しています。
JavaScript17行目の表示領域の高さは、初めは$(window).height() で取得しようとしていたのですが、
iOSではツールバー?の影響か取得したい値がうまく取れませんでした。
色々と取得方法を試してみた結果、window.innerHeightだとうまくいきそうな感じでした。
あとこれは画面下部に固定する方法ですが、上部に固定したい場合も同じやり方でいけると思います。
21行目のtopの値をスクロール位置だけの値にして、(top: scTop)
25行目のbody下部につけている余白を上部につけるように変更(paddingTop: fixHeight)
で、画面上部での固定になります。
探していたスクリプトで参考に使わせていただいています。
但し、URLにhttps://(SSL)が掛かると動作しません。なにか対策はあるのでしょうか?
TOMOさん
コメントありがとうございます。
サンプルページのコードはjQueryの読み込みが「http://…」となっているため、そのまま流用するとSSLページでは読み込まれません。
SSLページでも対応する場合、「http」の部分を省略して、
http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
↓
//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
のようにすると、SSLページでもjQueryが読み込まれて動作するかと思います。