今日分享【微信小程序实现堆叠式轮播图】

1、先看效果
在这里插入图片描述
2、来看具体实现代码

  • wxml
<view class="swiper-box-1" bindtouchmove="tauchMove" bindtouchstart="tauchStart" bindtouchend="tauchEnd">
  <view class="item-box-1 {{item.zIndex==1?'none':''}}" wx:for="{{swiperList}}" wx:key="index" style="--index:{{item.zIndex}};--left:{{item.mLeft}}">
    <view class="swiper-item">
      <image src="{{item.url}}" mode="aspectFill"></image>
    </view>
  </view>
</view>
  • wxss
.swiper-item image{
  width: 100%;
  display: block;
  height: 100%;
  margin: 0;
  pointer-events: none;
}

image {
  max-width: 100%;
  display: inline-block;
  position: relative;
  z-index: 0;
}

.swiper-box-1 {
  height: 420rpx;
  position: relative;
  max-width: 750rpx;
  overflow: hidden;
  box-sizing: border-box;
  margin-top: 90rpx;
}

.swiper-box-1 .item-box-1 {
  position: absolute;
  width: 300rpx;
  height: 380rpx;
  top: 0;
  bottom: 0;
  left: 50%;
  margin: auto;
  transition: all 0.2s ease-in 0s;
  opacity: 1;
  box-shadow: 0px 13rpx 12rpx rgba(0, 0, 0, .5);
  border-radius: 15rpx;
  overflow: hidden;
}

.swiper-box-1 .item-box-1.none {
  opacity: 0;
}

.swiper-box-1 .item-box-1 .swiper-item {
  width: 100%;
  height: 100%;
  border-radius: 6rpx;
  overflow: hidden;
}


.swiper-box-1 .item-box-1 {
  transform: scale(calc(0.5 + var(--index) / 10));
  margin-left: calc(var(--left) * 100rpx - 150rpx);
  z-index: var(--index);
}
  • js
Page({

  data: {
    swiperList: [
     {

        type: 'image',
        url: 'https://s21.ax1x.com/2024/04/29/pkFAvTO.jpg'
      },
       {

        type: 'image',
        url: 'https://s21.ax1x.com/2024/04/29/pkFAvTO.jpg'
      },
      {
        type: 'image',
        url: 'https://s21.ax1x.com/2024/04/29/pkFAvTO.jpg'
      },
    ],
  },


  onLoad: function (options) {
    this.tauchSwiper('swiperList');
  },
  // 初始化swiper
  tauchSwiper(name) {
    let list = this.data[name];
    for (let i = 0; i < list.length; i++) {
      list[i].zIndex = parseInt(list.length / 2) + 1 - Math.abs(i - 			parseInt(list.length / 2))
      list[i].mLeft = i - parseInt(list.length / 2)
    }
    this.setData({
      swiperList: list
    })
  },
  // tauchSwiper触摸开始
  tauchStart(e) {
    this.setData({
      tauchStart: e.touches[0].pageX
    })
  },
  // tauchSwiper计算方向
  tauchMove(e) {
    this.setData({
      direction: e.touches[0].pageX - this.data.tauchStart > 0 ?  	'right' : 'left'
    })
  },
  // tauchSwiper计算滚动
  tauchEnd(e) {
    let direction = this.data.direction;
    let list = this.data.swiperList;
    if (direction == 'right') {
      let mLeft = list[0].mLeft;
      let zIndex = list[0].zIndex;
      for (let i = 1; i < list.length; i++) {
        list[i - 1].mLeft = list[i].mLeft
        list[i - 1].zIndex = list[i].zIndex
      }
      list[list.length - 1].mLeft = mLeft;
      list[list.length - 1].zIndex = zIndex;
      this.setData({
        swiperList: list
      })
    } else {
      let mLeft = list[list.length - 1].mLeft;
      let zIndex = list[list.length - 1].zIndex;
      for (let i = list.length - 1; i > 0; i--) {
        list[i].mLeft = list[i - 1].mLeft
        list[i].zIndex = list[i - 1].zIndex
      }
      list[0].mLeft = mLeft;
      list[0].zIndex = zIndex;
      this.setData({
        swiperList: list
      })
    }
  }


})

3、写在最后:实现简单,勤于动手,不需要任何插件,你自己就可以纯手撸一个‘花里胡哨’的轮播图…

4、贴下自己的小程序,有很多花里胡哨的东西,喜欢可以扫码查看

在这里插入图片描述

<think>好的,用户之前问过如何实现堆叠轮播图,我已经给出了一个基于Uniapp的示例。现在用户再次提问,但这次引用了微信小程序的相关内容,可能用户实际是想在小程序环境下实现这个效果。需要结合之前的回答和新的引用内容来调整。首先,用户提供的引用[1]和[2]都提到了微信小程序的事件机制,比如bindtouchstart、bindtouchmove等,这说明用户需要在小程序中处理触摸事件来实现滑动切换。之前的回答虽然用了Uniapp,但Uniapp也可以编译到小程序,所以可能需要调整代码以适应小程序的事件系统。接下来,用户的问题明确要求代码示例,所以需要提供微信小程序的代码,包括WXML、WXSS和JS部分。之前的示例是Vue的,需要转换成小程序的语法。例如,将v-for改成wx:for,动态类名和样的绑定方也要调整。然后,考虑堆叠轮播的核心原理:绝对定位、z-index控制层级、transform实现缩放和位移。在微信小程序中,这些样属性同样适用,但需要注意小程序的样语法,比如rpx单位的使用。另外,用户之前的回答中提到了动态类名和样计算,需要在小程序中如何实现。可能需要使用数据绑定,将每个项的样和类名存储在数据中,或者通过WXS处理。触摸事件的处理是关键,引用[1]和[2]都提到了bindtouchstart、bindtouchmove、bindtouchend。需要在这些事件中记录触摸的起始位置,计算滑动距离,判断滑动方向,从而改变currentIndex。同时要考虑滑动阈值,比如滑动超过30%才切换,否则回弹。无限循环效果可以通过数据扩展来实现,比如在列表前后添加克隆项,当滑动到克隆项时,无缝跳转到真实项。但用户之前的问题可能还没有涉及这个,所以可能需要放在相关问题中,或者简要提及。样兼容性方面,微信小程序和H5可能有差异,需要测试不同平台的表现,尤其是transform的支持情况。但一般来说,小程序对现代CSS支持较好,所以主要注意布局和单位即可。 图片加载性能优化,可以使用懒加载,或者提前加载图片,但小程序中image组件有lazy-load属性,可以建议用户使用。最后,生成相关问题时,要结合用户之前的提问和当前内容,考虑无限循环、触摸事件处理、样兼容、性能优化等方面的问题。</think>### 堆叠轮播图实现方法(微信小程序版) #### 一、核心实现原理 1. **绝对定位布局**:通过`position: absolute`实现卡片堆叠效果 2. **动态样计算**:根据当前索引计算每个卡片的缩放比例和位移距离 3. **触摸事件处理**:使用`bindtouchstart`、`bindtouchmove`、`bindtouchend`实现滑动交互[^1] #### 二、完整代码示例 ```wxml <!-- index.wxml --> <view class="container"> <view class="swiper-wrapper"> <block wx:for="{{list}}" wx:key="index"> <view class="swiper-item {{item.className}}" style="{{item.style}}" bindtouchstart="handleTouchStart" bindtouchmove="handleTouchMove" bindtouchend="handleTouchEnd" > <image src="{{item.image}}" mode="aspectFill" /> </view> </block> </view> </view> ``` ```javascript // index.js Page({ data: { currentIndex: 0, startX: 0, list: [ {image: '/images/1.jpg'}, {image: '/images/2.jpg'}, {image: '/images/3.jpg'} ] }, // 计算卡片样 updateStyles() { const list = this.data.list.map((item, index) => { const diff = index - this.data.currentIndex const scale = 1 - Math.abs(diff) * 0.1 return { ...item, className: `item-${diff}`, style: `z-index: ${10 - Math.abs(diff)}; transform: scale(${scale}) translateX(${diff * 30}%); opacity: ${1 - Math.abs(diff)*0.2};` } }) this.setData({ list }) }, // 触摸事件处理 handleTouchStart(e) { this.setData({ startX: e.touches[0].pageX }) }, handleTouchMove(e) { const moveX = e.touches[0].pageX const diff = moveX - this.data.startX if (Math.abs(diff) > 50) { this.setData({ currentIndex: diff > 0 ? Math.max(0, this.data.currentIndex - 1) : Math.min(this.data.list.length - 1, this.data.currentIndex + 1) }, () => this.updateStyles()) } }, onLoad() { this.updateStyles() } }) ``` ```wxss /* index.wxss */ .swiper-wrapper { position: relative; height: 400rpx; } .swiper-item { position: absolute; width: 70%; height: 100%; transition: all 0.3s ease; border-radius: 16rpx; overflow: hidden; } .swiper-item image { width: 100%; height: 100%; } ``` #### 三、实现要点解析 1. **动态样计算**:通过当前索引与元素索引的差值计算缩放比例和位移量(公:$scale = 1 - |diff| \times 0.1$)[^2] 2. **触摸交互逻辑**: - 记录初始触摸位置`startX` - 计算滑动距离差值`diff` - 当滑动超过阈值(50px)时切换索引 3. **性能优化**: - 使用`transform`代替`left`属性实现动画 - 避免频繁setData,仅在索引变化时更新样 #### 四、效果增强建议 1. **无限循环**:通过复制首尾元素实现无缝衔接 2. **自动播放**:使用`setInterval`定时修改currentIndex 3. **3D效果**:添加`rotateY`旋转属性实现立体翻转
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值