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をインストールする方法

推薦する

Vueコンポーネント通信方法事例まとめ

目次1. 親コンポーネントが子コンポーネントに値を渡す(props) 2. サブコンポーネントは親コ...

Linuxにソフトウェアをインストールするいくつかの方法の詳細な説明

1. RPM パッケージのインストール手順: 1. soft.version.rpm などの対応する...

Nginx 急ぎ購入 電流制限構成 実装分析

ビジネス上のニーズにより、急ぎの購入が発生することが多いため、ロード バランシング フロント エンド...

Linux システムを起動時に自動的にスクリプトを実行するように設定する方法の例

序文みなさんこんにちは。私は梁旭です。職場では、システムの起動後にスクリプトやサービスを自動的に開始...

htmlハイパーリンクaのクリックイベントの後、hrefで指定されたアドレスにジャンプします。

場合によっては、ジャンプを完了するために href の代わりにハイパーリンク <a> を...

EXPLAIN コマンドの詳細な説明と MySQL での使用方法

1. シナリオの説明: 同僚から MySQL で explain を使用する方法を教わったので、返さ...

WIN10 に複数のデータベースがインストールされている場合にコンピュータの速度低下を防ぐ方法

必要なときにサービスを有効にし、必要がないときは無効にします。データベース サービスを管理する方法:...

HTML 基本要約推奨事項 (テキスト形式)

HTMLテキスト書式タグ 標簽 描述 <b> 定義粗體文本 <em> 呈現...

deepin20 で NVIDIA クローズドソース ドライバーをインストールするための詳細な手順

ステップ1: ディープ「グラフィックドライバー」をインストールするdeepin v20にはデフォルト...

HTMLはマウスをホバーしたときにテキストを表示するためにtitle属性を使用します。

コードをコピーコードは次のとおりです。 <a href=# title="ここに表示...

Viteプロジェクトを作成する手順

目次序文yarn create は何をしますか?ソースコード分析プロジェクトの依存関係テンプレート構...

mysql ERROR 1045 (28000) 問題の解決方法

私はmysql ERROR 1045に遭遇し、この問題に長い時間を費やしました。私はそれを自分で書き...

Nginx ロケーション設定(ロケーションのマッチング順序)の詳細な説明

ロケーションは「位置指定」を意味し、主にさまざまな位置指定のための URI に基づいています。これは...

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...