使用uniapp框架构建整屏翻页,仿抖音效整屏翻页效果,上翻或下翻到达一定临界值翻页,小于临界值,回弹复位。非 scroll-view非swiper
html
<template> <view class="page"> <view class=" container-fill"> <view class="scroll-fullpage" @touchstart="scrollTouchstart" @touchmove="scrollTouchmove" @touchend="scrollTouchend" :style="[{transform:'translateY(-'+scrollindex*100 +'vh)','margin-top': margintop+'px'}]"> <view class="section section01 " :class="scrollindex==0?'active':''" style="background: #3399FF;"> <text class="section-maintitle">页面1</text> <text class="section-subtitle">我的页面”1</text> </view> <view class="section section02 " :class="scrollindex==1?'active':''" style="background: #00CC66;"> <text class="section-maintitle">页面2</text> <text class="section-subtitle">我的页面”2</text> </view> <view class="section section03 " :class="scrollindex==2?'active':''" style="background: #33CCCC;"> <text class="section-maintitle">页面3</text> <text class="section-subtitle">我的页面”3</text> </view> <view class="section section04 " :class="scrollindex==3?'active':''" style="background: #6699FF;"> <text class="section-maintitle">页面4</text> <text class="section-subtitle">我的页面”4</text> </view> <view class="section section05 " :class="scrollindex==4?'active':''" style="background: #9966FF;"> <text class="section-maintitle">页面5</text> <text class="section-subtitle">我的页面”5</text> </view> </view> </view> </view> </template>
scrip
export default {
data() {
return {
scrollindex: 0, //当前页面的索引值
totalnum: 5, //总共页面数
starty: 0, //开始的位置x
endy: 0, //结束的位置y
critical: 100, //触发翻页的临界值[可自定义]
margintop: 0, //滑动下拉距离
};
},
methods: {
scrollTouchstart: function(e) {
let py = e.touches[0].pageY;
this.starty = py
this.endy = py
},
scrollTouchmove: function(e) {
let py = e.touches[0].pageY;
this.endy = py
if (py - this.starty < this.critical && py - this.starty > -this.critical) {
this.margintop = py - this.starty
}
},
scrollTouchend: function(e) {
if (this.endy - this.starty > this.critical && this.scrollindex > 0) {
this.scrollindex = this.scrollindex - 1
} else if (this.endy - this.starty < -this.critical && this.scrollindex < this.totalnum - 1) {
this.scrollindex = this.scrollindex + 1
}
this.start = 0,
this.endy = 0,
this.margintop = 0
},
}
}css
.container-fill {
height: 100%;
overflow: hidden;
max-height: 100vh;
}
.scroll-fullpage {
height: 100%;
transition: all 0.3s;
}
.section {
max-height: 100vh;
height: 100vh;
overflow-y: auto;
}
.section-maintitle {
display: block;
text-align: center;
font-size: 50upx;
color: #fff;
font-weight: bold;
letter-spacing: 10upx;
padding-top: 240upx;
}
.section-subtitle {
display: block;
text-align: center;
font-size: 40upx;
color: #fff;
font-weight: bold;
letter-spacing: 10upx;
}
.active .section-maintitle,
.active .section-subtitle {
animation: mymove 0.8s;
}
@keyframes mymove {
from {
transform: translateY(-400upx) scale(0.5) rotateY(90deg);
}
to {
transform: translateY(0) scale(1) rotateY(0);
}
}
