カスタムスクロールバー効果を実現するJavaScript

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右のスクロール バーが表示されない場合があります。しかし、同じビューポートに 2 つのスクロール バーを表示する必要があります。

解決策の 1 つは、スクロール バーをカスタマイズして、元のスクロール バーを非表示にすることです。

カスタムスクロールバー

スクロールバー.js

React をインポートします。{ コンポーネント } から 'react' をインポートします。
'prop-types' から PropTypes をインポートします。
'../css/scrollbar.css' をインポートします。

定数propTypes = {
  イベントバス: PropTypes.object.isRequired、
};

クラスScrollBarはComponentを拡張します{

  コンストラクタ(props) {
    スーパー(小道具);
    この状態 = {
      ドラッグ中: false、
      // X: 下部スクロールバーの左オフセット、範囲 [0, innerWidth - 100]。ドラッグすると、x は変化します
      x: ヌル、
      // clickX は、スクロール バーをドラッグするときのスクロール バーの左側からマウスのクリック位置までの距離を示します。範囲は [0, 100] です。ドラッグすると、clickX は変化しません。
      クリックX: 0,
    };
  }

  コンポーネントマウント() {
    this.unsubscribeScrollToColumn = this.props.eventBus.subscribe('set-scrollbar-left', this.setScrollBarLeft);
    document.addEventListener('mouseup', this.onMouseUp);
  }

  コンポーネントのマウントを解除します(){
    this.unsubscribeScrollToColumn();
    document.removeEventListener('mouseup', this.onMouseUp);
  }

  /**
   * この関数はリンクを処理します (インターフェイスがスクロールすると、スクロールバーがスクロールします)。ここで 100 はスクロールバーの幅です */
  setScrollBarLeft = (左比率) => {
    // 下のスクロールバーがドラッグされている場合、スクロールバーを左に設定できません
    if (this.state.isDraging) が return;
    this.setState({
      x: (window.innerWidth - 100) * 左比率、
    });
  }

  /**
   * マウスが押されるとドラッグを開始し、現在の位置を最初のドラッグ位置に設定します*/
  ハンドルマウスダウン = (e) => {
    this.setState({
      ドラッグ中: true、
      クリックX: e.nativeEvent.offsetX、
    });
  }

  /**
   * マウスを離したらドラッグを止めて現在のクリック位置を 0 に設定します (これは必要ですか?)
   */
  マウスを離すと () => {
    if (this.state.isDraging) {
      タイムアウトを設定する(() => {
        this.setState({ isDraging: false, clickX: 0 });
      }, 100);
    }
  }

  /**
   * ドラッグ時(マウスが押されて動き始める)に、現在の変位を取得し、新しいオフセットを計算します * 注: 右にスクロールすることも、左にスクロールすることもできます * ドラッグ時には、現在の比率を計算し、グリッドを水平方向にスクロールする必要があります * 現在の問題は、ドラッグ中にマウスがスクロールバーの外側に移動すると、ドラッグをトリガーできないことです * */ 
  onMouseMove = (e) => {
    e.persist();
    if (this.state.isDraging) {
      // 新しい距離 = 元の距離 + (現在のスクロール距離 - 初期スクロール距離)
      newX = this.state.x + e.nativeEvent.offsetX - this.state.clickX とします。
      newX = Math.min(newX, window.innerWidth - 100); // 最大ドラッグは右の境界を超えることはできません this.setState({ x: newX });
      定数 leftRatio = newX / (window.innerWidth - 100);
    }
  }

  レンダリングボトムツールバー = () => {
    戻る (
      <div
        className="antiscroll-scrollbar antiscroll-scrollbar-horizo​​ntal antiscroll-scrollbar-shown"
        スタイル={{transform: `translateX(${this.state.x}px)`}}
        ドラッグ可能="true"
        onMouseDown={this.handleMouseDown}
        onMouseMove = {this.onMouseMove}
        onMouseUp={this.onMouseUp}
      </div>
    );
  }

  // todo: rightToolbar イベント ハンドル
  レンダリング右ツールバー = () => {
    戻る (
      <div
        className="アンチスクロールバー アンチスクロールバー垂直 アンチスクロールバー表示"
      </div>
    );
  }

  与える() {
    戻る (
      <div id="scrollOverlay" className="antiscroll-wrap">
        {this.renderBottomToolbar()}
        {this.renderRightToolbar()}
      </div>
    );
  }
}

スクロールバー.propTypes = propTypes;

デフォルトのScrollBarをエクスポートします。

スクロールバーのスタイル

対応する scrollbar.css

#スクロールオーバーレイ{
  表示: インラインブロック;
  オーバーフロー: 非表示;
  位置: 固定;
  左: 0;
  右: 0;
  上: 156px;
  下部: 0;
  zインデックス: 4;
  ポインタイベント: なし;
  不透明度: .7;
}

#スクロールオーバーレイ .antiscroll-scrollbar {
  ポインタイベント: 自動;
  zインデックス: 2;
  背景色: hsla(0,0%,0%,0.28);
  ボックスシャドウ: インセット 0 0 0 1px hsl(0,0%,100%);
  境界線の半径: 5px;
}

#スクロールオーバーレイ .antiscroll-スクロールバー-水平 {
  高さ: 12px;
  幅: 100ピクセル;
  位置: 絶対;
  下: 32px;
}

#スクロールオーバーレイ .antiscroll-スクロールバー-垂直 {
  幅: 12px;
  高さ: 100px;
  位置: 絶対;
  右: 0;
}

/* 元のスクロールオブジェクトのスクロールバーを非表示にする */
.react-demo::-webkit-スクロールバー{
  幅: 0;
}

スクロールバー特有の使用法

特定の用途のために、このスクロールバーをグリッドに追加します

'../components/scrollbar' から ScrollBar をインポートします。

// グリッドネイティブスクロール、コールバック関数をトリガー onScroll = () => {
  // todo: clientWidth が innerWidth より小さい場合は、下部のスクロールバーを表示しない
  scrollLeftRatio を this._scrollLeft / (clientWidth - window.innerWidth) とします。
  // ネイティブ DOM が左または右にスクロールすると、現在のスクロール比率 (オフセット/合計幅) を取得し、スクロールするスクロール バーを設定します。this.setScrollLeftRatio(scrollLeftRatio);
}

setScrollLeftRatio = (スクロール左比率) => {
  this.props.eventBus.dispatch('set-scrollbar-left', scrollLeftRatio);
}

// 元のスクロール要素では、イベント値の処理を容易にするために eventBus を渡します // <ScrollBar eventBus={this.props.eventBus}/>

カスタム スクロール バー用のオープン ソースのサードパーティ コンポーネントも多数あります。これらを実装するには、サードパーティ ライブラリを使用することをお勧めします (スクロール バーの計算には多くの考慮事項があります)。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScript を使用したスクロールバー イベントの詳細な説明
  • カスタムスクロールバー効果を実現するネイティブJS
  • JS カスタムスクロールバー効果の簡単な実装コード
  • JavaScript による範囲限定ドラッグとカスタム スクロール バー アプリケーション (3)
  • js スクロールバーのスムーズな動きの例コード
  • jQuery iScroll.js モバイルスクロールバープラグインの使い方を学ぶ
  • js/jqueryはブラウザウィンドウの表示領域の高さと幅、スクロールバーの高さを取得する実装コードです。
  • スクロールバーの下部を決定するJSコード
  • スクロールバーがページの一番下までスクロールしたと判断してイベントを実行する方法をJSで実装する
  • js 操作スクロールバーイベントの例

<<:  Linux環境変数ファイルの簡単な紹介

>>:  MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明

推薦する

Navicatを使用してクラウドサーバーデータベースにリモート接続する方法

秘密鍵を開かずにリモート サーバーのデータベースに接続するのは非常に便利です。新しい接続でデータを入...

MySQL SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...

Linuxで中断されたシステムを呼び出す方法

序文低速システム コールとは、決して戻らない可能性があり、プロセスを永久にブロックするシステム コー...

Vue3 コンパイルプロセス - ソースコード分析

序文: Vue3 がリリースされてからかなり経ちますが、最近、会社のプロジェクトでVue3 + Ty...

HTML iframe 使用状況の概要の収集

Iframe 使用状況の詳細な分析<iframe frameborder=0 width=17...

Win10 での MySQL 5.7 の詳細なインストールと設定のチュートリアル

1. MySQL 5.7を解凍する2. 新しい設定ファイルmy.iniを作成し、 D:\Free\m...

MySQLのトランザクションとデータ一貫性処理の問題を分析する

この記事では、セキュリティ、使用方法、同時処理などを通じて、MySQL トランザクションとデータの一...

MySQL で浮動小数点データを文字データに変換するときに起こりうる問題の詳細な説明

序文この記事は主に、MySQL で浮動小数点型を文字型に変換するときに発生する問題を紹介します。これ...

フロントエンドのパフォーマンス最適化 - フロントエンドエンジニアが話し合うべき問題点

はじめに<br />前回の記事「私の CSS アーキテクチャ コンセプト」では、公園で友...

MySQL 8.0.17 winx64 (Navicat 付き) 手動構成バージョンのインストール チュートリアル図

1. ダウンロードアドレス: mysql-8.0.17-winx64ダウンロードして解凍する2. フ...

ウェブデザインの概要

<br />1998年に最初の個人ページが誕生してから2008年の今日まで、デザイン業界...

Vue ルーティング this.route.push ジャンプ ページが更新されない場合の解決策

Vue ルーティング this.route.push ジャンプ ページが更新されない1. 背景概要:...

Linux 仮想マシンの IP アドレスを変更し、ゲートウェイを確認し、ネットワーク環境を構成する方法に関するチュートリアル

仮想マシンの IP アドレスを変更します。 次のインターフェイスに入り、サブネット IP を直接変更...

CSSは固定比率のブロックレベルコンテナを簡単に実装できる

H5 レイアウトを設計する場合、通常はバナーに遭遇することになります。例えば、2:1 で表示したい場...

HTMLハイパーリンクaタグのhrefジャンプとonclick間の実行順序の例

HTMLハイパーリンクaタグのhrefジャンプとonclickの実行関係htmlのaタグのhrefは...