小程序 卡片式动效实现

效果如下:

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>
相关推荐
鑫~阳6 分钟前
html + css 淘宝网实战
前端·css·html
Catherinemin10 分钟前
CSS|14 z-index
前端·css
2401_882727572 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
NoneCoder2 小时前
CSS系列(36)-- Containment详解
前端·css
anyup_前端梦工厂2 小时前
初始 ShellJS:一个 Node.js 命令行工具集合
前端·javascript·node.js
5hand2 小时前
Element-ui的使用教程 基于HBuilder X
前端·javascript·vue.js·elementui
计算机徐师兄2 小时前
Java基于SSM框架的无中介租房系统小程序【附源码、文档】
java·微信小程序·小程序·无中介租房系统小程序·java无中介租房系统小程序·无中介租房微信小程序
源码哥_博纳软云2 小时前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
GDAL2 小时前
vue3入门教程:ref能否完全替代reactive?
前端·javascript·vue.js
六卿2 小时前
react防止页面崩溃
前端·react.js·前端框架