Vueはアンカー配置機能を実装します

Vueはアンカー配置機能を実装します

この記事では、アンカー配置を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は次のとおりです。

ここでは主に、スクロールによってトリガーされる単純なアンカー ポイントの強調表示を実装し、アンカー ポイントをクリックしてスクロール機能をトリガーします。ブラウザーのスクロールの高さを取得する場合は、ブラウザーごとに異なります。次の方法を使用します。

Chrome: document.body.scrollTop
Firefox: document.documentElement.scrollTop
Safari: window.pageYOffset

ここではローカル要素をスクロールしているので、少し異なります。まず、HTML と CSS のコード ブロックを添付します。

scroll-content はスクロール領域であり、operation-btn はアンカー ポイントの動作を制御するボタンです。

<テンプレート>
  <div class="アンカーポイント">
    <!-- スクロール領域 -->
    <div class="スクロールコンテンツ" @scroll="onScroll">
      <div class="scroll-item" style="height: 500px;background: #3a8ee6;">1つのレイヤー</div>
      <div class="scroll-item" style="height: 500px;background: red;">2階</div>
      <div class="scroll-item" style="height: 500px;background: #42b983">3 つのレイヤー</div>
      <div class="scroll-item" style="height: 1000px;background: yellow;">4 つのレイヤー</div>
    </div>
    <!-- ボタン -->
    <div class="操作-btn">
      <div v-for="(item, index) in ['1階','2階','3階','4階']" :key="index" @click="jump(index)"
           :style="{background: activeStep === index ? '#eeeeee' : '#ffffff'}">{{item}}
      </div>
    </div>
  </div>
</テンプレート>

<style lang="scss" スコープ>
  .アンカーポイント{
    フレックスベース: 100%;
    ディスプレイ: フレックス;
    オーバーフロー: 非表示;
    .スクロールコンテンツ{
      高さ: 100%;
      幅: 90%;
      オーバーフロー: スクロール;
    }
    .操作ボタン{
      幅: 10%;
      高さ: 100%;
    }
  }
</スタイル>

スクロールイベントをリッスンして、アンカーボタンを強調表示します

ここでは、スクロール項目をトラバースすることで、スクロールバーのスクロール距離が現在の項目のスクロール可能な距離(つまり、その offsetParent の上部からの距離、ここでは body)よりも大きいかどうかを判断します。

//スクロールトリガーボタンのハイライト onScroll (e) {
  scrollItems = document.querySelectorAll('.scroll-item') とします。
  (let i = scrollItems.length - 1; i >= 0; i--) {
    //スクロールバーのスクロール距離が現在のスクロール項目のスクロール可能な距離より大きいかどうかを判断します。let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop
    (判断)の場合{
      this.activeStep = i
      壊す
    }
  }
},

クリックイベントを追加し、アンカーポイントに応じて対応する領域までスクロールし、スムーズなスクロールを実現します。

ここでは、インターネット上の方法を参考に、スクロール距離を複数の小さなセグメントに分割し、上方向下方向のスクロールを考慮してスクロール遷移アニメーションを実現します。
当初は、スクロールアニメーションを実装するために scrollIntoView を使用する予定でした。scrollIntoView はさまざまなブラウザで適切にサポートされていますが、ScrollIntoViewOptions はブラウザの互換性にまだ問題があるため、代わりに次の距離分割方法を使用しました。

// クリックするとアンカーポイントが切り替わります。ジャンプ(インデックス){
 ターゲットを document.querySelector('.scroll-content') にします。
 scrollItems = document.querySelectorAll('.scroll-item') とします。
 // スクロールバーが下までスクロールしたかどうかを判定します。if (target.scrollHeight <= target.scrollTop + target.clientHeight) {
   this.activeStep = インデックス
 }
 let total = scrollItems[index].offsetTop - scrollItems[0].offsetTop // アンカー要素とその offsetParent (ここでは body) の上端間の距離 (スクロールする距離)
 let distance = document.querySelector('.scroll-content').scrollTop // スクロールバーとスクロール領域の上端の間の距離 // let distance = document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset // スクロールバーとスクロール領域の上端の間の距離 (スクロール領域はウィンドウです)
 // スクロールアニメーションの実装。setTimeout 再帰を使用してスムーズなスクロールを実現し、距離を 50 の小さなセグメントに分割し、10 ミリ秒ごとに 1 回スクロールします。// 各小さなセグメントの距離を計算します。let step = total / 50
 (合計>距離)の場合{
   スムーズダウン(document.querySelector('.scroll-content'))
 } それ以外 {
   newTotal = 距離 - 合計
   ステップ = 新しい合計 / 50
   スムーズアップ(document.querySelector('.scroll-content'))
 }

 // パラメータ要素はスクロール領域です function SmoothDown (element) {
   (距離 < 合計)の場合{
     距離 += ステップ
     element.scrollTop = 距離
     タイムアウトを設定します(smoothDown.bind(this, 要素), 10)
   } それ以外 {
     element.scrollTop = 合計
   }
 }

 // パラメータ要素はスクロール領域です function SmoothUp (element) {
   (距離>合計)の場合{
     距離 -= ステップ
     element.scrollTop = 距離
     タイムアウトを設定します(smoothUp.bind(this, 要素), 10)
   } それ以外 {
     element.scrollTop = 合計
   }
 }

 // document.querySelectorAll('.scroll-item').forEach((item, index1) => {
 // if (インデックス === インデックス1) {
 // item.scrollIntoView({
 // ブロック: '開始',
 // 動作: 'スムーズ'
 // })
 // }
 // })
}

効果図は次のとおりです。

アンカー ポイントの配置とスクロール ハイライト アンカー ポイントの効果を実装したのは今回が初めてです。いくつか欠点があります。質問や提案があれば、ご指摘ください。
この記事によってもたらされたインスピレーションに非常に感謝しており、新たな知識を得ることができました。

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

以下もご興味があるかもしれません:
  • Vue スライディング天井とアンカー配置のサンプル コード
  • Vue はスクロールを監視してアンカーの配置を実現します (双方向) 例
  • Vue プロジェクトでのアンカー配置の代替方法
  • Vueプロジェクトにおけるアンカー配置の詳細な説明
  • Vue+element ui はアンカーの配置を実現します

<<:  Nginx Rewriteモジュールを使用するいくつかのシナリオ

>>:  MySql 学習 3 日目: データ テーブル間の接続とクエリの詳細

推薦する

Apache Log4j2 が核レベルの脆弱性と迅速な修正を報告

Apache Log4j2 が核レベルの脆弱性を報告し、スタックリーダーの友人たちは大騒ぎになりまし...

Linux システムで MySQL の文字セットを UTF8 に変更する手順

目次1. データベース内の MySQL ステータスを確認します。 2. 設定ファイルを変更します。 ...

MySQL ページングの制限パラメータの簡単な例

Mysqlページングの2つのパラメータ ユーザー制限 1,2 から * を選択 1 は検索する最初の...

Web デザインにおける Less と More について語る (写真)

Less is More は多くのデザイナーのキャッチフレーズです。これは建築界の巨匠ルートヴィヒ...

Vue は携帯電話の認証コードによるログインを実装します

この記事では、携帯電話認証コードログインを実装するためのVueの具体的なコードを参考までに共有します...

テーブルを使用する場合と CSS を使用する場合 (経験の共有)

TW のメインテキスト ページは、以前は小さなモニターと低解像度のユーザーを考慮して幅が 850 ピ...

Docker を使用して Jenkins をインストールするためのサンプル コード

Dockerコンテナのインストール時に遭遇しやすい2つの問題1.ポートはすでに割り当てられています(...

Vueは虫眼鏡付きの検索ボックスを実装します

この記事では、Vueを使用して虫眼鏡付きの検索ボックスを実装する方法を紹介します。具体的な内容は次の...

ウェブページ入力ボックスのスタイルトリガー効果

<br />この例では、主に onblur と onFocus という 2 つのパラメー...

WeChat アプレットのカスタム タブバー コンポーネント

この記事では、WeChatアプレットのカスタムタブバーコンポーネントの具体的なコードを参考までに紹介...

Tomcat の maxPostSize 設定に関する問題と注意事項

1. maxPostSize を設定する理由は何ですか? tomcat コンテナには送信データのサイ...

MongoDBのパフォーマンスを向上させる方法

MongoDB は高性能なデータベースですが、使用していくうちにパフォーマンスの問題が発生することが...

VPS はオフライン ダウンロード サーバーを構築します (ネットワーク ディスクの時代以降)

モチベーション学習の必要性から、海外のサーバーメーカー(どこのメーカーかは言いません)のVPSサービ...

jsは古典的なマインスイーパゲームを実装します

この記事の例では、古典的なマインスイーパゲームを実装するためのjsの具体的なコードを参考までに共有し...

CSS3 天子グリッドリストのスタイルの書き方

多くのプロジェクトでは、中央に灰色の分割線があり、両側に分割線がないグリッド表示の機能を実装する必要...