iPad SafariのスクロールによりHTML要素が消えて遅れて再表示される


165

私は現在、html5およびjQuery for iPad Safariを使用してWebアプリを開発しています。大きなスクロール領域が原因で、画面の外にある要素が下にスクロールしたときに遅れて表示されるという問題が発生しています。

つまり、画面外にある画像(またはグラデーションのあるdiv)の行がある場合、下(または上)にスクロールすると、期待される動作は要素が画面に次のように表示されることです。私はそれにスクロールしています。

しかし、私が見ているのは、画面から指を離してスクローラーがすべてのアニメーションを完了するまで、要素が表示さないことです。

これは私にとって非常に顕著な問題を引き起こし、全体が不安定に見えますが、そうではありません。iPad Safariがメモリを節約するために何かしようとしているのだと思います。この途切れが起きないようにする方法はありますか?さらに、iPad Safariが実際に何をしようとしているのかを誰かに明かしていただければ幸いです。


この問題/解決策は、jPanelMenu 1.3 CSS Transformsバージョンの問題を修正するのに役立ちました。これにより、上記のスニペットを追加するまで、サイトのすべてが非表示になります。
75回目のトロンボーン、

2
*:not(html)を使用すると、translate3dがサイトの他のすべての側面に適用されるため、お勧めしません。下にスクロールするとタブの画像が消えるなど、3D画像だけで見られるバグがサイトの他の側面に表示されるようになります。
ジョナサントンジ2014

1
<svg>同様の遅延描画/レンダリングを示す要素がいくつかありました。残念ながら、*:not(html) { ... }@ JonathanTongeが指摘するように、あらゆる種類の奇妙な動作が発生しました。ただし、<svg>要素のみを選択translate3d(0, 0, 0,);して使用すると、スクロールの問題が解決したようです。
Zephyr Mays

非常に特殊なユースケースを除いて、これはゴミです。絶対位置要素に依存するレイアウトを本当に混乱させます。
Stoutie 2014

2
質問の「編集」ではなく、回答を回答として投稿してください。私はあなたがあなたの答えを最も気に入っているのを知っています、それは結構ですが、StackOverflowには、QとAが異なるときに最もよく機能するQ&A形式があります。
Slipp D. Thompson 2014

回答:


184

ハードウェアアクセラレーションをより効果的に使用するには、ブラウザーをだます必要があります。空の3D変換を使用してこれを行うことができます。

-webkit-transform: translate3d(0,0,0)

特に、position:relative;宣言がある子要素でこれが必要になります(または、すべての子要素に対して実行してください)。

保証された修正ではありませんが、ほとんどの場合、かなり成功しています。

ハットヒント:https : //web.archive.org/web/20131005175118/http : //cantina.co/2012/03/06/ios-5-native-scrolling-grins-and-gothcas/


3
私も試しました。悲しいことに、translate3dを追加すると、以前は適切に表示されていた要素が切り離されます。また、画面外にあり、画面上で「飛び込む」ようにアニメーション化する必要があるいくつかのオブジェクトのハードウェアアクセラレーションも必要でした。私はjQueryのanimate()を使用していましたが、非常に低速でした。ハードウェアアクセラレーションの使用に切り替えました。これはアニメーションを高速化しましたが、親(アニメーション)divの子要素の一部が切り取られたという意味で、不安定な結果を生み出しました。これは、animate()を使用していたときには起こりませんでした。
codeBearer 2012

1
@コリン・ウィリアムズ、あなたは私の一日を作りました!:D
ルーク

9
うわー、それは恐ろしいが効果的です。ありがとうございました。
Tim Down


1
ゴールドフリークスターマン!スクロール可能なdivのすべてのli要素に追加しました。ひどい。働いた。
ブライアンジョンソン

68

これが私の質問に対する完全な回答です。私は元々、@ Colin Williamsの回答を正解としてマークしていました。これは、完全な解決策を見つけるのに役立ちました。コミュニティメンバーの@Slipp D. Thompsonが私の質問を編集しました。約2.5年前から質問していて、SOのQ&A形式を悪用していると言われました。彼はまた、これを答えとして別に投稿するように私に言った。だからここに私の問題を解決した完全な答えがあります:

@Colin Williams、ありがとう!あなたの答えとあなたがリンクした記事は、CSSで何かを試すことにつながりました。

そのため、以前はtranslate3dを使用していました。それは望ましくない結果を生み出しました。基本的に、それは私がそれらと対話するまで、画面外にある要素を切り刻み、レンダリングしませんでした。つまり、基本的に横向きでは、画面外にある私のサイトの半分が表示されていませんでした。これはiPad Webアプリです。これは、私が修正したためです。

相対的に配置された要素にtranslate3dを適用すると、それらの要素の問題は解決しましたが、他の要素は、画面外になるとレンダリングを停止しました。(アートワーク)とやり取りできなかった要素は、ページを再読み込みしない限り、再び表示されることはありません。

完全なソリューション:

*:not(html) {
    -webkit-transform: translate3d(0, 0, 0);
}

さて、これは最も「効率的な」ソリューションではないかもしれませんが、機能するのはそれだけでした。Mobile Safariは、を使用している場合、画面外の要素をレンダリングしないか、不規則にレンダリングすることがあり-webkit-overflow-scrolling: touchます。そのスクロールのために画面外に出る可能性のある他のすべての要素にtranslate3dが適用されていない限り、それらの要素はスクロール後に切り落とされます。

だから、再び感謝し、これが他の失われた魂を助けることを願っています。これは確かに私に大きな時間を助けました!


2
ワオ。これをありがとう。それは私のphonegap / cordovaアプリのために私に莫大な量の頭痛を救いました。私の場合は、変更しなければならなかった*:not(html)body *
アノン

9
-webkit-transform: translate3d(0, 0, 0);問題の要素に適用するだけでうまくいきました。私の場合、私はScrollMagic
fidev '

これも私にとってはうまくいきませんでした。特定のポイントまで下にスクロールするとすぐに、ウィンドウの上に表示されなくなったものや、ビューポートの一部の要素が変更されます。スクロール中に非常にわずかではあるが紛れもない「衝撃」に気づき、その後要素がホースされます。(つまり、スクロール中にしゃっくりするような、滑らかな-ジッター-滑らかな動作です。)これはiPadにあります。
cbmtrx 2015年

ところで、iPad Air 2では、特定の画面上の要素(この場合はナビゲーションバー)が画面から消えると、デバイスがそのブロックを「リロード」します-元のメディアバージョンではなく、大きなバージョンのみを使用します。ページが読み込まれたこと。What the ...
cbmtrx 2015年

誰かが私と同じ奇妙さを経験している場合-このページで説明されているものとは少し異なります-jQueryの$(window).width()代わりにを使用window.innerWidthすると、iOSのすべての違いが発生することがわかりました。知るか。
cbmtrx 2015年

13

html以外のすべての要素を対象とする: *:not(html) 私の場合、他の要素で問題が発生しました。スタッキングコンテキストが変更され、一部のZインデックスが破損しました。

適切な要素ターゲットにして、-webkit-transform: translate3d(0,0,0)それにのみ適用することをお勧めします。

編集:がtranslate3D(0,0,0)機能しないことがあります。次のメソッドを使用して、適切な要素をターゲットにできます。

@keyframes redraw{
    0% {opacity: 1;}
    100% {opacity: .99;}
}

// ios redraw fix
animation: redraw 1s linear infinite;

私は同じ問題に直面していました。のbody *代わりにセレクタを使用できます*:not(html)。それはあなたの問題を解決します。
kunal

*ですべてを汚染するのではなく、適切な要素をターゲットにするという提案に対する
称賛

7

translate3dが機能しない場合は、パースペクティブを追加してみてください。それはいつも私のために働きます

transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
perspective: 1000;
-webkit-perspective: 1000;

http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css


神聖なc $#@最後に角度/イオンのソリューション。 -webkit-perspective: 1000;
lilbiscuit

ああ私の日を救った。+1 for;)
Omar Bahir

これにより、iOSブラウザーがクラッシュしました。
Andreas Richter

-webkit-perspective: 1000;私のためにそれをやりました-ありがとう
jHilscher

2

-webkit-transform: translate3d(0,0,0)静的に要素に追加することは私にとってはうまくいきません。

このプロパティを動的に適用します。たとえば、ページがスクロールさ-webkit-transform: translate3d(0,0,0)れると、要素を設定します。その後、少し遅れて、このプロパティをリセットします。つまり、-webkit-transform: none このアプローチは機能するようです。

@Colin Williams、正しい方向に向けてくれてありがとう。


これらのスタイルはいくつかの不要な副作用を伴うため、このヒントは私に大いに役立ちました。したがって、私はtouchstart / touchendイベントを使用して、それらを追加および削除します。ありがとう!
Windwalker 2016

1

iOS7のiscroll 4.2.5でも同じ問題が発生しました。スクロール要素全体が消えるだけです。translate3d(0,0,0)ここで提案したように追加しようとしましたが、問題は解決しましたが、iscrollの「スナップ」効果が無効になりました。解決策"position:relative; z-index:1000;display:block"は、スクロール要素を保持するコンテナ全体にcssプロパティを与えることであり、translate3dを子要素に与える必要はありません。


このテクニックを使用して、Android Chromeで同様の問題を解決しました。垂直スクロールは、translate3d修正を試したときよりもパフォーマンスが良いように見えました。私の場合、<body>要素はスクロールに使用したものであり、簡略化されたバージョンが機能しました:body { position: relative; z-index: 0; }
BumbleB2na '28

1

時々動作しtranslate3dないかもしれません、それらの場合にperspectiveは使用することができます

transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
perspective: 1000;
-webkit-perspective: 1000;

0

私はこれを次の方法で解決したと確信しています:

overflow-y: auto;

(おそらくoverflow: auto;、必要に応じて機能します。)


受け入れられた答えはおそらく別のシナリオでしたが、それは私には何もしませんでした
tony

0

回転が適用されたり、Zインデックスが使用されたりする場合があります。

回転-webkit-transform要素を回転させるための既存の宣言では、外観の問題(のような-webkit-transform: rotate(-45deg))にも対処できない場合があります。この場合-webkit-transform: translateZ(0px) rotateZ(-45deg)、トリックとして使用できます(Z回転を気にしてください)。

Zインデックス:回転と組み合わせて、などの正のz-indexプロパティを定義できますz-index: 42。「回転」で説明した上記の手順は、私の場合、空の場合でも問題を解決するのに十分でしたtranslateZ(0px)。この場合、Zインデックスがしていることけれども私は疑う原因と消滅をし、最初の場所で再び登場します。いずれの場合も、z-index: 42プロパティを保持する必要があります- -webkit-transform: translateZ(42px)だけでは不十分です。


0

これは、開発者が直面する非常に一般的な問題であり、主にとしてSafari's定義されposition : fixedた要素を再作成しないという性質によるものです。

したがって、位置プロパティを変更するか、他の回答で述べたように、ハックを適用する必要があります。

リンク1

リンク2


0

私の場合(iOS Phonegapアプリ)、translate3dを相対子要素に適用しても問題は解決しませんでした。私のスクロール可能な要素は、絶対的に配置されていて、上部と下部の位置を定義していたため、高さが設定されていませんでした。それを修正したのは、最小高さ(100px)を追加することでした。


0

以前のバージョンのFancyboxを使用して同じ問題が発生しました。v3にアップグレードすると問題が解決するか、次のように追加できます。

html, body {
    -webkit-overflow-scrolling : touch !important;
    overflow: auto !important;
    height: 100% !important;
}

0

Framework7&Cordovaプロジェクトでこの問題に直面しました。上記のすべての解決策を試しました。彼らは私の問題を解決しませんでした。

私の場合、同じページで10以上のCSSアニメーションを使用しており、無限の回転(変換)が行われていました。アニメーションを削除する必要がありました。いくつかの視覚的機能がなくても問題ありません。

上記の解決策が役に立たない場合は、一部のアニメーションを削除し始めることができます。


0

-webkit-transform: translate3d(0, 0, 0);トリックは私のために動作しませんでした。私の場合、私は親を次のように設定しました:

// parent
height: 100vh;

これを次のように変更します。

height: auto;
min-height: 100vh;

他の誰かが同じ状況に直面している場合の問題を解決しました。


0

私の場合、CSSは問題を解決しませんでした。jQueryを使用しているときに問題に気づき、ボタンを再レンダリングしました。

$("#myButton").html("text")

これを試して

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