uniapp 滑动回弹效果
<template>
<view class="lst">
<view @touchmove="move" @touchstart="moveStart" @touchend="moveEnd" class="warp"
:style="{transform: 'translate(0px, '+scl.tranNum+'%) translateZ(0px)'}"
>
<view class="list end">
</view>
<view class="scorll" v-text="this.scl.sate?'释放查看':'查看更多'"></view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
scl:{
right:0,//容器距离,判断是否达到最右侧
bottom:0,//容器距离,判断是否达到最右侧
width:0,//右滑块的width
tranNum:0,
tx:0,//滑动位置
lastX: 0,
lastY: 0,
inter:null,
sate:false,//状态
}
}
},
onShow() {
},
onLoad(options) {
},
onReady() {
},
methods: {
getDom(dom,callback){
let query = uni.createSelectorQuery().in(this);
query.select(dom).boundingClientRect(res => {
callback(res);
}).exec();
},
move(event){
let currentX = event.changedTouches[0].pageX;
let currentY = event.changedTouches[0].pageY;
let ty = currentX - this.scl.lastX;//向左滑动:tx<0 ,向右滑动tx > 0
let tx = currentY - this.scl.lastY;
if (Math.abs(tx) <= Math.abs(ty)) {//上下方向滑动
return;
}
this.getDom('.list',res=>{
this.scl.right = res.bottom.toFixed(0);
})
if(this.scl.width==0){
this.getDom('.scorll',res => {
this.scl.width = res.height.toFixed(0);
});
}
this.getDom('.end',res => {
if( this.scl.right == res.bottom.toFixed(0)){
this.scl.tx = this.scl.tx + tx;
let scale= -(this.scl.right / this.scl.width)*100;//计算占比
this.scl.tx = this.scl.tx<scale ? scale : this.scl.tx;
if(this.scl.tx<0){
if( -(scale -this.scl.tx) < 10){//这里的10按需求定(手指滑动多少距离执行)
this.scl.sate = true;
console.log(-(scale -this.scl.tx))
}else{
this.scl.sate = false;
}
this.scl.tranNum=this.scl.tx*0.1;
}
}
});
//将当前坐标进行保存以进行下一次计算
this.scl.lastX = currentX;
this.scl.lastY = currentY;
},
moveEnd(event){
if(this.scl.tx<=0){
this.scl.inter=setInterval(()=>{
this.scl.tx=this.scl.tx+10;
this.scl.tx = this.scl.tx>=0 ? 0 : this.scl.tx;
this.scl.tranNum=this.scl.tx*0.1;
if(this.scl.tx==0){
clearInterval(this.scl.inter);
}
},10);
}else{
this.scl.tx=0;
this.scl.inter && clearInterval(this.scl.inter);
}
if(this.scl.sate){//执行操作
this.scl.sate = false;
console.log("执行操作!")
}
},
moveStart(event){
this.scl.lastX = event.changedTouches[0].pageX;
this.scl.lastY = event.changedTouches[0].pageY;
}
}
}
</script>
<style lang="scss" scoped>
.warp{
position: relative;
width: 100%;
white-space: nowrap;
-webkit-overflow-scrolling:touch;
transform: translate(0px, 0px) translateZ(0px);/*使用该属性来实现*/
.list{
height: 700px;
border: 1px solid;
}
.scorll{
display: inline-block;
vertical-align: middle;
font-size: 24rpx;
color: #999;
width: 100%;
text-align: center;
position: absolute;
top: 0;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
z-index: -1;
}
}
</style>
参考于:https://www.cnblogs.com/xiaonian8/p/14928101.html

浙公网安备 33010602011771号