について最近、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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CentOS7 で MySQL 5.7.24 をコンパイルしてインストールする詳細なチュートリアル
<meta name="viewport" content="...
みなさんこんにちは。私は梁旭です。ご存知のとおり、Linux ではデバイス ファイルも含めすべてがフ...
目次序文実装のアイデア実装手順1. Nginxをコンパイルする2. 設定ファイルは以下のとおりです要...
目次Web コンテナとは何ですか? HTTP の性質HTTP リクエスト応答の例クッキーとセッション...
以下のように表示されます。上記のように、置き換えるだけです。 Python3.6-MySql でファ...
モバイル アプリを開発する場合、Web サイトが特定の高さまでスクロールしたときにコンテンツの一部を...
1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...
nginx 設定ファイルは主に 4 つの部分に分かれています。 main{#(グローバル設定) ht...
目次1. 電流制限アルゴリズム2. nginxの基礎知識4. 実戦要約する高並行性システムには、キャ...
1. VMware 15.5で新しい仮想マシンを作成する1. VMware を開き、ホームページで「...
MySQLのパーティショニングは、非常に大きなテーブルを管理するのに役立ちます。MySQLのパーティ...
序文この世の愛には値段のつくものもありますが、データには値段のつけられないものがあります。将来、誤っ...
序文最近、仕事の都合で、APP ショッピングカートの注文支払いに取り組んでいました。テスト中にバグが...
目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...
目次最初に要約: 🌲🌲 序文: 🍬🍬公開🍬🍬 🍬🍬グローバル🍬🍬 🍬🍬ボールボックス🍬🍬 🎉🎉🎉結論...