flyx/common/animation.vue
2024-07-07 16:19:19 +08:00

336 lines
9.6 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="" style="">
<view class="choubox" v-for="(b,v) in awardArr.length" :key="v" :style="'width:'+width" v-if="pattern">
<view class="choulist">
<view class="choulists" :style="moveCss[v]">
<!--:style="[{backgroundImage:`url(${a.cate_backimgurl})`}]" -->
<view class="jp_img animated infinite" v-for="(a,x) in items[v]" :key="x">
<image :src="a.imgurl" style="width: 164rpx;height: 110rpx;z-index: 2;box-shadow:0px 5rpx 0px 0px #FF8A00" class="imgqx" v-if="a.shang_id==31"></image>
<image :src="a.imgurl" style="width: 164rpx;height: 110rpx;z-index: 2;box-shadow:0px 5rpx 0px 0px #00FFFD" class="imgqx" v-else-if="a.shang_id==32"></image>
<image :src="a.imgurl" style="width: 164rpx;height: 110rpx;z-index: 2;box-shadow:0px 5rpx 0px 0px #F95FFF" class="imgqx" v-else-if="a.shang_id==33"></image>
<image :src="a.imgurl" style="width: 164rpx;height: 110rpx;z-index: 2;box-shadow:0px 5rpx 0px 0px #FFE721" class="imgqx" v-else-if="a.shang_id==34"></image>
<image :src="a.imgurl" style="width: 164rpx;height: 110rpx;z-index: 2;box-shadow:0px 5rpx 0px 0px #FFFFFF" class="imgqx" v-else-if="a.shang_id==35"></image>
<image :src="a.imgurl" style="width: 164rpx;height: 110rpx;z-index: 2;box-shadow:0px 5rpx 0px 0px #FFFFFF" class="imgqx" v-else="a.shang_id==35"></image>
<view class="cj_title_name">{{a.title}}</view>
<!-- <image style="width: 166rpx;height: 41rpx;margin-top: -10rpx;" src="../static/infinite/a.png" mode="" class="imgqx" v-if="a.shang=='A'"></image>
<image style="width: 166rpx;height: 41rpx;margin-top: -10rpx;" src="../static/infinite/b.png" mode="" class="imgqx" v-if="a.shang=='B'"></image>
<image style="width: 166rpx;height: 41rpx;margin-top: -10rpx;" src="../static/infinite/c.png" mode="" class="imgqx" v-if="a.shang=='C'"></image>
<image style="width: 166rpx;height: 41rpx;margin-top: -10rpx;" src="../static/infinite/d.png" mode="" class="imgqx" v-if="a.shang=='D'"></image> -->
</view>
</view>
</view>
</view>
<view class="choubox" v-for="(b,v) in awardArr.length" :key="v" :style="'width:'+width" v-else>
<view class="choulist">
<view class="choulists_b" :style="moveCss[v]">
<!--:style="[{backgroundImage:`url(${a.cate_backimgurl})`}]" -->
<view class="jp_img animated infinite" v-for="(a,x) in items[v]" :key="x">
<image :src="a.imgurl" style="width: 100rpx;height: 110rpx;"></image>
<image style="width: 166rpx;height: 41rpx;" :src="a.shang" mode=""></image>
</view>
</view>
</view>
</view>
<view class="zzz" ref="refDivName"></view>
</view>
</template>
<script>
export default {
props: {
//中奖弹出框内容
awardArr: {
type: Array,
default: function() {
return [] //如果是对就是return {}
}
},
//抽赏商品列表
ShopList: {
type: Array,
default: function() {
return [] //如果是对就是return {}
}
},
width: {
type: String,
default: '750rpx'
},
pattern: {
type: Boolean,
default: true
}
},
data() {
return {
OrderList: [],
rollTimer: null, //动画定时器句柄
leftM: 10, //指针停止位置的偏移量 用来计算弹出框的初始位置
moveCss: [], //奖励滚动组件的滑动的动画效果css
itemWidth: 164, //每张卡牌的宽度
luckyNums: 0, //中奖位置
luckydata: [], //中奖位置数组
lnStart: 50, //中奖位置区间开始
lnEnd: 60, //中奖位置区间结束
items: [], //滚动的卡片列表
awardItem: [], //中奖道具
tiaotype: 1,
gudata: [],
// 适配手机
left_px: '',
scaleCsss: []
}
},
methods: {
//随机数
getRand(start, end) {
return Math.floor(Math.random() * (end - start + 1) + start);
},
getItem() {
let r = this.getRand(0, (this.ShopList.length - 1));
let item;
item = this.ShopList[r];
return item;
},
// 开始动画
openBox(v) {
let that = this
// #ifdef H5
// console.log(this.$refs.refDivName.$el.offsetWidth)
that.left_px = that.$refs.refDivName.$el.offsetWidth
// #endif
// #ifdef MP
// console.log(uni.createSelectorQuery().in(this).select(".zzz"))
uni.createSelectorQuery().in(that).select(".zzz").boundingClientRect(data => {
//data 可以打印data输出看详细数据有很多数据信息
// console.log(data)
that.left_px = data.width; //表示元素宽度
}).exec();
// #endif
//初始化数据
that.tiaotype = 1;
that.InitPageModel(v);
//150ms后显示奖励皮肤滚动组件
// debugger
setTimeout(() => {
//500ms 之后开始奖励列表滑动
that.rollTimer = setTimeout(() => that.startScroll(v), 100);
}, 150);
},
//初始化列表
InitPageModel(v) {
var that = this;
//随机一个总数
that.items = [];
//中间号码的列队
that.luckydata = [];
//中奖卡片的位置
for (var a = 0; a < v; a++) {
var jldata = [];
that.luckyNums = that.getRand(that.lnStart, that.lnEnd);
that.luckydata.push(that.luckyNums)
let loopNum = that.lnEnd - that.luckyNums < 4 ? that.luckyNums + 4 : that.lnEnd;
// console.log(that.gudata)
for (let i = 0; i < loopNum; i++) {
let item = {};
if (i == that.luckyNums) {
item = that.ShopList.filter((item) => item.id == that.awardArr[a].goodslist_id)[
0]; //把奖励加到列表里
// item.class = 'rubberBand'
that.awardItem.push(item); //拿到奖励的各个参数
} else {
item = that.getItem();
}
jldata.push(item);
}
that.items[a] = jldata;
}
},
//滑动效果
startScroll() {
var that = this;
let direction = ''
if (that.pattern) {
direction = 'left'
} else {
direction = 'top'
}
that.$nextTick(function() {
if (that.rollTimer != null) {
// setTimeout(() => {
// that.Audio.play()
// that.Audio.onPlay(function() {
// console.log('onPlay');
// });
// }, 500)
} else {
setTimeout(() => {
that.Audio.stop()
}, 500)
}
setTimeout(() => {
for (var a = 0; a < that.luckydata.length; a++) {
// let m = that.getRand(0, 50) - 110;
let m = -58;
that.leftM = m;
// debugger
// console.log((that.luckydata[a] - 2), that.left_px)
var yanzi = direction + ':-' + ((that.luckydata[a] - 2) * that.left_px - m) +
'px;transition:all 8s cubic-bezier(.1,.59,.1,.9)'
that.moveCss.push(yanzi)
//6s 动画结束后 开始弹出奖励图片6500ms后执行
}
}, 500);
that.rollTimer = setTimeout(() => {
// display和动画会有前后执行的冲突所以加上10ms延时处理
that.scaleCss = [];
that.scaleCsss = [];
that.$emit("close_animation")
setTimeout(() => {
//奖品按顺序淡出
for (var a = 0; a < that.luckydata.length; a++) {
setTimeout(() => {
// 奖品显示框
var scale = 'opacity:1 ;transition:all .8s;'
var scales =
'opacity:0 ;transform: scale(5);transition:all 2.5s;'
that.scaleCss.push(scale)
that.scaleCsss.push(scales)
}, 800 + a * 330);
}
that.moveCss = [];
that.items = [];
that.luckydata = [];
}, 500);
}, 9000);
})
},
tiaoguo() {
var that = this;
clearTimeout(that.rollTimer);
that.scaleCss = [];
that.scaleCsss = [];
that.$emit("close_animation")
setTimeout(() => {
//奖品按顺序淡出
for (var a = 0; a < that.luckydata.length; a++) {
setTimeout(() => {
// 奖品显示框
var scale = 'opacity:1 ;transition:all .8s;'
var scales =
'opacity:0 ;transform: scale(5);transition:all 2.5s;'
that.scaleCss.push(scale)
that.scaleCsss.push(scales)
}, 800 + a * 330);
}
that.moveCss = [];
that.items = [];
that.luckydata = [];
}, 500);
}
}
}
</script>
<style lang="scss">
// 适配手机
.zzz {
width: 164rpx;
height: 1rpx;
opacity: 0;
position: absolute;
top: 0;
left: 0;
}
.choubox {
// width: 730rpx;
height: 160rpx;
position: relative;
margin: auto;
overflow: hidden;
.choulist {
position: absolute;
display: flex;
margin-top: 10rpx;
.choulists_b {
position: relative;
top: 0;
// left: -50rpx;
// display: flex;
.jp_img {
position: relative;
width: 164rpx;
height: 144rpx;
// overflow: hidden;
animation-delay: 9s;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-position: 0% 100%;
background-size: 100% auto;
background-repeat: no-repeat;
image {
width: 144rpx;
height: 144rpx;
box-sizing: border-box;
overflow: hidden;
}
}
}
.choulists {
position: relative;
left: -50rpx;
display: flex;
.jp_img {
position: relative;
width: 164rpx;
height: 144rpx;
overflow: hidden;
animation-delay: 9s;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-position: 0% 100%;
background-size: 100% auto;
background-repeat: no-repeat;
image {
width: 144rpx;
height: 144rpx;
box-sizing: border-box;
overflow: hidden;
}
}
}
}
}
.cj_title_name {
width: 144rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 24rpx;
color: #FFFFFF;
}
</style>