私はしばらくの間、iPadの固定位置に苦労しています。私はiScrollを知っていますが、(デモでも)常に機能するとは限りません。Senchaにはその修正が含まれていることも知っていますが、その修正のソースコードはCtrl+ できませんでしたF。
私は誰かが解決策を持っていることを願っています。問題は、iOS搭載のモバイルSafariでユーザーがパン/アップしたときに、固定された要素が更新されないことです。
私はしばらくの間、iPadの固定位置に苦労しています。私はiScrollを知っていますが、(デモでも)常に機能するとは限りません。Senchaにはその修正が含まれていることも知っていますが、その修正のソースコードはCtrl+ できませんでしたF。
私は誰かが解決策を持っていることを願っています。問題は、iOS搭載のモバイルSafariでユーザーがパン/アップしたときに、固定された要素が更新されないことです。
回答:
多くのモバイルブラウザーはposition:fixed;
、固定要素が小さな画面で邪魔になる可能性があるという理由で、意図的にサポートしていません。
Quirksmode.orgサイトには、問題を説明する非常に優れたブログ投稿があります。http://www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html
また、サポートされているモバイルブラウザーを示す互換性チャートについては、このページを参照してください。httpposition:fixed;
://www.quirksmode.org/m/css.html
(ただし、モバイルブラウザの世界は急速に変化しているため、このようなテーブルは常に最新の状態に保たれない場合があります。)
更新:iOS 5とAndroid 4はどちらも現在、position:fixedのサポートがあると報告されています。
今日、Apple StoreでiOS 5をテストしましたが、位置が固定されていても機能することを確認できました。ただし、固定要素のズームインとパンには問題があります。
:私は、はるかに多くの最新かつ便利にquirksmodeの1よりも、この適合表を見つけ http://caniuse.com/#search=fixed
Android、Opera(ミニおよびモバイル)、iOSの最新情報があります。
position:device-fixed
一種の冗長になります。position:fixed
W3C仕様で動作するはずです。
device-fixed
解決策は私の答えの一部ではありませんでした。それは提案としてのメリットがあるかもしれないし、ないかもしれませんが、リンクの理由は彼の提案された解決策ではなく問題の説明でした。いずれにせよ、この回答が投稿されてから(私がそう言ったように)状況は大きく変わり、多くの新しいデバイスがサポートしていfixed
ます。ただし、対応していない古いデバイスにも対応する必要があります。
固定配置は、コンピューターのようにiOSでは機能しません。
拡大鏡(ビューポート)の下に紙(Webページ)があるとします。拡大鏡と目を動かすと、ページの別の部分が表示されます。これがiOSの仕組みです。
これで、単語が書かれた透明なプラスチックのシートができました。このプラスチックのシートは、何があっても(位置:固定要素)静止しています。拡大鏡を動かすと、固定要素が動いて見える。
または、拡大鏡を移動する代わりに、プラスチックシートと拡大鏡を動かさずに、紙(Webページ)を移動します。この場合、プラスチックシート上の単語は固定されたままになり、残りのコンテンツは移動しているように見えます(実際には移動しているため)。これは従来のデスクトップブラウザです。
つまり、iOSではビューポートが移動し、従来のブラウザではWebページが移動します。どちらの場合も、固定要素は現実のままです。iOSでは固定要素が動いて見える。
これを回避する方法は、この記事の最後のいくつかの段落に従うことです
(基本的にスクロールを完全に無効にし、コンテンツを個別のスクロール可能なdivに含め(リンクされた記事の上部にある青いボックスを参照)、固定要素を絶対的に配置します)
「position:fixed」がiOS5で期待どおりに機能するようになりました。
位置:固定は、垂直スクロールのandroid / iphoneで機能します。ただし、メタタグが完全に設定されていることを確認する必要があります。例えば
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
また、Android 4.0より前のページで同じページを機能させる予定の場合は、上部位置も設定する必要があります。そうしないと、何らかの理由で小さなマージンが追加されます。
user-scalable=0, minimum-scale=1.0, maximum-scale=1.0
、多くのユーザーがページにアクセスできなくなる可能性があります。回答に警告を追加すると便利です
今アップルはそれをサポートしています
overflow:hidden;
-webkit-overflow-scrolling:touch;
background-size: cover
とfixed
iPad上の問題
Safari(iOS 10.3.3)でこの問題が発生しました-touchendイベントが発生するまで、ブラウザーは再描画されませんでした。固定要素が表示されなかったか、切り取られました。
私にとっての秘訣は変換を追加することでした:translate3d(0,0,0); 私の固定位置要素に。
.fixed-position-on-mobile {
position: fixed;
transform: translate3d(0,0,0);
}
編集 -トランスフォームが問題を修正する理由がわかりました:ハードウェアアクセラレーション。3D変換を追加すると、GPUアクセラレーションがトリガーされ、スムーズな移行が行われます。ハードウェアアクセラレーションチェックアウトの詳細については、この記事を参照してください:http : //blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css。
fixed
するtransform
とバウンスしていたため、が追加され、これが修正されました。
固定フッター(ここではjQueryを使用):
if (navigator.platform == 'iPad' || navigator.platform == 'iPhone' || navigator.platform == 'iPod' || navigator.platform == 'Linux armv6l')
{
window.ontouchstart = function ()
{
$("#fixedDiv").css("display", "none");
}
window.onscroll = function()
{
var iPadPosition = window.innerHeight + window.pageYOffset-45; // 45 is the height of the Footer
$("#fixedDiv").css("position", "absolute");
$("#fixedDiv").css("top", iPadPosition);
$("#fixedDiv").css("display", "block");
}
}
// in the CSS file should stand:
#fixedDiv {position: fixed; bottom: 0; height: 45px; whatever else}
それが役に立てば幸い。
私は新しいjQuery Mobile v1.1を使用することになりました:http : //jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/
多くの一般的なプラットフォームで真の固定ツールバーを提供し、他のブラウザーでの静的ツールバーの配置に安全にフォールバックする、しっかりとした書き直しができました。
このアプローチの最も優れた点は、すべてのプラットフォームに不自然なスクロール物理を課すJSベースのソリューションとは異なり、スクロールが100%ネイティブであるということです。つまり、スクロールはどこでも正しく感じられ、タッチ、マウスホイール、キーボードのユーザー入力で機能します。おまけとして、CSSベースのソリューションは超軽量で、互換性やアクセシビリティに影響を与えません。
jqueryを使用してこれを思いつくことができます。それはスムーズにスクロールしませんが、トリックをします。下にスクロールすると、固定divが上にポップアップします。
CSS
<style type="text/css">
.btn_cardDetailsPg {height:5px !important;margin-top:-20px;}
html, body {overflow-x:hidden;overflow-y:auto;}
#lockDiv {
background-color: #fff;
color: #000;
float:left;
-moz-box-shadow: 0px 4px 2px 2px #ccc;-webkit-box-shadow: 0px 4px 2px 2px #ccc;box-shadow:0px 4px 2px 2px #ccc;
}
#lockDiv.stick {
position: fixed;
top: 0;
z-index: 10000;
margin-left:0px;
}
</style>
HTML
<div id="lockSticky"></div>
<div id="lockDiv">fooo</div>
jQuery
<script type="text/javascript">
function sticky_relocate() {
var window_top = $(window).scrollTop();
var div_top = $('#lockSticky').offset().top;
if (window_top > div_top)
$('#lockDiv').addClass('stick')
else
$('#lockDiv').removeClass('stick');
}
$(function() {
$(window).scroll(sticky_relocate);
sticky_relocate();
});
</script>
最後に、ipod touchを横向きまたは縦向きモードで表示するかどうかを決定します
<script type="text/javascript">
if (navigator.userAgent.match(/like Mac OS X/i)) {
window.onscroll = function() {
if (window.innerWidth > window.innerHeight) {
//alert("landscape [ ]");
document.getElementById('lockDiv').style.top =
(window.pageYOffset + window.innerHeight - 268) + 'px';
}
if (window.innerHeight > window.innerWidth) {
//alert("portrait ||");
document.getElementById('lockDiv').style.top =
(window.pageYOffset + window.innerHeight - 418) + 'px';
}
};
}
</script>
CSS属性{position:fixed;}
は(ほとんどの場合)新しいiOSデバイスで機能しているように見えますが、{position:relative;}
原因や理由がなくても、デバイスに奇妙な動作やフォールバックが発生する可能性があります。通常、キャッシュをクリアすると、何かが発生して奇妙なことが再び発生するまで役立ちます。
具体的には、Apple自体からiPad用のWebコンテンツの準備:
iPadのSafariおよびiPhoneのSafariには、サイズ変更可能なウィンドウがありません。iPhoneおよびiPadのSafariでは、ウィンドウサイズは画面のサイズに設定され(Safariユーザーインターフェイスコントロールを除く)、ユーザーは変更できません。Webページ内を移動するには、ユーザーがダブルタップまたはピンチしてズームインまたはズームアウトするとき、またはタッチしてドラッグしてページをパンするときに、ビューポートのズームレベルと位置を変更します。ユーザーがビューポートのズームレベルと位置を変更すると、固定サイズの表示可能なコンテンツ領域(つまりウィンドウ)内で変更されます。つまり、ビューポートに「固定」された位置にあるWebページ要素は、画面外の表示可能なコンテンツ領域の外側に配置される可能性があります。
皮肉なことに、Androidデバイスにはこの問題がないようです。また{position:absolute;}
、bodyタグを参照するときに使用することも可能で、問題はありません。
私はこの癖の根本的な原因を見つけました。HTMLまたはBODYタグと組み合わせて使用すると、スクロールイベントがうまく再生されないこと。イベントを起動したくない場合や、スクロールスイングイベントが終了してイベントを受信するまで待機する必要がある場合があります。具体的には、このイベントの最後にビューポートが再描画され、固定要素をビューポート内の別の場所に再配置できます。
だからこれは私がやっていることです:(ビューポートの使用を避け、DOMに固執してください!)
<html>
<style>
.fixed{
position:fixed;
/*you can set your other static attributes here too*/
/*like height and width, margin, etc.*/
}
.scrollableDiv{
position:relative;
overflow-y:scroll;
/*all children will scroll within this like the body normally would.*/
}
.viewportSizedBody{
position:relative;
overflow:hidden;
/*this will prevent the body page itself from scrolling.*/
}
</style>
<body class="viewportSizedBody">
<div id="myFixedContainer" class="fixed">
This part is fixed.
</div>
<div id="myScrollableBody" class="scrollableDiv">
This part is scrollable.
</div>
</body>
<script type="text/javascript" src="{your path to jquery}/jquery-1.7.2.min.js"></script>
<script>
var theViewportHeight=$(window).height();
$('.viewportSizedBody').css('height',theViewportHeight);
$('#myScrollableBody').css('height',theViewportHeight);
</script>
</html>
本質的には、これによりBODYがビューポートのサイズになり、スクロールできなくなります。内部にネストされたスクロール可能なDIVは、BODYが通常行うようにスクロールします(スイングエフェクトを除くため、タッチエンドでスクロールは停止します)。固定DIVは干渉なしで固定されたままです。
補足として、z-index
スクロール可能なDIVが背後にあるように見せるためには、固定DIVの高い値が重要です。私は通常、ウィンドウのサイズ変更とスクロールイベントを追加し、クロスブラウザーと代替画面解像度の互換性も確保しています。
他のすべてが失敗した場合、上記のコードは、固定およびスクロール可能なDIVの両方をに設定しても機能し{position:absolute;}
ます。
これはすべてのシナリオに当てはまるわけではないかもしれませんが、position: sticky
(と同じposition: fixed
)が動作するのは、スクロールコンテナーが本体ではなく、別の内部にある古いiPhoneだけです。
擬似HTMLの例:
body <- scrollbar
relative div
sticky div
スティッキーdivはデスクトップブラウザーでスティッキーになりますが、特定のデバイスでテストされています:Chromium:dev tools:device emultation:iPhone 6/7/8、およびAndroid 4 Firefoxではテストされません。
しかし、うまくいくのは
body
div overflow=auto <- scrollbar
relative div
sticky div
これが私の解決策です...
CSS
#bgimg_top {
background: url(images/bg.jpg) no-repeat 50% 0%;
position: fixed;
top:0;
left: 0;
right:0 ;
bottom:0;
}
HTML
<body>
<div id="bgimg_top"></div>
....
</body>
説明は、divの位置が固定されているため、divが常に背景に表示されるため、(left、right、top、bottom )同時に。
幅と高さは、上、左、右、下のオプションより優先されるため、使用しないでください。