固然不乏有不少下拉刷新的插件能够直接使用,可是自定义程度不强,大部分都只能改改文字,很难知足设计师的创意,譬如淘宝和京东首页那种效果,就须要本身花心思倒腾了,最近恰好有这种需求,作完了稍微总结一下,具体看源码便可。vue
思路
- touchstart 记录开始位置
- touchmove 判断上拉、下拉(暂时只用到了下拉)
- touchend 根据下拉、上拉位置判断是否达到下拉刷新、上拉加载更多
- @scroll.passive="onScrollFn($event)" 记录屏幕滚动,用来处理上滑时header rgba控制(沿用早期效果)
- touchmove 会触发onPulling,控制下拉时header opacity(参考目前淘宝效果)
- 正在刷新时触发refresh,此时有一个回弹效果
- 刷新完无论成功失败都有一个回调 refreshFinsh,做用是有时候没有拉到刷新区域页面回弹以后,相关的透明度可能没法还原
props
- offset 默认下拉高度
- bounce 回弹高度 offset - bounce
- maxScrollerHeight 最大下拉高度
- enableRefresh 是否开启刷新
- onRefresh 达到刷新条件调用的方法
- refreshFinsh 刷新完成后回调
- onScroll 向上滑动中回调
- onPulling 向下 下拉刷新中回调
- frequency 频率控制
- power 滑动和下拉的像素比例(使之更易拉动)
使用示例
<scroller
:on-refresh="refresh"
:offset="100"
:bounce="80"
:maxScrollerHeight="130"
:power="1.5"
@refreshFinsh="refreshFinsh"
@onScroll="onScroll"
@onPulling="onPulling"
>
<template slot="pull-refresh">
<!-- <span class="down-tip">下拉刷新</span>
<span class="up-tip">松开刷新</span>
<span class="refresh-tip">加载中..</span> -->
</template>
<div class="c-view-content">......</div>
</scroller>
使用案例
- 源码参考地址 传送门
- demo参考地址 传送门
注意事项
- ios touchmove移出屏幕可能不会触发touchend,可用touchcancel
- ios最外层容器默认是能够滚动的,未达到刷新条件的时候须要e.preventDefault()
存在问题
- 添加频率限制后,出现滑动完需等待一会才能继续滑动,这里的滑动未区分普通滑动/下拉/上拉
- 上拉加载更多TODO
- touchmove 没有使用节流函数