JSはモジュールの自動スクロール表示をどのようにエレガントに実現しますか

必要

ここ数日、大画面の視覚化プロジェクトに取り組んでいるときに、特定の領域にスクロール バーが表示されたときに、スクロールしてデータをループ表示させるという要件に遭遇しました。

もちろん、優れた開発として、最適化することもできます:マウスが配置されたら、自動スクロールを停止し、マウスを領域の外に移動して、再びスクロールを開始します。

達成

基本的な実装のアイデア

関数を実現する前に、3 つのパラメーターを理解する必要があります。

  • 視覚的な高さclientHeight
  • スクロールバーの上端からの高さscrollTop
  • スクロール領域の高さscrollHeight

上の図の情報によると、スクロール バーの自動スクロール ロジックを簡単に実装できます。

scrollHeightclientHeightより大きい場合要素をスクロールする必要あります

コードに変換:

// 获取滚动区域的DOM
let parentDom = document.getElementById("XXX")
// 判断是否有滚动条
if(parentDom.scrollHeight <= parentDom.clientHeight) return
// 如果滚动到底部,scrollTop = 0;
if (
  parentDom.scrollTop + parentDom.clientHeight ===
  parentDom.scrollHeight
) {
  parentDom.scrollTop = 0;
} else {
  // 滚动条自增
  parentDom.scrollTop++; 
}

もちろん、このロジックを繰り返し実行できるようにタイマーを設定する必要があります。

const scroll = () => {
  // 上述代码
};
let timer= setInterval(scroll, 100);

この時点で、私たちの基本的なアイデアは完成しています。プロジェクトにスクロールが必要な領域が複数ある場合は、このメソッドをカプセル化して再利用する必要があります。

コードのカプセル化と再利用

コードをカプセル化するための例として、主流の vue を取り上げてみましょう. 最も適切な方法は、 vue でコマンドとして使用することです.

以下のチュートリアルを読むには、vue コマンドの基本的な知識が必要です。vue公式 Web サイト のチュートリアルを参照できます。

命令の基本構造

まず、scroll.jsファイルを作成し、命令の最も基本的な構造を記述します。

// 实现滚动条自动滚动功能
const directive = {
  inserted(el, binding) {
    ...
  },
};
export default directive

このファイルを main.js に導入します

import Vue from "vue";
import App from "./App.vue";
import directive from "./change";

Vue.config.productionTip = false;
// 注册名为 scroll 的指令
Vue.directive("scroll", directive);
new Vue({
  render: (h) => h(App),
}).$mount("#app");

この時点で、 v-scrollというコマンドを作成し、直接使用します

// App.vue
<template>
  <div id="app" v-scroll>
    // XXXXX这里是您的自定义html
  </div>
</template>

完璧な命令

オリジナルの実装アイデアと組み合わせて、指示を改善できます

// js实现动态变化的数字
const directive = {
    
    
  inserted(el) {
    
    
    //el就是绑定的dom对象
    if (!el) return;
    const scroll = () => {
    
    
      let parentDom = el;
      // 判断是否有滚动条
      if(parentDom.scrollHeight <= parentDom.clientHeight) return
      //判断元素是否滚动到底部(可视高度+距离顶部=整个高度)
      if (
        parentDom.scrollTop + parentDom.clientHeight ===
        parentDom.scrollHeight
      ) {
    
    
        parentDom.scrollTop = 0;
      } else {
    
    
        parentDom.scrollTop++; // 元素自增距离顶部
      }
    };
    let timer = setInterval(scroll, 100);
};
export default directive;

これでコマンドの機能は完了です。もちろん、マウスがこの要素に移動すると、自動的に停止することはできず、この領域から離れても自動スクロールを再開できないという欠点があります。dom でonmouseenterおよびonmouseleaveイベントをバインドするだけで済みます。

inserted(el) {
    
    
      // .....
      let timer = setInterval(scroll, rate);
      el.onmouseenter = () => {
    
    
        clearInterval(timer);
        timer = null;
      };
      el.onmouseleave = function () {
    
    
        timer = setInterval(scroll, 100);
      };
    },
  },

値によるコマンド

さらに良いことに、要素に値を渡すことで、このスクロール速度をカスタマイズすることもできます。vue 命令フック関数の2 番目のパラメーターbinding.value は、パラメーターを受け入れることができます。

// App.vue
<template>
  <div id="app" v-scroll="100">
    // XXXXX这里是您的自定义html
  </div>
</template>

この時点で、binding.valueの値は100 であり、コードをさらに最適化します。

    inserted(el, binding) {
    
    
      const rate = binding?.value ??   100;
      if (!el) return;
      const scroll = () => {
    
    
        // ...省略
      };
      let timer: any = setInterval(scroll, rate);
      el.onmouseenter = () => {
    
    
        clearInterval(timer);
        timer = null;
      };
      el.onmouseleave = function () {
    
    
        timer = setInterval(scroll, rate);
      };
    },

あなたは終わった!!

読んで何か得したならワンクリックトリプルコンボ!

おすすめ

転載: blog.csdn.net/weixin_46769087/article/details/128298417