123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <template>
- <!-- #ifdef H5 -->
- <view
- class="mix-refresh-content"
- :style="{
- transform: 'translateY('+ pageDeviation +'px)',
- transition: pageTransition + 's',
- height: 'calc(100% - ' + pageTop + 'px)',
- maxHeight: 'calc(100% - ' + pageTop + 'px)'
- }"
- @touchstart="pageTouchstart"
- @touchmove="pageTouchmove"
- @touchend="pageTouchend"
- >
- <!-- #endif -->
- <!-- #ifndef H5 -->
- <view
- class="mix-refresh-content"
- :style="{
- transform: 'translateY('+ pageDeviation +'px)',
- transition: pageTransition + 's',
- height: 'calc(100vh - ' + pageTop + 'px)',
- maxHeight: 'calc(100vh - ' + pageTop + 'px)'
- }"
- @touchstart="pageTouchstart"
- @touchmove="pageTouchmove"
- @touchend="pageTouchend"
- >
- <!-- #endif -->
-
- <!-- 下拉刷新 -->
- <view class="mix-loading-wrapper">
- <text class="cuIcon-icloading cu-load loading"></text>
- <text>既许一人之偏爱,愿尽余生之慷慨</text>
- </view>
- <slot></slot>
- </view>
- </template>
- <script>
- let startY, moveY, windowHeight = 500, platform;
- let timeDiff = 0;
- let touchending;
- export default {
-
- props: {
- top: {
- //距离顶部距离,单位upx
- type: Number,
- default: 0
- },
- },
- data() {
- return {
- pageDeviation: 0, //下偏移量
- pageTransition: 0, //回弹过渡时间
- refreshReady: false, //进入刷新准备状态
- refreshing: false, // 进入刷新状态
- loadingText: ['人前显贵,人后受罪']
- };
- },
- computed: {
- pageTop(){
- return uni.upx2px(this.top);
- }
- },
- created(){
- uni.getSystemInfo({
- success: function(e) {
- platform = e.platform;
- windowHeight = e.windowHeight;
- }
- })
- },
- methods: {
- pageTouchstart(e){
- touchending = false;
- this.pageTransition = 0;
- startY = e.touches[0].pageY;
- },
- pageTouchmove(e){
- if(touchending){
- return;
- }
- moveY = (e.touches[0].pageY - startY) * 0.4;
- if(moveY >= 0){
- this.pageDeviation = moveY;
-
- this.$emit('setEnableScroll', false);
- }
- if(moveY >= 50 && this.refreshReady === false){
- this.refreshReady = true;
- }else if(moveY < 50 && this.refreshReady === true){
- this.refreshReady = false;
- }
- if(platform === 'ios' && e.touches[0].pageY > windowHeight + 10){
- this.pageTouchend();
- }
- },
- pageTouchend(){
- touchending = true;
- if(moveY === 0){
- return;
- }
- this.pageTransition = 0.3;
- if(moveY >= 50){
- this.startPulldownRefresh();
- }else{
- this.pageDeviation = 0;
- }
-
- if(this.refreshReady === true){
- this.refreshReady = false;
- }
- //修复下拉一点回弹后页面无法滚动的bug
- this.$emit('setEnableScroll', true);
- startY = moveY = 0;
- },
- //开启下拉刷新
- startPulldownRefresh(){
- if(+new Date() - timeDiff < 100){
- return;
- }
- timeDiff = +new Date();
- this.refreshing = true;
- this.pageDeviation = uni.upx2px(90);
- this.$emit('refresh');
- },
- //结束下拉刷新
- endPulldownRefresh(){
- let that = this
- setTimeout(function(){
- that.refreshing = false;
- that.pageDeviation = uni.upx2px(0);
- },1200)
- //this.$emit('setEnableScroll', true);
- },
- }
- }
- </script>
- <style lang="less" scoped>
- .mix-refresh-content{
- display: flex;
- flex-direction: column;
- position: relative;
- }
- /* 下拉刷新部分 */
- .mix-loading-wrapper{
- position: absolute;
- left: 0;
- top: 0;
- transform: translateY(-100%);
- display: flex;
- justify-content: center;
- align-items: center;
- width: 100%;
- height: 100rpx;
- font-size: 24rpx;
- .cu-load{
- font-size: 36rpx;
- }
- }
-
- .mix-loading-icon{
- width: 70upx;
- height: 70upx;
- transition: .3s;
- }
- .mix-loading-icon.ready{
- transform: scaleX(1.3);
- }
- .mix-loading-icon.active{
- animation: loading .5s ease-in infinite both alternate;
- }
-
- @keyframes loading {
- 0% {
- transform: translateY(-20upx) scaleX(1);
- }
- 100% {
- transform: translateY(4upx) scaleX(1.3);
- }
- }
-
- </style>
|