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 IN ステートメントにおける低速クエリの効率を最適化する手法の例

表の構造は以下のとおりです。記事数は690件のみです。 記事テーブル article(id,titl...

Vue のトランジション効果とアニメーショントランジションの使用例の詳細な説明

目次遷移フック関数カスタム遷移クラス名遷移グループの使用まとめまずは例を見てみましょうコードは次のと...

Ubuntu 18.04 に mysql5.7.23 をインストールするチュートリアル

この記事では、Ubuntu18.04にmysql5.7.23をインストールする具体的な方法を参考まで...

Vue のプロダクション環境と開発環境を切り替えてフィルターを使用する方法

目次1. 本番環境と開発環境を切り替える最初の方法: .envファイルを設定する2番目の方法2. フ...

Vue が学ぶべき知識ポイント: forEach() の使用

序文フロントエンド開発では、目的のコンテンツを取得するためにループをトラバースする必要がある状況に頻...

Vueカスタムv-has命令、ボタン権限判定の手順

目次アプリケーションシナリオ簡単に言えば、カスタム指示基本概念グローバルカスタマイズローカルカスタマ...

MySQL シリーズ II マルチインスタンス構成

チュートリアルシリーズMySQL シリーズ: MySQL リレーショナル データベースの基本概念My...

MySQLのネストされたトランザクションで発生する問題

MySQL はネストされたトランザクションをサポートしていますが、それを実行する人は多くありません....

実践で遭遇するフロントエンドの基本(HTML、CSS)

1. div css マウスの手の形は cursor:pointer; です。 2. HTML の相...

MySQLデータベースホスト127.0.0.1とlocalhostの違い

私の友人の多くは、127.0.0.1 と localhost の違いがわからず、問題に遭遇するかもし...

MySQL マスタースレーブレプリケーション切断の一般的な修復方法

目次01 問題の説明02 ソリューション1. 他のスレーブライブラリを見つけてすぐに置き換える2. ...

ユニアプリプロジェクトでのウォーターフォールレイアウトの実装

GitHubアドレス、気に入ったらスターを付けてくださいプラグインのプレビューチュートリアル1. プ...

Vue Element フロントエンドアプリケーション開発の動的メニューとルーティングの関連付け処理

目次概要1. メニューとルーティング処理2. メニューとルートリスト3. ログインプロセスの処理概要...

さまざまな環境での Docker Compose のインストール方法

1. オンラインインストール現在、Linux x86アーキテクチャのオンラインインストールのみを試し...

iframeリフレッシュ方式の方が便利

iframeを更新する方法1. 更新するには、JavaScriptのdocument.fr.loca...