設計意図ページを開発する際には、ページ上のナビゲーション メニューをクリックしたときにページを対応する位置までスクロールしたり、メニュー オプションを強調表示するためにページをスクロールしたりする必要があることがよくあります。 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のスケジュールタスクが正常に実行できない原因の分析と解決
この記事では、例を使用して MySQL コード実行構造について説明します。ご参考までに、詳細は以下の...
序文最近、オンラインでデータが誤って操作されました。データベースが直接変更されたため、それを回復する...
序文実際、Linux では、控えめな「!」が驚くほど多くの用途で使用されています。この記事では、「!...
目次1. 要素の入手方法文書から入手ID取得クラス名 (className) を取得します。タグ名 ...
MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...
静的ファイルNginx は高いパフォーマンスで知られており、フロントエンドのリバース プロキシ サー...
フロントエンド開発者がよく遭遇する問題は、ユーザーに情報を提示するためのポップアップ ウィンドウを作...
目次1. SC テーブルを挿入または変更するときに、テスト スコアが 0 ~ 100 の範囲外の場合...
目次1. システム情報2. シャットダウン(システムのシャットダウン、再起動、ログアウト) 3. フ...
問題の説明Windows Server 2012 R2 または Windows Server 201...
Centos7 の起動プロセス: 1.post(電源投入時のセルフテスト) 電源投入時のセルフテスト...
MySQL が挿入などの操作を実行するときにコミットする必要があるかどうかは、ストレージ エンジン...
Nginx (エンジン x) は、IMAP/POP3/SMTP サービスも提供する高性能 HTTP ...
この記事は、Ubuntu 17.10 での Docker CE のインストールを記録するために使用さ...
目次問題の説明フロントエンド制御(方法1)アイデアコードバックエンド制御(方法2)アイデアコード要約...