小程序 卡片式动效实现

效果如下:

demo:

<!-- 折叠轮播图 组件-->
<template>
  <view class="swpbig">
    <view
      ref="swiperPanel"
      class="swiperPanel"
      @touchstart="startMove"
      @touchend="endMove"
    >
      <view
        v-for="(item, index) in swiperList"
        :key="index"
        class="swiperItem"
        :style="{transform: itemStyle[index].transform, zIndex: itemStyle[index].zIndex, opacity: itemStyle[index].opacity}"
      >
        <view class="children">
          <view class="pic">
            <!-- <span>{{ index }}</span> -->
            <image
              class="pici"
              :src="item.url"
            />
            <!--  <image
              class="banner_signal"
              src="../../static/banner_signal.png"
              mode=""
            /> -->
            <view class="swpnew">全新{{ index }}</view>
          </view>
        </view>
      </view>
    </view>
  </view>
</template>
 
<script>
var timer
export default {
  props: {
    swiperList: {
      type: Array,
      default: () => [
        {
          type: 'Array'
          // url: '../../static/banone.png'
        }, {
          type: 'Array'
          // url: '../../static/bantwo.png'
        }, {
          type: 'Array'
          // url: '../../static/banthree.png'
        }, {
          type: 'Array'
          // url: '../../static/banthree.png'
        }, {
          type: 'Array'
          // url: '../../static/banthree.png'
        }
      ]
    }
  },
  data() {
    return {
      slideNote: {
        x: 0,
        y: 0
      },
      screenWidth: 0,
      itemStyle: [],
      active: 0
    }
  },
  created() {
    var macInfo = uni.getSystemInfoSync()
    this.screenWidth = macInfo.screenWidth
    // 计算swiper样式
    this.swiperList.forEach((item, index) => {
      this.itemStyle.push(this.getStyle(index))
    })
    // timer = setInterval(() => {
    // this.rightSlider()
    // }, 3000)
  },
  methods: {
    rightSlider() {
      var newList = JSON.parse(JSON.stringify(this.itemStyle))
      var last = [newList.pop()]
      newList = last.concat(newList)
      this.itemStyle = newList
    },
    getStyle(e, style) {
      // if (e > this.swiperList.length / 2) {
      //   console.log(e)
      //   var right = this.swiperList.length - e
      //   return {
      //     transform: 'scale(' + (1 - right / 10) + ') translate(-' + (right * 9) + '%,0px)',
      //     zIndex: 9999 - right
      //     // opacity: 0.5 / right
      //   }
      // } else {
      return {
        transform: 'scale(' + (1 - e / 10) + ') translate(' + (e * 9) + '%,0px)',
        zIndex: 9999 - e
        // opacity: 0.5 / e
      }
      // }
    },
    startMove(e) {
      clearInterval(timer)
      this.slideNote.x = e.changedTouches[0] ? e.changedTouches[0].pageX : 0
      this.slideNote.y = e.changedTouches[0] ? e.changedTouches[0].pageY : 0
    },
    endMove(e) {
      // timer = setInterval(() => {
      //   this.rightSlider()
      // }, 3000)
      let staticTransform = ''
      let staticActive = ''
      var newList = JSON.parse(JSON.stringify(this.itemStyle))
      if ((e.changedTouches[0].pageX - this.slideNote.x) < 0) {
        staticActive = this.active
        // 向左滑动
        var last = [newList.pop()]
        // console.log('左滑', last)
        newList = last.concat(newList)
        const item = newList[staticActive]
        staticTransform = item.transform
        item.transform = 'translateX(-110%) rotate(-10deg)'
        if (this.active <= this.itemStyle.length - 2) {
          this.active++
        } else {
          this.active = 0
        }
      } else if ((e.changedTouches[0].pageX - this.slideNote.x) > 0) {
        if (this.active === 0) {
          this.active = this.itemStyle.length - 1
        } else {
          this.active--
        }
        staticActive = this.active
        // 向右滑动
        newList.push(newList[0])
        newList.splice(0, 1)
        const item = newList[staticActive]
        staticTransform = item.transform
        // item.transform = 'translateX(-110%) rotate(-5deg)'
      } else {
        // 点击
      }
      this.itemStyle = newList
      setTimeout(() => {
        const item = this.itemStyle[staticActive]
        item.transform = staticTransform
      }, 500)
    }
  }
}
</script>
 
<style lang="scss">
	.swpbig{
		overflow: hidden;
		margin-top: 100px;
	}
	.swiperPanel {
		margin-top: 50upx;
		height: 680upx;
		width: 686upx;
		overflow: hidden;
		position: relative;
		margin-left:80upx;
 
		.swiperItem {
			height: 100%;
			width: 100%;
			position: absolute;
			top: 0;
			left: 0upx;
			transition: all .5s;
 
			.children {
				// height: 100%;
				width: 570upx;
				margin: 2upx 160upx 2upx 0;
				position: relative;
				
				.pic {
					position: relative;
					height: 645rpx;
					width: 560rpx;
					border-radius: 10upx;
				}
				.pici{
					position: absolute;
					height: 645rpx;
					width: 560rpx;
					border-radius: 10upx;	
					background: red;
				}
				.banner_signal{
					position: absolute;
					height: 645rpx;
					width: 560rpx;
					top: 0;
				}
				.swpnew{
					position: absolute;
					height: 63rpx;
					font-size: 45rpx;
					font-weight: bold;
					color: #FFF;
					line-height: 53rpx;
					right: 28rpx;
					margin-top: 12rpx;
					letter-spacing: 5rpx;
				}
			}
		}
	}
</style>
相关推荐
耶啵奶膘33 分钟前
uniapp-是否删除
linux·前端·uni-app
王哈哈^_^2 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie3 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic3 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿3 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具4 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
编程千纸鹤4 小时前
高校宿舍信息管理系统小程序
小程序·宿舍管理小程序
清灵xmf4 小时前
TypeScript 类型进阶指南
javascript·typescript·泛型·t·infer
小白学大数据4 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
说私域5 小时前
基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究
人工智能·小程序·零售