下拉刷新

刷新中

松开刷新

刷新完成

加载中 加载完成 没有更多

import tween from '@/plugins/tween'

import Load from '@/assets/Load.gif'

export default {

name:'myScroll',

props:{

'page':{

type:Object,  //counter:当前页  pageStart:开始页数  pageEnd:结束页数  total:总页数

},

'onRefresh':{ //刷新回调

type:Function,

require:true

},

'onPull':{ //加载回调

type:Function,

require:true

},

'getScrollTop':{ //获取滚动条位置

type:Function

},

'setScrollPage':{ //改变滚动条位置

type:Function

},

'scrollState':{//是否可滑动

type:Boolean,

require:true

}

},

data(){

return {

Load,

pageX:0,

pageY:0,

state:0,

scrollPosition:0,

myScroll:null,

myScrollList:null,

top:0,

aspect:0, //1:向下 2:向上

listHeight:0,

}

},

created(){

},

methods:{

ScrollTop(top){ //修改滚动条位置

this.myScroll.scrollTop = top

},

/*

* 刷新中:1

* 松开刷新:2

* 刷新完成:3

* 加载中:4

* 加载完成:5

* 下拉刷新:6

* 没有更多:7

*/

setState(index){ //修改状态

this.state = index

if(index == 5||index == 3){

setTimeout(()=>{

this.state = 0

let timer = null;

let that = this;

var b=50,c=100,d=100,t=0;

cancelAnimationFrame(timer);

timer = requestAnimationFrame(function fn() {

var oTop = that.top;

if (that.top>0) {

that.top = Math.ceil(tween.Quart.easeInOut(10,oTop,8,10)) - 15

timer = requestAnimationFrame(fn);

} else {

cancelAnimationFrame(timer);

that.top = 0

}

});

},500)

}

},

touchStart(e){ //触摸事件

this.pageX = e.targetTouches[0].pageX

this.pageY = e.targetTouches[0].pageY

},

touchMove(e){ //触摸滑动事件

this.scrollPosition = this.myScroll.scrollTop //获取滚动条位置

if(this.scrollState&&e.targetTouches[0].pageY>this.pageY){ //向上滑动

this.aspect = 2

if(this.myScroll.scrollTop==0){

let diff = e.targetTouches[0].pageY - this.pageY - this.scrollPosition

this.top = Math.pow(diff, 0.9)

let ranget = diff/document.body.clientHeight*100 //计算在屏幕上滑动了多少

if(ranget > 20){

this.state = 2

}else if(ranget < 15){

this.state = 6

}

e.preventDefault()

}

}else if(this.scrollState&&this.state!=4){ //向上滑动

this.aspect = 1

}

},

touchEnd(e){

if(this.aspect == 2&&this.state == 2||this.state == 1){ //上拉处理

this.top = 100

this.state = 1

this.topCallback()

}else if(this.aspect == 2){

this.state = 0

this.top = 0

}

},

onScroll(e){

let listHeight = this.myScrollList.offsetHeight //列表总高度

let listScrollTop = e.target.scrollTop + this.myScroll.offsetHeight //当前滚动条位置

if(this.state == 0&&listHeight-listScrollTop < 100){

this.bottomCallback()

}

if(this.getScrollTop)this.getScrollTop(e.target.scrollTop) //返回X,Y

},

topCallback(){ //刷新回调

this.onRefresh(this.state)

},

bottomCallback(){ //加载回调

if(this.state != 7){

this.state = 4

this.onPull(this.state)

}

},

},

mounted(){

this.myScroll = this.$refs.myScroll //获取滑条dom

this.myScrollList = this.myScroll.children[1] //获取列表dom

}

}

.allow{

overflow:hidden;

height: auto;

}

.prohibit{

max-width: 100%;

max-height: 100%;

height: 100%;

overflow:hidden;

overflow-y: scroll;

-webkit-overflow-scrolling: touch;

will-change: transform;

transition: all 450ms;

backface-visibility: hidden;

perspective: 1000;

}

.my-scroll{

position: relative;

color: #fff;

.scroll-top{

text-align: center;

display:flex;

position:absolute;

top:0;

left:0;

width:100%;

overflow: hidden;

div{

display:flex;

height:auto;

width:100%;

justify-content: center;

align-items:center;

flex-wrap: wrap;

i{

flex:1 0 100%;

display:block;

height: 0.4rem;

}

img{

width:0.6rem;

}

p{

flex:1 0 100%;

}

}

}

.scroll-list{

overflow:hidden;

min-height: 100%;

}

.scroll-bottom{

text-align: center;

line-height: 40px;

}

}

用法:

  • 列表

import myScroll from '@/components/myScroll.vue'

export default {

data(){

return{

list:[],

page:{

counter:1,

pageStart:1,

pageEnd:1,

total:10

},

}

},

methods:{

onRefresh(mun){ //刷新回调

setTimeout(()=>{

this.$refs.myScroll.setState(3);

},500)

},

onPull(mun){ //加载回调

if(this.page.counter<=this.page.total){

setTimeout(()=>{

this.page.counter++

this.$refs.myScroll.setState(5)

for(let i=0;i<10;i++){

this.listdata.push({})

}

},500)

}else{

this.$refs.myScroll.setState(7)

}

},

getTop(y) {//滚动条位置

},

},

components:{

myScroll

},

created(){

},

mounted(){

for(let i=0;i<1*50;i++){

this.list.push({})

}

},

}

.index{

}

更多推荐

html5 手机端上划分页,vue 移动端实现上滑下拉分页加载数据小demo