Vue の better-scroll コンポーネントを使用して水平スクロール機能を実現する

Vue の better-scroll コンポーネントを使用して水平スクロール機能を実現する

について

最近、Vue を学習する過程で、基本的な知識の練習と強化を目的として、Qunar.com のモバイル版を模倣した小さなプロジェクトを作成しました。しかし、今日、Qunar のホームページにユーザー エクスペリエンスの悪いコンポーネントがあることを発見しました。つまり、水平リストはブラウザーのネイティブ スクロールを使用して実装されています。リストのスクロールはかなりぎこちなく不快なので、このコンポーネントを better-scroll で書き直すことにしました。

better-scrollの紹介

Better-scroll は、Huang Yi (そう、私の先輩です) が作成した i-scroll をベースにしたスクロール コンポーネントです。プロジェクト アドレス: https://github.com/ustbhuangyi/better-scroll

1. スクロールの実装原理

better-scroll のスクロール原理は、ブラウザのネイティブスクロール原理と同じです。子ボックスの高さが親ボックスの高さより大きい場合、垂直スクロールが発生します。

同様に、子ボックスの幅が親ボックスの幅よりも大きい場合は、水平スクロールが発生します (基本原則)。

2. Vueでbetter-scrollを使用する

Vue で better-scroll を使用する際に注意すべき最も重要な点は、BScroll のインスタンス化を実行する前に、ページのレンダリングが完了するまで待つ必要があることです。これは、better-scroll がスクロール可能かどうかを計算するためにスクロール領域のサイズと親ボックスのサイズを取得する必要があるため、Vue のライフサイクルをある程度理解している必要があるためです。

ここに小さなデモがあります。このデモを通して、better-scrollの使い方を学びます。

<テンプレート>
  <div class="wrapper" ref="wrapper"> // Vue で DOM 要素を取得する最も簡単な方法は、this.$refs を使用することです。
    <ul class="content">
      <li>...</li>
      <li>...</li>
      ...
    </ul>
  </div>
</テンプレート>
<スクリプト>
  import BScroll from 'better-scroll' //better-scrollをインポート
  エクスポートデフォルト{
    マウント() {
      this.$nextTick(() => { // this.$nextTick を使用して、コンポーネントがレンダリングされていることを確認します this.scroll = new Bscroll(this.$refs.wrapper, {}) // BScroll をインスタンス化し、2 つのパラメータを受け入れます。最初のパラメータは親ボックスの DOM ノードです})
    }
  }
</スクリプト>

3. Vueで水平スクロールを実装する

1. レンダリングの比較

ネイティブスクロールを使用する:

better-scroll を使用します:

2. コード(コメントを参照)

<テンプレート>
  <div class="recommand-wrap">
    <div class="title">
      <img class="title-img" src="https://imgs.qunarzz.com/piao/fusion/1711/16/bfbb9874e8f11402.png" alt="今週のホットリスト">
      <span class="title-hotrec">今週のホットリスト</span>
      <span class="title-allrec">すべてのチャート</span>
    </div>
    <div ref="wrapper"> /* これは親ボックスです*/
      <ul class="cont" ref="cont"> /* これは子ボックス、スクロール領域です*/
        <li class="cont-item" v-for="recommendList のアイテム" :key="item.id">
          <div class="cont-img">
            <img class="img" :src="item.url" :alt="item.text">
          </div>
          <div class="cont-dest">{{item.text}}</div>
          <div class="cont-price">
            <span class="price">¥{{item.price}}</span>
            <span>開始</span>
          </div>
        </li>
      </ul>
    </div>
  </div>
</テンプレート>

<スクリプト>
'better-scroll' から BScroll をインポートします

エクスポートデフォルト{
  名前: 'HomeRecommand',
  小道具: {
    推奨リスト: {
      タイプ: 配列、
      必須: true
    }
  },
  コンポーネント:

  },
  データ () {
    戻る {

    }
  },
  メソッド: {
    verScroll() {
      let width = this.recommendList.length * 110 // スクロール領域のサイズを動的に計算します。前述のように、スクロールする理由は、スクロール領域の幅が親ボックスの幅よりも大きいためです。this.$refs.cont.style.width = width + 'px' // スクロール領域の幅を変更します。this.$nextTick(() => {
        スクロールすると
          this.scroll = 新しいBScroll(this.$refs.wrapper, {
            startX: 0, // 設定の詳細については、better-scroll の公式ドキュメントを参照してください。ここでは詳細には触れません。click: true,
            スクロールX: true、
            スクロールY: false、
            イベントパススルー: '垂直'
          })
        } そうでなければ{
          this.scroll.refresh() //DOM構造が変更された場合にこのメソッドを呼び出します}
      })
    }
  },
  マウントされた(){
    this.$nextTick(() => {
      let timer = setTimeout(() => { // 実際には、このタイマーも書きたくありません。これは、$nextTick の別のレイヤーをネストするのと同じですが、if (timer) { の場合は失敗します。
          タイムアウトをクリア(タイマー)
          this.verScroll()
        }
      }, 0)
    })
  }
}
</スクリプト>

<style lang="scss" スコープ>
  .recommand-wrap {
    高さ: 0;
    パディング下部: 50%;
    上マージン: .2rem;
    背景: #fff;
    左パディング: .24rem;
    幅: 100%;
    。タイトル {
      位置: 相対的;
      高さ: 40px;
      ディスプレイ: フレックス;
      パディング: 12px 0;
      ボックスのサイズ: 境界線ボックス;
      .title-img {
        幅: 15px;
        高さ: 15px;
      }
      .title-hotrec {
        フォントサイズ: 16px;
        左マージン: 4px;
      }
      .title-allrec {
        位置: 絶対;
        パディング上部: 2px;
        フォントサイズ: 13px;
        右: 20px;
        色: グレー;
      }
    }
    .続き{
      リストスタイル: なし;
      // オーバーフローx: スクロール;  
      空白: ラップなし;
      フォントサイズ: 12px;
      テキスト配置: 中央;
      右パディング: .24rem;
      .cont-item {
        位置: 相対的;
        表示: インラインブロック;
        パディング: .06rem 0 .2rem;
        幅: 2rem;
        マージン: 0.1rem;
        .cont-img {
          オーバーフロー: 非表示;
          幅: 2rem;
          高さ: 0;
          パディング下部: 100%;
          .img {
            幅: 100%;
          }
        }
        .cont-dest {
          マージン: .1rem 0;
        }
        .cont-price {
          。価格 {
            色: #ff8300;
          }
        }
      }
    }
  }
</スタイル>

参考リンク

著者: 黄毅

リンク: https://zhuanlan.zhihu.com/p/27407024

要約する

これで、Vue の better-scroll コンポーネントを使用して水平スクロールを実装する方法についての記事は終了です。Vue better-scroll の水平スクロールに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueはマーキースタイルのテキストの水平スクロールを実装します
  • Vue は better-scroll を使用して水平スクロール方法の例を実現します
  • Vueは、テキストが幅を超えたときに水平スクロールするようにマーキータグを置き換えます。
  • Vue でメッセージが水平方向にスクロールすると setInterval がクリアされない問題と解決策
  • Vue.js+cube-ui(スクロールコンポーネント)は、見出し効果に似た水平スクロールナビゲーションバーを実現します。
  • 掲示板のテキストを上下にスクロールする効果を実現するVueサンプルコード
  • Vueはスクロールイベントを監視してスクロール監視を実装します
  • Vue.js の実践: スクロール イベントをリッスンして動的アンカー ポイントを実装する
  • メッセージのシームレスなスクロール効果を実現する Vue のサンプルコード
  • Vue で画面横スクロールアナウンス効果を実現

<<:  CentOS7 で MySQL 5.7.24 をコンパイルしてインストールする詳細なチュートリアル

>>:  Win10にnginxをインストールする方法

推薦する

役に立つメタ設定方法(必読)

<meta name="viewport" content="...

Linuxシステムにおける仮想デバイスファイルのさまざまな実用的な使用法の詳細な説明

みなさんこんにちは。私は梁旭です。ご存知のとおり、Linux ではデバイス ファイルも含めすべてがフ...

Nginx の純粋な構成でリアルタイム ログ レポートを実現するためのアイデアと方法

目次序文実装のアイデア実装手順1. Nginxをコンパイルする2. 設定ファイルは以下のとおりです要...

Tomcat コアコンポーネントとアプリケーションアーキテクチャの詳細な説明

目次Web コンテナとは何ですか? HTTP の性質HTTP リクエスト応答の例クッキーとセッション...

Python3.6-MySql 挿入ファイルパス、バックスラッシュをなくす解決策

以下のように表示されます。上記のように、置き換えるだけです。 Python3.6-MySql でファ...

CSSの固定位置属性の詳細な説明

モバイル アプリを開発する場合、Web サイトが特定の高さまでスクロールしたときにコンテンツの一部を...

DOCTYPE要素詳細説明完全版

1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...

nginx設定ファイルの解釈の詳細な説明

nginx 設定ファイルは主に 4 つの部分に分かれています。 main{#(グローバル設定) ht...

Nginx ソースコード調査における nginx 電流制限モジュールの詳細な説明

目次1. 電流制限アルゴリズム2. nginxの基礎知識4. 実戦要約する高並行性システムには、キャ...

VMware 15.5 に CentOS7 をインストールするためのグラフィック チュートリアル

1. VMware 15.5で新しい仮想マシンを作成する1. VMware を開き、ホームページで「...

Navicat による MySQL パーティショニングの実践

MySQLのパーティショニングは、非常に大きなテーブルを管理するのに役立ちます。MySQLのパーティ...

MySQL スケジュール バックアップ ソリューション (Linux crontab を使用)

序文この世の愛には値段のつくものもありますが、データには値段のつけられないものがあります。将来、誤っ...

MYSQLは、ショッピングカートに追加する際に重複追加を防ぐためのサンプルコードを実装します。

序文最近、仕事の都合で、APP ショッピングカートの注文支払いに取り組んでいました。テスト中にバグが...

Dockerを使用してJenkinsをインストールする方法

目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...

Vue3 を使用してポップアップ コンポーネントをカプセル化するのは簡単ですか?

目次最初に要約: 🌲🌲 序文: 🍬🍬公開🍬🍬 🍬🍬グローバル🍬🍬 🍬🍬ボールボックス🍬🍬 🎉🎉🎉結論...