設計意図ページを開発する際には、ページ上のナビゲーション メニューをクリックしたときにページを対応する位置までスクロールしたり、メニュー オプションを強調表示するためにページをスクロールしたりする必要があることがよくあります。 HTML 開発では、a タグ アンカー実装を使用し、それを jq アニメーションと組み合わせて同様の効果を実現できます。フレームワークでは、vant UI フレームワークもこの効果を実現します。 WeChatミニプログラムを実装するには? ? エフェクト表示
デザインのアイデア1.天井効果の実現
1) 距離 定数クエリ = wx.createSelectorQuery() query.select('.menu_nav').boundingClientRect(function(res) { obj = {} とします (res && res.top)の場合{ obj[item.attr] = parseInt(res.top) } }).exec()
セレクタ構文
プロパティ タイプ 説明 id string ノードのID データセット ノードのオブジェクトデータセット left number ノードの左境界座標 right number ノードの右境界座標 top number ノードの上限境界座標 bottom number ノードの下限境界座標 width number ノードの幅 height number ノードの高さ
2) ページスクロール監視
// ページスクロールを監視する 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(オブジェクトオブジェクト)
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を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQLのスケジュールタスクが正常に実行できない原因の分析と解決
最近 Linux を研究していて、いくつかの Linux ディストリビューションを試してみましたが、...
<本文> <div id="ルート"> <h1 ...
これまでの記事で、フロントエンド開発者にとって必須のツール、スクリプト、リソースのコレクションを紹介...
この記事では、UbuntuシステムでSVNを設定するプロセスを簡単に紹介します。ソースを更新sudo...
LAN 内のマシンは外部ネットワークにアクセスできますが、外部ネットワークは内部ネットワークにアクセ...
目次1. マスタースレーブ同期原理マスタースレーブ同期アーキテクチャ図(非同期同期)マスタースレーブ...
この記事では、シャトルボックス効果を実現するためのjQueryの具体的なコードを参考までに紹介します...
Harbor は、Docker イメージを保存および配布するためのエンタープライズ レベルのレジスト...
このタグはHTML3.2の一部ではなく、MSIE3以降のカーネルでのみサポートされているため、IEカ...
この記事では、ブラインド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具体...
ステップ1: システムのアーキテクチャを確認する dpkg --print-architecture...
<br />解決手順は次のとおりです。スタート -> 実行 -> reged...
最近、WeChatはAppleによってダークモードの開発を強制されました。ますます多くのウェブサイト...
今日、会社のプロジェクトでは docker を設定する必要があります。Windows に正常にインス...
目次1. 親コンポーネントが子コンポーネントに値を渡す1. 親コンポーネント.vue 2. サブコン...