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

推薦する

2013年のウェブデザインUIの最もホットなトレンド最も人気のあるUIデザイン

時は経つのが早く、わずか 6 日後には 2013 年が歴史になります。今年は、いわゆるトレンドが多す...

CentOS 8にdockerをインストールする最も詳細な方法

CentOS 8にDockerをインストールする公式ドキュメント: https://docs.doc...

CMD で MySQL データベースを操作するときに中国語の文字化けが発生する問題の解決方法

Baiduで検索しました。 。 chcp コマンドを使用して、cmd の文字エンコーディングを 65...

uniAppエディタWeChatスライド問題について

ユニアプリアプレットはWeChatでも同様のドロップダウン問題を抱えることになる解決策は、app.v...

MySQL 5.7.23 解凍バージョンのインストールチュートリアル(画像とテキスト付き)

毎回インストールチュートリアルを探すのは面倒なので、後で確認できるように手順をバックアップします。解...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

CSS初心者向けチュートリアル: 背景画像を画面全体に表示する

インターフェース全体に背景画像を表示したい場合は、当然 body に背景を追加することを考えます。コ...

Tomcatの各ポートの機能の詳細な説明

tomcat 設定ファイルから、tomcat の起動時にデフォルトで 8080 (8443)、800...

SQL重複排除方法の概要

SQL を使用してデータを抽出する場合、テーブル内で重複した値に遭遇することがよくあります。たとえ...

CentOS 7.2 は uniapp プロジェクトを展開するための nginx Web サーバーを構築します

Pantherは新人としてスタートし、今もまだ新人ですが、人々から学び、学んだことを時々皆さんと共有...

一般的なMySQLコマンドの概要

mysqlrootパスワードの設定と変更初めて MySQL データベースに入ります。 !環境変数にm...

JavaScript の基本変数

目次1. 変数の概要1.1 変数のメモリへの保存1.2 変数の使用1. 変数を宣言する2. 譲渡3....

MySQL 5.7.20 zip インストール チュートリアル

MySQL 5.7.20 zipインストール、具体的な内容は次のとおりです(1)圧縮パッケージを解凍...