階段効果を実現するためのWeChatアプレットカスタムメニューナビゲーション

階段効果を実現するためのWeChatアプレットカスタムメニューナビゲーション

設計意図

ページを開発する際には、ページ上のナビゲーション メニューをクリックしたときにページを対応する位置までスクロールしたり、メニュー オプションを強調表示するためにページをスクロールしたりする必要があることがよくあります。 HTML 開発では、a タグ アンカー実装を使用し、それを jq アニメーションと組み合わせて同様の効果を実現できます。フレームワークでは、vant UI フレームワークもこの効果を実現します。

WeChatミニプログラムを実装するには? ?

エフェクト表示

  • メニューナビゲーションがページの上部までスクロールすると、メニューが動かなくなる
  • メニューボタンをクリックすると、対応する領域に切り替わります(アニメーション効果でこの領域に遷移します)
  • コンテンツ領域が特定の領域までスクロールすると、対応する領域のメニューボタンが強調表示されます。

デザインのアイデア

1.天井効果の実現

  • メニューナビゲーションとページ上部の間の距離を取得しますwx.createSelectorQuery()
  • ページスクロール監視
  • スクロール距離をメニューの初期位置と比較する

1) 距離

定数クエリ = wx.createSelectorQuery()
query.select('.menu_nav').boundingClientRect(function(res) {
    obj = {} とします
    (res && res.top)の場合{
        obj[item.attr] = parseInt(res.top)
    }
}).exec()

①wx.createSelectorQuery()
SelectorQuery オブジェクト インスタンスを返します。カスタム コンポーネントまたはカスタム コンポーネントを含むページでは、代わりに this.createSelectorQuery() を使用する必要があります。

②SelectorQuery.select(文字列セレクタ)
現在のページでセレクター セレクターに一致する最初のノードを選択します。ノード情報を取得するために使用できる NodesRef オブジェクト インスタンスを返します。

セレクタ構文
セレクターは CSS セレクターに似ていますが、次の構文のみをサポートします。

財産タイプ例示する
idノードID
データセット物体ノードデータセット
番号ノードの左端の座標
番号ノードの右端の座標
トップ番号ノードの上限座標
番号ノードの下限座標
番号ノードの幅
身長番号ノードの高さ

③NodesRef.boundingClientRect(関数コールバック)
ノードのレイアウト位置のクエリ要求を追加します。表示領域に対する相対値(ピクセル単位)。その機能は DOM の getBoundingClientRect に似ています。 NodesRef に対応する SelectorQuery を返します。

プロパティ タイプ 説明 id string ノードのID データセット ノードのオブジェクトデータセット left number ノードの左境界座標 right number ノードの右境界座標 top number ノードの上限境界座標 bottom number ノードの下限境界座標 width number ノードの幅 height number ノードの高さ

④SelectorQuery.exec(関数コールバック)
すべてのリクエストを実行します。リクエストの結果は、要求された順序で配列に整理され、コールバックの最初のパラメータで返されます。

2) ページスクロール監視

  • データで初期化 -- tabFixed=false (固定位置かどうかを示します)
  • スクロールバーのスクロール距離がメニューの初期距離を超えると、 tabFixed=true位置決めがオンになります。
// ページスクロールを監視する onPageScroll: function(e) {
    hTop = parseInt(e.scrollTop) とします。
        // メニューを上部に配置する必要があるかどうか if (hTop > this.data.menu_top) {
        this.setData({
            タブ固定: true
        })
    } それ以外 {
        this.setData({
            タブ固定: false
        })
    }
}

onPageScroll(オブジェクトオブジェクト))
ユーザー ページのスライド イベントをリッスンします。

ParametersObject オブジェクト:

財産タイプ例示する
スクロールトップ番号ページが垂直方向にスクロールした距離(ピクセル単位)

注意:このメソッドは必要な場合にのみページで定義し、空のメソッドを定義しないでください。レンダリング層とロジック層の通信における不要なイベントディスパッチの影響を軽減します。 注意: ロジック レイヤーとレンダリング レイヤー間の通信を引き起こす setData などの操作を onPageScroll で頻繁に実行しないようにしてください。特に、毎回大量のデータを送信する場合は、通信時間に影響を及ぼします。

2. 対応するエリアに切り替える

  • 現在クリックされているメニューを記録して強調表示します
  • ページ上部から各エリアの初期距離を取得します
  • 現在のページのスクロールバーの位置を設定し、遷移時間を設定します

// ナビゲーションバースイッチ設定 setSelectType(event) {
    インデックス = event.currentTarget.dataset.type
    this.setData({
        tabIndex: インデックス、
    })
    arr = ['panel1_top', 'panel2_top', 'panel3_top', 'panel4_top'] とします。
    _this = this とします
    wx.pageScrollTo({
        スクロールトップ: _this.data[arr[index]],
        所要時間: 500
    })
},

wx.pageScrollTo(オブジェクトオブジェクト)
ページを目的の位置までスクロールします。セレクターとスクロール距離の2つの位置決め方法をサポートしています。

財産タイプデフォルト値必須例示する
スクロールトップ番号なしいいえページのターゲット位置までスクロールします(ピクセル単位)
間隔番号300いいえスクロールアニメーションの継続時間(ミリ秒)
セレクタなしいいえセレクタ 2.7.3
成功関数なしいいえインターフェース呼び出し成功時のコールバック関数
失敗関数なしいいえインターフェース呼び出し失敗時のコールバック関数
完了塗油なしいいえインターフェース呼び出しの終了時のコールバック関数(呼び出しが成功または失敗した場合に実行されます)

3)特定のエリアまでスクロールすると、対応するエリアのメニューボタンがハイライト表示されます。

エリアと上部の間の初期距離を取得します

arr = [とする
         { 名前: '.menu-nav', 属性: 'menu_top', addNum: 0 },
         { 名前: '.panel1'、 属性: 'panel1_top'、 addNum: 0 }、
         { 名前: '.panel2'、 属性: 'panel2_top'、 addNum: 0 },
         { 名前: '.panel3'、 属性: 'panel3_top'、 追加数: 0 }、
         { 名前: '.panel4'、 属性: 'panel4_top'、 追加数: 0 }、
     ]
     arr.forEach((item, i) => {
         wx.createSelectorQuery().select(item.name).boundingClientRect(function(res) {
             obj = {} とします
             (res && res.top)の場合{
                 obj[item.attr] = parseInt(res.top)

                 if (item.addNum) {
                     obj[item.attr] += item.addNum
                 }
                 that.setData({
                     ...オブジェクト
                 })
             }

         }).exec()

     })

スクロールが領域を超えていないか確認する

// ページスクロールを監視する onPageScroll: function(e) {
     hTop = parseInt(e.scrollTop) とします。
     // メニューを自動的に切り替える let tab=0
      hTop >= (this.data['panel4_top'] - this.data.menu_top) の場合 {
        タブ=3
     }それ以外の場合、hTop >= (this.data['panel3_top'] - this.data.menu_top)){
        タブ=2
     }
     そうでない場合、(hTop >= (this.data['panel2_top'] - this.data.menu_top)){
         タブ=1
     }
     this.setData({
         タブインデックス: タブ、
     })
 },

完全なコード

インデックス

// ページ/インデックス/index.js
ページ({

  /**
   * ページの初期データ */
  データ: {
    tabIndex: 0, //現在のメニュー menuList: ['メニュー 1', 'メニュー 2', 'メニュー 3', 'メニュー 4'], //ナビゲーションメニュー tabFixed: false, //配置するかどうか//初期ページの上端からの距離 menu_top: 0,
    パネル1_トップ: 0,
    パネル2_トップ: 0,
    パネル3_トップ: 0,
    パネル4_トップ: 0,
  },

  /**
   * ライフサイクル機能 - ページの読み込みをリッスンする*/
  onLoad: 関数 (オプション) {

  },
  onShow:function (オプション){
    this.getTopDistance()
  },
  // ページ上部からの高さを取得する getTopDistance() {
    それを = これとする
    arr = [{
        名前: '.menu-nav',
        属性: 'menu_top',
        追加数: 0
      },
      {
        名前: '.panel1',
        属性: 'panel1_top',
        追加数: 0
      },
      {
        名前: '.panel2',
        属性: 'panel2_top',
        追加数: 0
      },
      {
        名前: '.panel3',
        属性: 'panel3_top',
        追加数: 0
      },
      {
        名前: '.panel4',
        属性: 'panel4_top',
        追加数: 0
      },
    ]
    arr.forEach((item, i) => {
      wx.createSelectorQuery().select(item.name).boundingClientRect(function (res) {
        obj = {} とします
        (res && res.top)の場合{
          obj[item.attr] = parseInt(res.top)

          if (item.addNum) {
            obj[item.attr] += item.addNum
          }
          that.setData({
            ...オブジェクト
          })
        }

      }).exec()

    })
  },
  // ナビゲーションバースイッチ設定 setSelectType(event) {
    インデックス = event.currentTarget.dataset.type
    this.setData({
      tabIndex: インデックス、
    })
    arr = ['panel1_top', 'panel2_top', 'panel3_top', 'panel4_top'] とします。
    _this = this とします
    wx.pageScrollTo({
      スクロールトップ: _this.data[arr[index]],
      所要時間: 500
    })
  },
  // ページスクロールを監視する onPageScroll: function (e) {
    hTop = parseInt(e.scrollTop) とします。

    // メニューを上部に配置する必要があるかどうか if (hTop > this.data.menu_top) {
      this.setData({
        タブ固定: true
      })
    } それ以外 {
      this.setData({
        タブ固定: false
      })
    }

    // メニューを自動的に切り替える if (hTop >= (this.data['panel4_top'] - this.data.menu_top)) {
      this.setData({
        タブインデックス: 3,
      })
    }それ以外の場合、hTop >= (this.data['panel3_top'] - this.data.menu_top)){
      this.setData({
        タブインデックス: 2,
      })
    }
    そうでない場合、(hTop >= (this.data['panel2_top'] - this.data.menu_top)){
      this.setData({
        タブインデックス: 1,
      })
    }それ以外{
      this.setData({
        タブインデックス: 0,
      })
    }
  },
})

インデックス.wxml

<view class="メイン">
    <view class="head">
        私は頭の部分です</view>
    <view class="{{tabFixed?'is-fixed':''}} メニューナビ">
        <text wx:for="{{menuList}}" class="{{tabIndex==index?'is-select':''}}" bind:tap="setSelectType" data-type='{{index}}'>{{item}}</text>
        
    </ビュー>
    <view class="content">
        <view class="panel1 panel">ページ 1</view>
        <view class="panel2 panel">ページ 2</view>
        <view class="panel3 panel">ページ 3</view>
        <view class="panel4 panel">ページ 4</view>
    </ビュー>
</ビュー>

インデックス.wxss

.メニューナビ{
  ディスプレイ: フレックス;
  アイテムの位置を中央揃えにします。
  コンテンツの両端揃え: スペースを空ける;
  色: 黒;
  パディング: 10px 0;
  幅: 100%;
  背景色: 白;
}

.is-select {
  色: 赤;
}

。頭 {
  ディスプレイ: フレックス;
  アイテムの位置を中央揃えにします。
  コンテンツの中央揃え: 中央;
  フォントサイズ: 40px;
  高さ: 120px;
  背景色: 緑黄色;
}

.is-fixed {
  位置: 固定;
  上: 0;
}

.パネル{
  ディスプレイ: フレックス;
  アイテムの位置を中央揃えにします。
  コンテンツの中央揃え: 中央;
  フォントサイズ: 20px;
}

.パネル1 {
  高さ: 800rpx;
  背景色: レベッカ紫;
}

.パネル2 {
  高さ: 700rpx;
  背景色: 青;
}

.パネル3 {
  高さ: 1000rpx;
  背景色: オレンジ;
}

.パネル4 {
  高さ: 1200rpx;
  背景色: ピンク;
}

これで、WeChatミニプログラム-カスタマイズされたメニューナビゲーション(階段効果の実現)に関するこの記事は終わりです。WeChatミニプログラムのカスタマイズされたメニューナビゲーションの関連コンテンツについては、123WORDPRESS.COMで以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • WeChat アプレット MUI サイドスライド ナビゲーション メニューの例 (ポップアップ ポップアップ、左にスライド、右には移動しない)
  • WeChat ミニプログラム MUI サイドスライドナビゲーションメニューの例 (ポップアップポップアップ、左側固定、右側スライド)

<<:  MySQLのスケジュールタスクが正常に実行できない原因の分析と解決

>>:  HTML で中国語を UTF-8 に変換する方法

推薦する

一般的な Linux ディストリビューションのミラーソース構成の概要

最近 Linux を研究していて、いくつかの Linux ディストリビューションを試してみましたが、...

ウェブ開発者やデザイナーにとって欠かせないオンラインウェブツールとアプリケーション

これまでの記事で、フロントエンド開発者にとって必須のツール、スクリプト、リソースのコレクションを紹介...

Ubuntu 16.04.5LTS に SVN をインストールする手順

この記事では、UbuntuシステムでSVNを設定するプロセスを簡単に紹介します。ソースを更新sudo...

イントラネット侵入を実現するためのSSHポート転送

LAN 内のマシンは外部ネットワークにアクセスできますが、外部ネットワークは内部ネットワークにアクセ...

MySQL マスタースレーブ同期の原理と応用

目次1. マスタースレーブ同期原理マスタースレーブ同期アーキテクチャ図(非同期同期)マスタースレーブ...

jQueryはシャトルボックス効果を実現します

この記事では、シャトルボックス効果を実現するためのjQueryの具体的なコードを参考までに紹介します...

Docker5フル機能の港湾倉庫構築プロセス

Harbor は、Docker イメージを保存および配布するためのエンタープライズ レベルのレジスト...

HTML の marquee 属性の詳細な説明

このタグはHTML3.2の一部ではなく、MSIE3以降のカーネルでのみサポートされているため、IEカ...

jQuery はシャッター効果を実現します (li 配置を使用)

この記事では、ブラインド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具体...

Ubuntu 16.04 64ビット版を3つのステップで32ビットプログラムと互換性を持たせる

ステップ1: システムのアーキテクチャを確認する dpkg --print-architecture...

ウェブページのフラッシュアニメーションが表示されない問題の解決策

<br />解決手順は次のとおりです。スタート -> 実行 -> reged...

CSS変数を使用してダークモードを実装するためのサンプルコード

最近、WeChatはAppleによってダークモードの開発を強制されました。ますます多くのウェブサイト...

DockerはホストのMysql操作に接続します

今日、会社のプロジェクトでは docker を設定する必要があります。Windows に正常にインス...

Vue 父子価値移転、兄弟価値移転、子父価値移転の詳細な説明

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