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のファジークエリのような遅い速度を解決する方法

推薦する

Centos7.3 に mysql5.7.18 をインストールするための詳細なチュートリアル

1 Linuxディストリビューションのバージョンを確認する[root@typecodes ~]# c...

MySQL ストアド プロシージャと共通関数のコード分析

mysql ストアド プロシージャの概念:特定のタスク (クエリと更新) を実行できる、データベース...

Nginx 502 Bad Gateway エラーの原因と解決策

Nginx 502 Bad Gateway エラーに何度か遭遇しました。ここでメモしておこうと思いま...

クロスドメイン js フロントエンドの 8 つの実装ソリューション

目次1. jsonp クロスドメイン2. document.domain + iframe クロスド...

MYSQL メタデータ ロック (MDL ロック) の理論とロック タイプ テスト

目次MYSQL メタデータ ロック (MDL ロック) 学習理論とロック タイプ テスト1. 予備的...

Vue.jsは音楽プレーヤーを実装します

この記事では、音楽プレーヤーを実装するためのVue.jsの具体的なコードを参考までに共有します。具体...

背景属性の8つの属性値の詳細解説(面接の質問)

CSSの背景プロパティの値背景色背景画像背景繰り返し背景位置背景添付複合プロパティ: 背景: ba...

Vue の vue.$set() メソッドのソースコード例の詳細な説明

Vue を使用してプロジェクトを開発する過程で、次のような問題によく遭遇します。Vue のデータでオ...

Centos7.4 システムに yum ソースから mysql 5.6 をインストールする

システム環境: centos7.4 1. データベースがインストールされているかどうかを確認します。...

Centos6.5 glibc アップグレードプロセスの紹介

目次シナリオ要件glibc バージョンglibcのインストールglibc ソフトリンクシナリオ要件C...

jsネイティブカルーセルプラグインの制作

この記事では、jsネイティブカルーセルプラグインの具体的なコードを参考までに共有します。具体的な内容...

タイムライン効果を実現するCSS3

最近、コンピューターの電源を入れたところ、Geek Academy が新規ユーザーに 1 か月の無料...

古典的なJavaScriptの再帰ケースの質問の詳細な分析

目次再帰とは何ですか?また、どのように機能しますか? 1. 合計(1)デジタル加算(2)配列の和2....

CSS のオーバーフロー:hidden エラーの解決方法

失敗の原因今日、カルーセルを書いていたときに、overflow;hidden; が失敗する可能性があ...