4

私は数え切れないほどの投稿を読み、数え切れないほどコードを書き直しましたが、壁にぶつかりました。コンテナーに CSS scale3d 変換が適用されているため、ページをスクロールするときに要素の固定位置に CSS を使用しないという制限を克服しようとしています。私の最新のソリューションは機能しますが、主に最初のスクロールで「固着」や「吃音」が発生する傾向があります(スクロールの「勢い」によって見かけのパフォーマンスが向上するようです)。この現在のプロジェクトは、Ember で書かれた古いアプリを書き直したものであり、そのアプリの同じ機能は問題なく動作します。これを達成するために使用されたブードゥー教を発見しようとして目が出血するまで、非限定化された Ember コードを調べました (成功しませんでした)。

これは、これまでで最高のパフォーマンスを発揮した最新のイテレーションです。

const handler = () => {
  const scroll = window.scrollY,
    // provides scaling factor from container
    scaled = scroll / scalingObject.current.scale;

  requestAnimationFrame(() => {
    $("div[data-sb-active-page='true'] .sb-fixed-scroll").each(function () {
      const $el = $(this),
        // a previous (non-translate3d) transform may have been cached
        ot = $el.data('sb-original-transform');
      $el.css({
        transform: `translate3d(0px, ${scaled}px, 0px) ${ot}`,
      });
    });
  });
};
$(window).on('scroll', handler);

いくつかのコメントを避けるために: 以前の変換を適用することを心配せずに、このコードを試しました:

$("div[data-sb-active-page='true'] .sb-fixed-scroll").css({
   transform: `translate3d(0px, ${scaled}px, 0px)`
});

私は直接DOM構成を試しました-document.querySelectorAll要素を使用してから繰り返し、呼び出しますelement.style.transform = `translate3d(0px, ${scaled}px, 0px)`

これらのソリューションはすべて機能します - そして jQuery (驚くべきことに私には) が最高のように思えますが、完璧ではありません。前に述べたように、JS のみのソリューションが固着/吃音なしで動作するのを目撃したという事実がなければ、それは不可能であると述べているところです。

これは私の白いクジラです。

更新 - クイック アンド ダーティ JSFiddle を作成しました: https://jsfiddle.net/syzmic/sbwac5zq/3/

スクロールが最も問題となる現在のプロジェクトのページから HTML をスクレイピングしました。JSの現在の状態を含めました。それはほとんどの場合動作します..しかし、急速なマウスホイールは、スタッターまたはバウンスを引き起こす可能性があります.

4

1 に答える 1

0

だから - これに欠けている鍵はこれでした:

https://github.com/drojdjou/bartekdrozdz.com/blob/master/static/src/framework/VirtualScroll.js

通常の JS スクロールは答えではありませんでした。私が書き直していたプロジェクトは、次のブログ投稿からアイデアを取り入れ、Ember で使用するためにそれらを適応させました (それを掘り下げるには、いくつかの深刻なコード考古学を行う必要がありました)。

http://www.everyday3d.com/blog/index.php/2014/08/18/smooth-scrolling-with-virtualscroll/

書き直しで同様のアプローチをとったところ、スクロールがスムーズになり、ロックが安定しました。

于 2021-01-18T16:57:51.573 に答える