位置:iPadとiPhoneでは修正されません


132

私はしばらくの間、iPadの固定位置に苦労しています。私はiScrollを知っていますが、(デモでも)常に機能するとは限りません。Senchaにはその修正が含まれていることも知っていますが、その修正のソースコードはCtrl+ できませんでしたF

私は誰かが解決策を持っていることを願っています。問題は、iOS搭載のモバイルSafariでユーザーがパン/アップしたときに、固定された要素が更新されないことです。


2
jQuery Mobile 1.1がこの問題を解決したようです:jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0
Tower


いくつかのSO質問の重複の可能性があります。詳細については、gist.github.com / avesus /…を参照してください。
ブライアンハーク2017

回答:


66

多くのモバイルブラウザーは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:fixedW3C仕様で動作するはずです。
Talvi Watia

@TalviWatia- device-fixed解決策は私の答えの一部ではありませんでした。それは提案としてのメリットがあるかもしれないし、ないかもしれませんが、リンクの理由は彼の提案された解決策ではなく問題の説明でした。いずれにせよ、この回答が投稿されてから(私がそう言ったように)状況は大きく変わり、多くの新しいデバイスがサポートしていfixedます。ただし、対応していない古いデバイスにも対応する必要があります。
Spudley

54
だから私は好奇心旺盛ですが、目の前の問題の正確な解決策は何ですか?あなたが提供したリンクはおそらく役立つかもしれませんが、目前の問題を解決しません。戸惑うことはありませんが、人々は実際にここでの回答ではない回答に賛成票を投じる傾向があります。
Talvi Watia

1
@TalviWatia:私が回答を書いた時点では、質問に対する良い解決策は実際にはありませんでした。私が与えたリンクは、物事がどうあるべきを説明するために私が知っていた最良のディスカッションでした。解決策がない場合、私が提供できるほど優れていました。介入期間中に物事が変更されたため、リンクでの議論はもはや意味がなく、解決策は現在ありますが、それは当時のやり方でした。
Spudley

実際の位置:固定はスケール1で機能しますが、ユーザーがipadをズームすると機能しません。position:device-fixed exist ?? Safari iOSの有効なCSS属性はありますか?
ccsakuweb 2013

37

固定配置は、コンピューターのようにiOSでは機能しません。

拡大鏡(ビューポート)の下に紙(Webページ)があるとします。拡大鏡と目を動かすと、ページの別の部分が表示されます。これがiOSの仕組みです。

これで、単語が書かれた透明なプラスチックのシートができました。このプラスチックのシートは、何があっても(位置:固定要素)静止しています。拡大鏡を動かすと、固定要素動いて見える

または、拡大鏡を移動する代わりに、プラスチックシートと拡大鏡を動かさずに、紙(Webページ)を移動します。この場合、プラスチックシート上の単語は固定されたままになり、残りのコンテンツは移動しているように見えます(実際には移動しているため)。これは従来のデスクトップブラウザです。

つまり、iOSではビューポートが移動し、従来のブラウザではWebページが移動します。どちらの場合も、固定要素は現実のままです。iOSでは固定要素が動いて見える。


これを回避する方法は、この記事の最後のいくつかの段落に従うことです

(基本的にスクロールを完全に無効にし、コンテンツを個別のスクロール可能なdivに含め(リンクされた記事の上部にある青いボックスを参照)、固定要素を絶対的に配置します)


「position:fixed」がiOS5で期待どおりに機能するようになりました。


IOSでズームインすると、position:fixedで発生する奇妙なことがいくつかあります。stackoverflow.com/questions/52085998/…を
Peter Hollingsworth

23

位置:固定は、垂直スクロールの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より前のページで同じページを機能させる予定の場合は、上部位置も設定する必要があります。そうしないと、何らかの理由で小さなマージンが追加されます。


これは実際に私のために働いた。以前は、非表示の入力要素のposition:fixed(純粋なCSSオフスクリーンナビゲーションを参照)が原因で、ブラウザーがiphone iOS 8.3でクラッシュしましたが、タブレットではクラッシュしませんでした。正常に動作した後。
スティーブンスミス

正方形のスタンドで横向きのiPad iOS 10.3では機能しませんでした。認められた著者は、このアプローチは「電話」のためであると言います。
SushiGuy 2017

2
ユーザーによるズームを無効にするとuser-scalable=0, minimum-scale=1.0, maximum-scale=1.0、多くのユーザーがページにアクセスできなくなる可能性があります。回答に警告を追加すると便利です
neiya '25

22

今アップルはそれをサポートしています

overflow:hidden;
-webkit-overflow-scrolling:touch;

これは私が私を解決するために後のことでした正確に何であるbackground-size: coverfixediPad上の問題
andyb

これはiOS 7のMobile Safariで機能します。注:このバージョンにまだアップグレードしていないユーザーは機能しません。
Neil Monroe、

次に、他のいくつかの変数が機能している必要があります。私はiOS 6でテストしましたが、機能しませんでした。iOS7で機能しました。
Neil Monroe

@NeilMonroeうーん多分。確かに私はiOS 6で問題なくそれをやったが、おそらく他の変数を使用した。覚えてはいけない
UğurÖzpınar

これは本当に役に立ちましたが、overflow設定する必要があるようですscroll

19

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


これにより実際に私のスクロールの問題が修正されました。iOSデバイスでを使用fixedするtransformとバウンスしていたため、が追加され、これが修正されました。
vonUbisch

17

固定フッター(ここでは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}

それが役に立てば幸い。


7

同じボックスで、transform:---とposition:fixedを使用しないでください。要素は、変換がある場合、position:staticに留まります。


6

私は新しいjQuery Mobile v1.1を使用することになりました:http : //jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

多くの一般的なプラットフォームで真の固定ツールバーを提供し、他のブラウザーでの静的ツールバーの配置に安全にフォールバックする、しっかりとした書き直しができました。

このアプローチの最も優れた点は、すべてのプラットフォームに不自然なスクロール物理を課すJSベースのソリューションとは異なり、スクロールが100%ネイティブであるということです。つまり、スクロールはどこでも正しく感じられ、タッチ、マウスホイール、キーボードのユーザー入力で機能します。おまけとして、CSSベースのソリューションは超軽量で、互換性やアクセシビリティに影響を与えません。


また、jQueryやJavaScript(CSSのみを使用)を使用せずにiOSで固定オブジェクトを許可するためのこのメソッドは、かなりエレガント(ただし、確実に回避策です)です。それはかなり普遍的に適用可能です。「フローティング」position:fixed要素をスクロールページの前に表示したい場合は、より高いz-index値を指定して、前面に表示されるようにする必要があります。
2014年

これは間違いなく質問の答えにはなりません。
グスタボシケイラ2014年

1

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>

1

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;}ます。


1

この問題を修正する簡単な方法は、要素の変換プロパティを入力するだけです。そしてそれは修正されます。ハッピーコーディング:-)

.classname{
  position: fixed;
  transform: translate3d(0,0,0);
}

また、あなたも彼のやり方を試すことができます。これもうまくいきます。

.classname{
      position: -webkit-sticky;
    }

0

これはすべてのシナリオに当てはまるわけではないかもしれませんが、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

0

私の場合、アニメーションを使用して固定要素が表示されていたためです。このリンクで述べたように

Safari 9.1では、アニメーションエレメント内にposition:fixed-elementがあると、position:fixed-elementが表示されない場合があります。


-2

これが私の解決策です...

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 )同時に。

幅と高さは、上、左、右、下のオプションより優先されるため、使用しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.