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

推薦する

HTML における DTD の使用法の概要

DTD はマークアップの文法規則のセットです。これは XML 1.0 仕様の一部であり、HTML フ...

HTML ページ出力で従うべきいくつかの原則の要約

1. DOCTYPE は必須です。ブラウザは宣言した DOCTYPE に基づいてページのレンダリング...

JSはjQueryのappend関数を実装します

目次コードを見せてください効果をテストする効果追伸別のアプローチコードを見せてください HTMLEl...

初心者のためのウェブサイト構築入門 - ウェブサイト構築に必要な条件とツール

今日は、初心者の次のような質問に答えます。学ぶ勇気さえあれば、自分のウェブサイトを構築するのは簡単で...

Linux CentOS でスケジュールされたバックアップ タスクを設定する方法

実装準備 # ファイルパスをバックアップする必要があります: /opt/apollo/logs/ac...

Vueプロジェクトを大画面に適応させる方法の例

レムの簡単な分析まず、remはCSS単位です。pxの固定ピクセル単位と比較すると、remはより柔軟性...

MySQL 5.7.33 インストール プロセスの詳細な図解

目次インストールパッケージのダウンロードインストール環境変数の設定インストールが成功したか確認する記...

CSS3マスクレイヤーのくり抜き効果を実現するさまざまな方法

この記事では、マスク レイヤーの中空化を実現する 4 つの方法を紹介します。みんなと共有し、自分用の...

IE8はマルチ互換モードを使用してWebページを正常に表示します

IE8には複数の互換モードがあります。 IE プラットフォームの設計者である Chris Wilso...

写真とテキストによる MySQL 8.0.21 インストール チュートリアル

1. ダウンロードリンクをダウンロードするダウンロードをクリックします。Oracle アカウントにロ...

PHP クラスにおける static と self の違いの簡単な分析

メソッドが定義されているクラスに応じて、現在のクラスへの静的参照を取得するには、self:: または...

CSSファイルをインポートする3つの方法の詳細な説明

CSS を導入する方法には、インライン スタイル、内部スタイル シート、外部スタイル シートの 3 ...

MySQL 5.7.21 解凍版のインストールと設定方法のグラフィックチュートリアル (win10)

MySQL 5.7.21 解凍版のインストールと設定方法は参考までに。具体的な内容は以下のとおりで...

Springboot アプリケーションを迅速にデプロイするために Docker とアイデアを統合する詳細なプロセス

目次1. はじめに2. 環境とツール3. Dockerをインストールし、リモート接続を構成する4. ...

HTMLのテーブルタグの基本学習チュートリアル

表ラベルの構成HTML 内の表は <table> タグで構成されており、ブラウザはタグを...