前提・実現したいこと
iOSのSafariで上向きの無限スクロールを行おうとしているんですがうまくいかず、困っています。
上向きにスクロールした際に、その先頭部分に要素を追加しようと考えています。
ただ、iOSでは追加した際にスクロール位置が更新できず、上部に要素を追加した際にスクロールが動いてしまい、自然なスクロールになりません。
PCのChromeやSafariでは意図通りに動くのですが、実機のSafariではうまく動きません。以下のCodePenをiosで開いてもらえれば確認できると思います。
iOSのSafariでスクロール中に、先頭部分に要素を追加した際にスクロール位置を保持するにはどうすればいいでしょうか。
該当のソースコード
CodePenで再現したものは以下のとおりです。
https://codepen.io/ibuki90/pen/XWJjvdO
スクロールして上から200pxを超えると、その上部に要素を追加します。
その際、要素追加前に位置を記録し、追加後に追加された高さ分スクロールした位置にスクロールを移動させています。
ただ、iosでは慣性スクロールの影響か、慣性スクロールが止まるまでスクロール位置が移動してくれません。
ライブラリでも実装でも何でも良いので、解決策があれば教えていただけないでしょうか。よろしくお願いします。
指摘がありましたので、CodePen内のコードを以下にも記載します。
html
1<div class="posts"></div>
js
1function postEl(text) { 2 return `<div>${text}</div>`; 3} 4 5function setupInitialPosts() { 6 [...Array(100).keys()].forEach(i => { 7 const text = `post${i}` 8 $('.posts').append(postEl(text)); 9 }); 10 $(document).scrollTop(1000); 11} 12 13$(() => { 14 setupInitialPosts(); 15 16 let prependedCount = 0; 17 $(document).scroll(() => { 18 if($(document).scrollTop() < 200) { 19 const beforeUpdatingScrollTop = $(document).scrollTop(); 20 [...Array(10).keys()].forEach(i => { 21 const text = `prependPost${prependedCount * 10 + i}`; 22 $('.posts').prepend(postEl(text)); 23 }); 24 prependedCount++; 25 26 const elements = $('.posts div'); 27 const movedScroll = elements[10].offsetTop - elements[0].offsetTop; 28 $(document).scrollTop(beforeUpdatingScrollTop + movedScroll); 29 }; 30 }); 31});
追記です。
iOS13から慣性スクロールがデフォルトで有効になっていて、無効にできなくなっているようです。無効にできれば早いんですが。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/17 05:59