WeChatアプレットのスクロールビューが左右連動効果を実現

WeChatアプレットのスクロールビューが左右連動効果を実現

WeChatアプレットはスクロールビューを使用して左右のリンクを実現します。参考までに、具体的な内容は次のとおりです。

左側のボタンをクリックすると、右側が指定した位置にジャンプします

  • まず、スクロールビューの垂直スクロールの使用に注意する必要があります。スクロールビューに固定の高さを与える必要があります。
  • 次に、クリックすると、スクロールする必要があるスクロール ビューに scroll-into-view を追加する必要があります。その値は子要素の ID である必要があり、ID は数字で始まることはできません。

右にスクロールすると、左のメニューが対応する位置にジャンプします

  • この背後にある考え方は、右スクロール画面がスクロールするときにスクロール距離を取得することです。右スクロール画面内の各モジュールが上端に到達する距離を計算し、配列に格納します。最初のモジュールのスクロール距離はモジュール自体の高さ、2 番目のモジュールのスクロール距離は最初のモジュールの高さにモジュール自体の高さを加えた値、というように続きます。スクロール時に、保存した配列のどの段階のスクロール距離であるかを判断し、これを利用して条件を満たす添え字の値を導出します。左メニューに対応する添え字の値を変更することで、左右の連動を実現できます。
  • 各モジュールの高さを計算するときは、wx.createSelectorQuery() を使用して要素を取得する必要があります。これにより、selectorQuerys オブジェクト インスタンスが返されます。次に、返されたノードの boundingClientRect(function callback) メソッドを使用して、ノードのレイアウト位置情報を取得します。SelectorQuery.exec() が実行されると、コールバック関数で情報が返されます。この記事では、onload で要素の高さを取得する方法を記述します。

実装効果図:

メインコードは次のとおりです。

インデックス.wxml

<ビュークラス="コンテナ">
  <view class="category-left">
    <スクロールビュー scroll-y="true" スタイル="height:100%">
      <block wx:for="{{category}}" wx:key="id">
       <view class="catgegory-item {{activeId === item.id?'active-item':''}}" data-id="{{item.id}}" bindtap="clickItem">{{item.name}}</view>
      </ブロック>
    </スクロールビュー>
  </ビュー>
  <view class="category-right">
    <scroll-view scroll-y="true" style="height:100%" scroll-into-view="{{toView}}" scroll-with-animation="ture" bindscroll="scroll">
      <view class="categoty-detail">
      <block wx:for="{{content}}" wx:key="id">
        <view class="catefory-main">
          <view class="category-title" id="{{item.id}}">{{item.title}}</view>
          <view class="category-content">
              <view class="content-item" wx:for="{{item.options}}" wx:for-item="i" wx:key="id">
                <画像 src="{{i.src}}"></画像>
                <テキスト>{{i.テキスト}}</テキスト>                                                      
              </ビュー>
          </ビュー>
        </ビュー> 
      </ブロック>
      </ビュー>
    </スクロールビュー>
  </ビュー>
</ビュー>

インデックス

//index.js
//アプリケーションインスタンスを取得する const app = getApp()

ページ({
  データ: {
    表示: 'a1',
    アクティブID: 'a1',
    カテゴリ:
      {名前: '新製品'、ID: 'a1'},
      { 名前: 'クラウドファンディング', id: 'a2' },
      { 名前: 'Xiaomi 携帯電話'、ID: 'a3' },
      { 名前: 'redmi 電話'、 ID: 'a4' },
      { 名前: 'ブラックシャークゲーム'、 ID: 'a5' },
      { name: "携帯電話アクセサリー", id: 'a6' },
      { 名前: 'TV', ID: 'a7'},
      { 名前: 'コンピュータ'、 ID: 'a8' },
    ]、
    コンテンツ: [
      {
        タイトル: '- 新製品 -', 
        オプション: [
          { src: '../../image/redmi.png',id: '001',text: 'redmi8'},
          { src: '../../image/redmi.png', id: '002', テキスト: 'redmi8A' },
          { src: '../../image/redmi.png', id: '003', テキスト: 'Xiaomi 9pro 5G'},
          { src: '../../image/redmi.png', id: '004', テキスト: 'redmi8'},
          { src: '../../image/redmi.png', id: '005', テキスト: 'redmi8' }
        ]、
        id: 'a1'
      },
      {
        タイトル: 「- クラウドファンディング -」
        オプション: [
          { src: '../../image/zhongchou.png', id: '006', テキスト: 'redmi8' },
          { src: '../../image/zhongchou.png', id: '007' ,text: 'redmi8'},
          { src: '../../image/zhongchou.png', id: '008', テキスト: 'redmi8' },
          { src: '../../image/zhongchou.png', id: '009',text: 'redmi8' }
        ]、
        id: 'a2'
      },
      {
        タイトル: '- Xiaomi 携帯電話 -',
        オプション: [
          { src: '../../image/xiaomi.png', id: '006', テキスト: 'redmi8' },
          { src: '../../image/xiaomi.png', id: '007', テキスト: 'redmi8' },
          { src: '../../image/xiaomi.png', id: '008', テキスト: 'redmi8' },
          { src: '../../image/xiaomi.png', id: '009', テキスト: 'redmi8' }
        ]、
         id: 'a3'
      },
      {
        タイトル: '- redmi 携帯電話 -',
        オプション: [
          { src: '../../image/hongmi.png', id: '006', テキスト: 'redmi8' },
          { src: '../../image/hongmi.png', id: '007', テキスト: 'redmi8' },
          { src: '../../image/hongmi.png', id: '008', テキスト: 'redmi8' },
          { src: '../../image/hongmi.png', id: '009', テキスト: 'redmi8' }
        ]、
        id: 'a4'
      }

    ]、
  },
  //イベント処理関数 onLoad: function () {
    this.setData({
      表示: 'a1',
      高さArr: []
    })
    クエリを wx.createSelectorQuery() に設定します。
    クエリ.selectAll('.catefory-main').boundingClientRect((rect)=> {
      rect.forEach(ele => {
        this.calculateHeight(ele.height);
      })
    }).exec();
  },
  クリックアイテム(e) {
    this.setData({
      アクティブID: e.currentTarget.dataset.id、
      toView: e.currentTarget.dataset.id
    })
  },
  スクロール(e) {
    scrollHeight を e.detail.scrollTop とします。
    index = this.calculateIndex(this.data.heightArr,scrollHeight); とします。
    this.setData({
      アクティブID: 'a'+インデックス
    })

  },
  // スクロール間隔を計算する calculateHeight(height) {
    if(!this.data.heightArr.length) {
      this.data.heightArr.push(高さ)
    }それ以外 {
      this.data.heightArr.forEach(ele => {
        高さ += 要素
      })
      this.data.heightArr.push(高さ);
    }
  },
  // 左側で選択された下付き文字を計算する calculateIndex(arr, scrollHeight) {
    インデックスを '' とします。
    for(let i =0;i<arr.length;i++) {
      スクロール高さ >= 0 && スクロール高さ < arr[0]){
        インデックス = 0;
      }それ以外の場合(スクロール高さ >= arr[i-1] && スクロール高さ < arr[i]){
        インデックス = i;
      }
    }
    インデックス+1を返します。
  }
})

インデックス.wxss

/**index.wxss**/
。容器 {
  パディング: 0;
  幅:100%;
  高さ:100vh;
  ディスプレイ: フレックス;
  flex-direction: 行;
  align-items:flex-start;
}
.category-left {
  高さ: 100%;
  幅: 22%;
  パディング: 0 20rpx;
  ボックスのサイズ: 境界線ボックス;
  右境界線: 1px 実線 #efefef;
}
.カテゴリ項目{
  パディング: 20rpx 0;
  フォントサイズ: 30rpx;
  テキスト配置: 中央;
}
.アクティブアイテム{
  色: オレンジ;
}
.カテゴリ右{
  フレックス:1;
  高さ: 100%;
}
.カテゴリコンテンツ{
  表示: グリッド;
  グリッドテンプレート列: repeat(auto-fill, 190rpx);
}
.カテゴリータイトル{
  テキスト配置: 中央;
}
.コンテンツアイテム{
  ディスプレイ: フレックス;
  flex-direction: 列;
  パディング: 20rpx;
  テキスト配置: 中央;
  フォントサイズ: 30rpx;
}
.コンテンツアイテム画像{
  幅: 120rpx;
  高さ: 120rpx;
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • WeChatアプレットが左右連携を実現
  • WeChatアプレットのスクロールビューが左右の連動を実現
  • WeChatアプレットがメニューの左右連動を実現
  • WeChatアプレットがショッピングページの左右連携を実現
  • WeChatアプレットは左右連動の実戦記録を実現

<<:  Windows Apache 環境で SSL 証明書を展開して、Web サイトを https 対応にする方法

>>:  MySQLのファジークエリのような遅い速度を解決する方法

推薦する

Nginx ベースの Mencached キャッシュ構成の詳細な説明

導入Memcached は分散キャッシュ システムです。Memcached には認証とセキュリティ制...

Windows での MySQL 8.X インストール チュートリアル

以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...

tbodyタグの魔法はテーブルコンテンツの表示を高速化します

他の人のウェブページを保存して見たことがあると思いますが、特にdwで開くと、多くのウェブページに&l...

インタビューの質問: ホーリー グレイル レイアウトとダブル ウィング レイアウトの違い

序文今日は、聖杯レイアウトとダブルウィングレイアウト、そしてそれらの違いについてお話しします。この2...

MySQLクエリ条件におけるonとwhereの配置の違いの分析

導入今日SQLを書いているときに、問題が発生しました。要件は、データを照会し、スコアと過去 1 週間...

優れたウェブワイヤーフレーム設計・制作ツール13選を紹介

プロジェクトの作業を開始するときは、ワイヤーフレームを使用してアイデアをスケッチすることが重要です。...

Alibaba Cloud OSS アクセス権設定(RAM 権限制御)実装

シナリオmyBuket の static/material/ ディレクトリなど、Alibaba Cl...

mysql5.7.20 のインストールと設定方法のグラフィック チュートリアル (mac)

MySQL 5.7.20のインストールと設定方法のグラフィックチュートリアルをあなたと共有します1...

Tomcatの自動シャットダウンに関するバグ修正

序文最近、4 年間実行されている Java EE Web プロジェクトでは、システムが開けないという...

MySQL ステートメントの実行順序と書き込み順序の例の分析

選択ステートメントの完全な構文は次のとおりです。 選択 DISTINCT <選択リスト>...

Windows 10 での mysql5.5 データベース コマンドラインの中国語文字化け問題を解決する

システムをリセットした後、かなり前にインストールした MySQL データベースのコンソール クエリで...

WeChat アプレット開発フォーム検証 WxValidate の使用

個人的には、WeChat アプレットの開発フレームワークは VUE と概ね似ていると感じていますが、...

CSS3は、変換変形とイベントを組み合わせて扇形のナビゲーションを完成させます。

この場合、transition という単語を間違って書いたため、午後中ずっとそれに取り組みました。本...

データベースミドルウェアMyCatの紹介

1. Mycatの適用シナリオMycat は幅広いシナリオに合わせて開発されており、新しいユーザーが...

デザインリファレンス 美しく独創的なブログデザイン

以下にリストされているすべてのブログはオリジナルであり、独自にデザインされています。これらは、他者が...