乐趣区

关于微信小程序:微信小程序商城开发商品详情轮播图片视频混合

微信小程序商品详情轮播视频 + 图片混合

次要问题

  • 图片及视频自适应屏幕
  • 依据资源类型进行渲染
  • 滑动切换后进行视频播放
  • 滑动切换后更新资源序号

所需组件

  • swiper
  • swiper-item
  • image
  • video

外围代码

details.wxml

<view class="thumbs">
  <!-- 资源数量大于等于 2 时才应用 swiper, 一个资源无需 swiper, 没有资源请自行处理 -->
  <swiper wx:if="{{total >= 2}}" circular="{{true}}" style="height: {{width}}px;" bindchange="onSwiperChange">
    <swiper-item wx:for="{{thumbs}}" wx:for-item="thumb" wx:key="index">
      <image style="width: 100%; height: 100%;" class="thumb" wx:if="{{thumb.type ==='image'}}" mode="aspectFit" src="{{thumb.url}}" title="{{thumb.title}}" alt="{{thumb.title}}"></image>
      <video id="video-{{index}}" style="width: 100%; height: 100%;" class="video" wx:if="{{thumb.type ==='video'}}" show-fullscreen-btn="{{false}}" src="{{thumb.url}}"></video>
    </swiper-item>
  </swiper>
  <view wx:else>
    <!-- 单个资源时, 请留神通过 style 属性设置其 width,heigth 属性, 否则不会显示 -->
    <image wx:for="{{thumbs}}" wx:for-item="thumb" wx:key="index" style="width:{{width}}px; height:{{width}}px;" class="thumb" wx:if="{{thumb.type ==='image'}}" mode="aspectFit" src="{{thumb.url}}" title="{{thumb.title}}" alt="{{thumb.title}}"></image>
    <video wx:for="{{thumbs}}" wx:for-item="thumb" wx:key="index" id="video-{{index}}" style="width:{{width}}px; height:{{width}}px;" class="video" wx:if="{{thumb.type ==='video'}}" show-fullscreen-btn="{{false}}" src="{{thumb.url}}"></video>
  </view>
  <view class="counter">
    <text class="index">{{index}}</text><text class="spec">/</text><text class="total">{{total}}</text>
  </view>
</view>

details.js

Page {
  data: {
    index: 0,
    total: 0,
    width: 0,
    thumbs: []},
  onSwiperChange (e) {
    // 推断前后资源索引, 用于切换时进行视频播放, 如无此需要能够省略
    const prev = index >= 1 ? index - 1 : this.data.total - 1
    const next = index <= this.data.total - 2 ? index + 1 : 0;

    // 可能从左向右滑
    if (this.data.thumbs[prev].type === 'video') {const videoContext = wx.createVideoContext('video-' + prev) // 这里对应的视频 id
      videoContext.pause(); // 进行播放}
    // 可能从右向左滑
    if (this.data.thumbs[next].type === 'video') {const videoContext = wx.createVideoContext('video-' + next) // 这里对应的视频 id
      videoContext.pause(); // 进行播放}

    // 更新以后序号
    this.setData({index: index + 1})
  },
  loadProductThumbs () {
    // 省略获取数据逻辑, 依据数据汇合设置 total 值
    const _this = this;
    // 数据结构
    /*
    {
      type: 'image||video',
      url: '...',
      ... 其余数据
    }
    */
    wx.request({
      url: '',
      success: (res) => {
        _this.setData({
          total:  res.data.list.length,
          // 采纳增量更新形式(轻易了)thumbs: [...this.data.thumbs, ...res.data.list]
        })
      }
    })
    
  },
  onLoad () {
    // 获取屏幕宽度, 使图片或者视频宽度为全屏宽度, 高度与宽度统一,高宽可依据需要自行设置
    this.loadProductThumbs()
    const {screenWidth} = wx.getSystemInfoSync()
    this.setData({width: screenWidth});
  }
}

details.wxss

.thumbs {position: relative;}

.thumbs .counter {
  position: absolute;
  bottom: 10px;
  right: 10px;
  padding: 2px 8px; 
  border-radius: 12px; 
  background-color: #0000008a; 
  color: #fafafa;
}

计数器 (counter) 款式请自行定制~^:^~

欢送留言探讨

退出移动版