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

推薦する

MySQL 8.0.21.0 コミュニティ エディションのインストール チュートリアル (詳細な図解)

1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...

Vue.jsフレームワークはショッピングカート機能を実装します

この記事では、ショッピングカートを実装するためのVue.jsフレームワークの具体的なコードを参考まで...

MySQLのレプリケーションの詳細な分析

1.MySQLレプリケーションの概念これは、プライマリ データベースの DDL および DML 操作...

MySQL カウントを向上させる方法のまとめ

多くのプログラマーは MySQL に精通していると思います。多くの人が count の使い方と、最適...

MySQLデータベースがNULLを可能な限り避ける理由

MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NU...

Tomcat で JNDI データ ソースを構成する 3 つの方法

これまでの仕事では、開発サーバーは一般的にTomcatでした。データソースは、多くの場合、appli...

vsCodeはワンクリックでvueテンプレートを生成します

1. ショートカットCtrl + Shift + Pを使用してコンソールを呼び出します 2、「スニペ...

同じページを動的にロードするための Vue ルーティングリスニングの例

目次シナリオ分析発達要約するシナリオ分析システムでは、1 つのモジュールに 3 つのサブモジュールが...

nginxワーカープロセスループの実装

ワーカープロセスは、起動されると、まず自身の動作に必要な環境を初期化し、次に実行する必要があるイベン...

グリッドはページのレイアウトプランです

<br /> 英語原文: http://desktoppub.about.com/od/...

MySQL 8.0 が起動できない 3534 の解決策

MySQL 8.0 サービスを開始できません最近、 cmdで MySQL サービスを起動するときに遭...

ウェブ開発者はIE7とIE8の共存を懸念している

今日、IE8 をインストールしました。ダウンロードするために Microsoft の Web サイト...

JavaScript デザインパターン プロキシパターンの学習

目次概要実装保護エージェント仮想エージェント画像の遅延読み込みを実現する仮想プロキシ概要プロキシ パ...

HTMLの基本構造を包括的に理解する

HTML入門ハイパーテキスト マークアップ言語: ハイパーテキスト マークアップ言語ハイパーテキスト...

Docker と Intellij IDEA の融合により、Java 開発の生産性が 10 倍向上

目次1. 開発前の準備2. 新しいプロジェクトIdea は Java 開発のための強力なツールであり...