ホームページ  >  に質問  >  本文

JavaScript は要素スタイルを使用するよりも CSS カスタム プロパティの更新が遅い: パフォーマンスの比較

vue 3 用のカレンダー スライダーを作成しました。このスライダーは、mousemove および touchmove イベントを使用してスライド アニメーションを実装し、いくつかの速度アニメーションを実行する関数も実装します。プロジェクトはここでテストできます: https://stackblitz.com/github/Der-Alex/vue-calendar-slider?file=src/components/VueCalendarSlider.vue

私の最初のアイデアは、CSS カスタム プロパティ --posx を使用してスライドの位置を保存することでした document.documentElement.style.setProperty('--posx', ${posx. value}px) );。スタイル セクションで、要素を移動するために transform:translate3d(var(--posx), 0, 0) を設定しました。次に、マウスアップ/タッチエンドで、スライダーがスライド速度に基づいてよりスライドするように、速度アニメーションを使用しました。

すべてが正常になった後、モバイル Chrome ブラウザでスライダーをテストしたところ、スライダーが非常に固着していることがわかりました。いくつか調べていじった結果、他のスライダーは element.style.transform = translation3d(${posx.value}px, 0, 0); を介して要素に直接変換属性を書き込んでいることがわかりました。これもやりました。変更後はスライダーのパフォーマンスが大幅に向上しました。

この動作をテストするには、src/components/VueCalendarSlider.vue ファイル内の次の行を編集できます: const testCssCustomProperties = ref(false); true に設定すると、 CSS カスタム プロパティ document.documentElement.style.setProperty から を記述します。 false に設定すると、element.style.transform が使用されます。

スタイルの変更が DOM を横断する可能性があることを知った後、変換する特定の要素に CSS カスタム プロパティを直接設定しましたが、それでもパフォーマンスは style.transform を使用するよりもはるかに悪くなります。

私の質問は次のとおりです。 document.documentElement.style.setProperty('--posx', ${posx.value}px); のパフォーマンスが element よりも優れている理由を誰か説明できますか。スタイルが大きく異なります。 transform = translation3d(${posx.value}px, 0, 0);? これは、JavaScript がこれらの部分を内部で処理する方法に関係していると思いますが、エンジンが element.style## を移動した可能性があります。 # コンテンツが GPU に転送され、document.documentElement.style は移動されません。しかし、具体的なものは何も見つかりません。

誰かが私に説明してくれることを願っています:)

P粉235202573P粉235202573286日前373

全員に返信(1)返信します

  • P粉299174094

    P粉2991740942024-01-08 00:47:47

    2022年9月13日更新

    Chrome Dev Tools を使用して別のパフォーマンス チェックを実行し、次の点を測定しました:

    図 1 は、このバリアントのマウスダウンとマウスアップの間のパフォーマンスを示しています。ここでは、element.style.transform を介して新しい clientX 位置を要素に直接書き込みます。

    図 2 は、同じイベントのパフォーマンスを示しています。ここでは、

    element.style.setProperty('--posx', ${posx.value}px); を通じて clientX の位置を CSS カスタム プロパティに書き込みます。 そこで私はさらに一歩進んで、

    element.style.setProperty('--posx', ${posx.value}px); を介して CSS カスタム プロパティを要素に直接書き込むようにコードを変更しました。

    。結果は図 2 と同じです。

    element.style.setProperty('transform',translate3d(${posx.value}px, 0, 0)); によって逆の方法でテストすると、clientX の位置を記述すると、図 1 と同じ結果が得られます。 。

    私が理解しているところによると、JavaScript 経由で CSS カスタム プロパティを変更すると、フレームごとにスタイルが強制的に再計算されますが、CSS プロパティの

    transform:translate3d

    を変更すると、再計算されません。 したがって、

    @S.Visser

    が正しいと思います。

    返事
    0
  • キャンセル返事