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

推薦する

MySQL コード実行構造例の分析 [シーケンス、分岐、ループ構造]

この記事では、例を使用して MySQL コード実行構造について説明します。ご参考までに、詳細は以下の...

MySQL でデータ復旧に binlog を使用する方法

序文最近、オンラインでデータが誤って操作されました。データベースが直接変更されたため、それを回復する...

Linux における「!」の知られざる使用法のまとめ

序文実際、Linux では、控えめな「!」が驚くほど多くの用途で使用されています。この記事では、「!...

JavaScriptの基本的なインタラクションの詳細な説明

目次1. 要素の入手方法文書から入手ID取得クラス名 (className) を取得します。タグ名 ...

MySQL 5.7 でルートパスワードを変更する方法

MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...

Nginx 静的サービス設定の詳細な説明 (ルートとエイリアスの指示)

静的ファイルNginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サー...

フロントエンドページのポップアップマスクはページのスクロールを禁止します

フロントエンド開発者がよく遭遇する問題は、ユーザーに情報を提示するためのポップアップ ウィンドウを作...

MySQLトリガーについて深く理解するための記事

目次1. SC テーブルを挿入または変更するときに、テスト スコアが 0 ~ 100 の範囲外の場合...

よく使用される Linux コマンドの完全なリスト (推奨コレクション)

目次1. システム情報2. シャットダウン(システムのシャットダウン、再起動、ログアウト) 3. フ...

Centos7 の起動プロセスと Systemd での Nginx の起動構成

Centos7 の起動プロセス: 1.post(電源投入時のセルフテスト) 電源投入時のセルフテスト...

MySql はコミットする必要がありますか?

MySQL が挿入などの操作を実行するときにコミットする必要があるかどうかは、ストレージ エンジン...

Linux で nginx を起動および再起動する方法

Nginx (エンジン x) は、IMAP/POP3/SMTP サービスも提供する高性能 HTTP ...

UbuntuへのDocker CEのインストール

この記事は、Ubuntu 17.10 での Docker CE のインストールを記録するために使用さ...

Vueユーザーが長時間操作せずにログインページからログアウトするように実装する2つの方法

目次問題の説明フロントエンド制御(方法1)アイデアコードバックエンド制御(方法2)アイデアコード要約...