微信小程序 --自定义堆叠式Swiper

这篇具有很好参考价值的文章主要介绍了微信小程序 --自定义堆叠式Swiper。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原生小程序写堆叠式swiper

首先看下最终的效果,三张卡片堆叠式swiper,居中的为展示,左右两边为前一个和后一个,如果是第一长,或者最后一张,对应的前后无阴影堆叠
swiper卡片堆叠,微信小程序,小程序,javascript

swiper卡片堆叠,微信小程序,小程序,javascript
swiper卡片堆叠,微信小程序,小程序,javascript

实现思路

一共渲染出4个卡片,然后根据显示位置设置zIndex,scale,left等属性,监听用户的滑动行为,对4个卡片的位置进行调整,然后只在当前最中间的卡片展示数据

代码如下:
wxml:

<view class="info-card">
  <view class="pagination-prompt">
    {{ currentGuestIndex }} / {{ totalGuests }}
  </view>
  <view class="tower-swiper" style="--cardHeight:{{cardHeight}}" bindtouchstart="towerStart" bindtouchend="towerEnd">
    <view class="tower-item {{(item.zIndex == 2 && currentGuestIndex == 1) || (item.zIndex == 3 && currentGuestIndex == dataList.length) ? 'none' : ''}}" wx:for="{{swiperList}}" wx:key="id" style="--index:{{item.zIndex}};--left:{{item.left}};--scale:{{item.scale}};--color:{{item.bgColor}}">
      <view class="swiper-item">
        <view style="text-align: center;margin-top: 200px;" wx:if="{{item.zIndex == 4}}">
          数据展示ID:{{ dataList[currentGuestIndex - 1].id }}
        </view>
      </view>
    </view>
  </view>
</view>

less

.info-card {
  width: 100%;
  height: 100%;
  padding: 20rpx 0;
  .pagination-prompt {
    height: 30rpx;
    line-height: 30rpx;
    width: 160rpx;
    text-align: center;
    font-size: 20rpx;
    background-color: #d6d6d6;
    border-radius: 40rpx;
    margin: 0 auto 20rpx;
  }

  .tower-swiper {
    width: 100%;
    height: calc(var(--cardHeight) * 1px);
    overflow: hidden;
    position: relative;
    .tower-item {
      position: absolute;
      width: 100%;
      height: 110%;
      bottom: 0;
      margin: auto;
      transition: all 0.2s ease-in 0s;
      opacity: 1;
      border-radius: 30rpx;
      top: 0;
      left: calc(var(--left) * 1px);
      transform: scale(var(--scale));
      background-color: var(--color);
      z-index: var(--index);
      overflow: hidden;
      &.none {
        opacity: 0;
      }
      .swiper-item {
        width: 100%;
        height: 100%;
      }
    }
  }
}

js文章来源地址https://www.toymoban.com/news/detail-645704.html

const app = getApp()
Component({
  properties: {
    dataList: {
      type: Object,
      value: [{
        id: 0}, {
        id: 1}, {
        id: 2}, {
        id: 3}, {
        id: 4}, {
        id: 5}, {
        id: 6}]
    }
  },

  data: {
    totalGuests: 1,
    currentGuestIndex: 1,
    swiperList: [],
  },

  lifetimes: {
    attached: function () {
      this.setData({
        cardHeight: app.globalData.bodyHeight - 50,
        clientWidth: wx.getSystemInfoSync().windowWidth,
        currentGuestIndex: 1,
        totalGuests: this.data.dataList.length
      })
      this.towerSwiper('swiperList')
    },
  },

  methods: {
    towerSwiper(name) {
      const clientWidth = this.data.clientWidth
      const list = [{
        id:1,
        zIndex: 1,
        left: 0,
        scale: .8,
        bgColor: '#acacac',
        showData: false
      }, {
        id:2,
        zIndex: 2,
        left: parseInt(-4.5 * clientWidth / 100),
        scale: .86,
        bgColor: '#acacac',
        showData: false
      }, {
        id:3,
        zIndex: 4,
        left: 0,
        scale: .9,
        bgColor: 'yellow',
        showData: true
      }, {
        id:4,
        zIndex: 3,
        left: parseInt(4.5 * clientWidth / 100),
        scale: .86,
        bgColor: '#acacac',
        showData: false
      }]
      this.setData({
        swiperList: list
      })
    },
    // towerSwiper触摸开始
    towerStart(e) {
      this.setData({
        towerStart: e.touches[0].pageX
      })
    },
    // towerSwiper计算滚动
    towerEnd(e) {
      console.log(e.changedTouches[0].pageX - this.data.towerStart);
      const valueTouch = Math.abs(e.changedTouches[0].pageX - this.data.towerStart) > 50 ? true : false
      if(!valueTouch) return false
      const direction = e.changedTouches[0].pageX - this.data.towerStart > 0 ? 'right' : 'left'
      const list = this.data.swiperList
      const clientWidth = this.data.clientWidth
      if (direction == 'right') {
        if(this.data.currentGuestIndex - 1 > 0) {
          const preDataIndex = this.data.currentGuestIndex - 1
          const newList = list.map((item, index) => {
            switch(item.zIndex) {
              case 1:
                item.left = parseInt(-4.5 * clientWidth / 100)
                item.zIndex = 2
                item.scale = .86
                break;
              case 2:
                item.left = 0
                item.zIndex = 4
                item.scale = .9
                item.showData = true
                item.bgColor = 'yellow'
                break;
              case 3:
                item.left = 0
                item.zIndex = 1
                item.scale = .8
                break;
              case 4:
                item.left = parseInt(4.5 * clientWidth / 100)
                item.zIndex = 3
                item.scale = .86
                item.showData = false
                item.bgColor = '#acacac'
                break;
            }
            return item
          })
          this.setData({
            swiperList: newList,
            currentGuestIndex: preDataIndex
          })
        }
      } else {
        if(this.data.currentGuestIndex + 1 <= this.data.dataList.length) {
          const nextDataIndex = this.data.currentGuestIndex + 1
          const newList = list.map((item, index) => {
            switch(item.zIndex) {
              case 1:
                item.left = parseInt(4.5 * clientWidth / 100)
                item.zIndex = 3
                item.scale = .86
                break;
              case 2:
                item.left = 0
                item.zIndex = 1
                item.scale = .8
                break;
              case 3:
                item.left = 0
                item.zIndex = 4
                item.scale = .9
                item.showData = true
                item.bgColor = 'yellow'
                break;
              case 4:
                item.left = parseInt(-4.5 * clientWidth / 100)
                item.zIndex = 2
                item.scale = .86
                item.showData = false
                item.bgColor = '#acacac'
                break;
            }
            return item
          })
          this.setData({
            swiperList: newList,
            currentGuestIndex: nextDataIndex
          })
        }

      }
    }
  }
})

到了这里,关于微信小程序 --自定义堆叠式Swiper的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序读取NFC卡片数据,NDEF-M1

    最近来了个离谱的需求,要用微信小程序读写NFC卡数据,微信官方文档可以说是垃圾的一批了,啥都没有,踩了好几天坑把整体思路记录一下。 如果需要DEMO可直达下载链接: https://download.csdn.net/download/weixin_65984842/87703559 首先调用微信自带的方法 然后在onload中利用 onDiscover

    2024年02月13日
    浏览(174)
  • 【全网首发】微信小程序读取NFC卡片数据,MifareClassic1K卡,M1卡片读写

    最近来了个离谱的需求,要用微信小程序读写NFC卡数据,微信官方文档可以说是垃圾的一批了,啥都没有,踩了好几天坑把整体思路记录一下。 如果需要DEMO可直达下载链接: https://download.csdn.net/download/weixin_65984842/87703559 首先调用微信自带的方法 然后在onload中利用 onDiscover

    2024年02月10日
    浏览(67)
  • 抖音跳微信小程序(抖音分享卡片和链接)图文教程

    序:         1、本博文参考一下资料:获取接口调用凭据 | 微信开放文档、获取scheme码 | 微信开放文档、获取授权帐号调用令牌 | 微信开放文档、用H5打开微信小程序_weixin_46746389的博客-CSDN博客         2、注意!只能是企业认证的小程序才可以生成跳转链接!!!!!  

    2024年02月10日
    浏览(51)
  • 效果最接近《羊了个羊》(卡牌堆叠游戏)的开源代码 微信小程序开源了

    效果最接近《羊了个羊》(卡牌堆叠游戏)的开源代码,有数据库和关卡。 我写的程序是指 卡牌堆叠游戏 ,效果与羊了个羊一致。本教程有已有两个版本。 本来是想着Fork多一点的时候再开源的,没有想到一个Fork都没有。 现在是 微信小程序 版本。 我就不在这里吐槽微信小

    2024年02月09日
    浏览(56)
  • 采用uniapp实现的银行卡卡片, 支持H5和微信小程序

    采用uniapp-vue3实现的银行卡卡片 支持H5、微信小程序(其他小程序未测试过,可自行尝试) 可用于参考学习 可到插件市场下载尝试: https://ext.dcloud.net.cn/plugin?id=16736 使用示例

    2024年02月22日
    浏览(77)
  • vue3引入JS-SDK实现h5分享小卡片、跳转微信小程序功能

    微信js-sdk官方文档: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 想要实现的效果: 1.登录微信公众平台,进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 2.通过npm引入js-sdk 安装成功后,可以在package.json中找到\\\"weixin-js-sdk\\\" 3.在main.js中,将js-sdk挂载

    2024年02月11日
    浏览(67)
  • 关于安卓viewpager实现堆叠卡片交互

    长江后浪推前浪,无聊的需求一浪接一浪。 最近做到一个关于卡片堆叠的需求,觉得挺有意思,所以特此记录一下。 文末将附上源码链接 首先看设计图: 可以看到,是一个卡片堆叠的效果,关于这种UI的实现,方法有很多,例如用recyclerview,viewpager,甚至说自定义view都可以

    2024年02月11日
    浏览(37)
  • 微信小程序 - 实现容器卡片翻转动画效果,类似考勤打卡签到时翻转效果(像翻牌抽奖类似的效果动画)详细示例源码教程,一键复制开箱即用!

    微信小程序项目中,实现了任意容器像卡片一样的翻转效果动画,类似钉钉打卡签到点击时的翻转动画! 示例源码的注释非常详细,保证一键复制后改改样式就能应用到你的项目中去了。

    2024年02月10日
    浏览(110)
  • 【uniapp分享微信小程序卡片报错 share:fail [Share微信分享:-3]Unable to send, https://ask.dcloud.net.cn/article/287】

    uniappAPP分享小程序卡片到微信报错share:fail [Share微信分享:-3]Unable to send, https://ask.dcloud.net.cn/article/287 由于官方报错码给的不是特别清晰,所以只能自己试错分析 首先: 满足APP分享到微信小程序基本条件 1.APP和微信小程序绑定在同一开放平台下 报错及解决办法 错误一 解决:

    2024年02月11日
    浏览(41)
  • 【微信小程序】记一次自定义微信小程序组件的思路

    最近来个需求,要求给小程序的 modal 增加个关闭按钮,上网一查发现原来 2018 年就有人给出解决方案了,于是总结下微信小程序自定义组件的思路:一句话, 用 wxml + css实现和原生组件类似的样式和效果,之后用 JS 实现类似原生组件的功能。 比如 modal 组件,观察可以得出就

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包