階段効果を実現するための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 に変換する方法

推薦する

CentOS7 インストール Zabbix 4.0 チュートリアル (イラストとテキスト)

SeLinuxを無効にするsetenforce 0永久に閉店: vi /etc/selinux/c...

MySQL マスタースレーブレプリケーション 読み書き分離の設定方法の詳細説明

1. 説明前回は、MySQL のインストールと構成、MySQL ステートメントの使用、MySQL デ...

MySQL の一般的な問題とアプリケーション スキルの概要

序文MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない...

HTML5+CSS3コーディング標準

黄金律プロジェクトに何人の人が取り組んでいるかに関係なく、すべてのコード行が同じ人によって書かれたよ...

Zabbix でフィルターを使用して監視を実装する方法

最近、監視機器の作業をしていたとき、ポートがダウンしているというアラームが常に出ていました。データを...

DockerにFastDFSをインストールする方法

画像をプルする docker pull season/fastdfs:1.2トラッカーを開始 doc...

MySQL (8 および 5.7) の Docker インストール

この記事では、Dockerを使用してMySQLデータベースとリモートアクセス構成をデプロイする方法を...

CentOS に PHP5 をインストール、PHP をアンインストール、PHP7 をインストールするチュートリアル

まず、PHP5をインストールするのはとても簡単ですyum install php PHP5 を使用し...

MySQL データベースの show processlist コマンドの使用の分析

実際のプロジェクト開発では、多数のクエリや挿入、特にマルチスレッド挿入など、データベースに大きな負荷...

Ubuntu 20.04 IPアドレスを変更する方法の例

例:本日、前回のオフィスコラボレーションプラットフォーム実験の続きをしていたところ、仮想マシンは以前...

nginxのインストールと設定の詳細なプロセス記録

目次1 nginxの紹介1 nginxとは何か2 つのアプリケーション シナリオ2 nginxのイン...

10 HTML テーブル関連タグ

実際、多くの人が「テーブルは絶対に使用すべきではないと聞いたことがある」と言いますが、これは絶対に間...

MySQLの遅いクエリ問題の詳細な分析データ送信

例を通して、MySQL のデータ テーブル送信のクエリが遅い問題の解決策を共有しました。最近、コード...

CSS3 transition-delay属性のデフォルト値が単位なしの0であり無効である問題を解決します

今日は、CSS3 の transition-delay 属性のデフォルト値 0 に単位がないのは無効...

CSSでnグリッドレイアウトを実装する方法

一般的なアプリケーションシナリオ現在のアプリのインターフェースは基本的に同じであり、グリッドレイアウ...