上一篇,我们实现了h5 实现向左平滑,出现按钮操作,封装组件,模拟购物车左滑删除,现在我们将要实现一个下拉刷新的组件,模拟原生下拉刷新的操作。这对h5手势的要求也是蛮高的,接下来,我们就一步一步的实现下拉刷新的操作。

需求背景

在原生app中嵌入h5页面,有些页面需要下拉刷新操作,一般比较简单的方法就是使用其他框架封装的下拉刷新,比如说mint-ui框架中的loadmore组件就可以实现下拉刷新操作,但是样式上可能就和整个app的风格不一致了。既然都是封装好的组件,那为什么我们不能自己封装一个组件,并且样式风格由我们自己来定了。

基础知识

touchstart事件:事件对象event,包含手指触摸的位置

touchmove事件:事件对象event,包含手指滑动的位置

touchend事件:事件对象event,包含手指离开屏幕的位置

封装组件

1. 首先我们先考虑下拉刷新的html结构

下拉刷新的文字有三种状态,下拉刷新=>释放刷新=>加载中,下面代码中刷新距离是自己定义的。

下拉即可刷新:页面下拉距离 < 刷新的距离

释放即可刷新:页面下拉距离 >= 刷新的距离

加载中:页面下拉距离 >= 刷新距离 && 手指释放

2. css样式

首先,下拉刷新的文字部分,一开始隐藏的,下拉出现

其次,slot部分的样式,我们可以忽略

.pull-refresh {

height: calc(~'100vh - 50px');

.pull-refreshing-text {

margin-top: -50px;

line-height: 50px;

height: 50rem;

font-size:14px;

color: #5a5a5a;

text-align: center;

}

}

最后下拉刷新的三种状态,我们定义一个下拉状态的变化moveState,0:初始状态(下拉即可刷新),1:释放即可刷新,2:加载中。所以我们的css样式和html结构可以根据moveState来变化

{{ moveState === 0 ? '下拉即可刷新...' : '释放即可刷新...' }}

加载中...

html结构增加下拉三种状态

.pull-refreshing-text {

margin-top: -50px;

line-height: 50px;

height: 50px;

font-size: 14px;

color: #5a5a5a;

text-align: center;

// 下拉即可刷新

.pull_icon {

height: 30px;

display: inline-block;

margin-right: 10px;

transition: transform 0.28s; // 箭头旋转动画时间

vertical-align: middle;

// 释放即可刷新

&.pull_icon-rotate {

transform: rotate(-180deg); // 箭头旋转180度

}

}

// 加载中

.pull_loading {

display: inline-block;

width: 20px;

height: 20px;

background-image: url('./loading.gif'); // loading动画

background-size: 20px 20px;

vertical-align: middle;

}

}

3. 绑定触摸滑动事件

绑定事件

在mounted钩子函数中绑定事件

let el = this.$refs.scrollBox

el.addEventListener('touchstart', e => {

this.touchStart(e)

})

el.addEventListener('touchmove', e => {

this.touchMove(e)

})

el.addEventListener('touchend', e => {

this.touchEnd(e)

})

触摸处理函数

在处理函数之前,我们首先要考虑好这个组件需要哪些全局变量,首先是移动的距离moveDistance,其次是触摸开始的起始y轴位置startY(为了在touchmove触发时候,计算y轴滑动距离),动画持续时间duration(手指离开屏幕之后,页面要回归到原始位置,这个动画的持续时间),下拉的三种状态moveState(0:下拉即可刷新,1:释放即可刷新,2:加载中)

在methods中处理相对应的绑定事件

touchStart(e) {

// 如果正在加载 则阻住触发

if (this.moveState === 2) return

// 触摸开始时,动画时间,移动距离归0

this.distance = 0

this.moveDistance = 0

// 获取初始y轴位置

this.startY = e.targetTouches[0].clientY

},

touchMove(e) {

// 如果正在加载 则阻止触发

if (this.moveState === 2) return

// 首先计算当前页面是否有滚动条,有滚动条,那么触摸滑动就是页面简单的上下滚动

let scrollTop = document.documentElement.scrollTop || document.body.scrollTop

if (scrollTop > 0) return

let move = e.targetTouches[0].clientY - this.startY

// 判断手指滑动的距离,只有为正数才代表用户下拉了。

if (move > 0) {

// 阻止默认事件

e.preventDefault()

// 增加滑动阻力的感觉

this.moveDistance = Math.pow(move, 0.8)

if (this.moveDistance > 50) {

// 如果滑动距离大于50 ,moveState状态更新为释放即可刷新

if (this.moveState === 1) return

this.moveState = 1

} else {

// 否则 恢复原样

if (this.moveState === 0) return

this.moveState = 0

}

}

}

touchEnd(e) {

// 如果正在加载 则阻住触发

if (this.moveState === 2) return

// 只要手指拿开,加上结束时的动画

this.duration = 300

if (this.moveDistance > 50) {

// 手指松开之后,就开始变成加载中的状态了

this.moveState = 2

this.moveDistance = 50

// 在家中,开始刷新页面数据,刷新之后有一个回调函数

this.$emit('refresh', () => {

// 这里就是成功后的回调了,如果该函数被调用,那就以为着加载数据完成,所以状态要回到0,当然需要在父组件调用。

this.moveState = 0

this.moveDistance = 0

})

} else {

// 否则 回到初始状态

this.moveDistance = 0

}

}

4. 下拉动画

使用vue的钩子函数computed计算样式

computed: {

style() {

return {

transition: `${this.duration}ms`,

transform: `translate3d(0,${this.moveDistance}px, 0)`

}

}

}

html加上style,形成动画

至此,我们完成了基本的下拉刷新的功能组件,但是我们还可以进一步优化这个组件,比如说页面有个手势触发之后,下拉的手势就需要禁止掉,这个时候我们需要考虑到。阻止事件的触发stop属性由父组件传进来,根据这个stop值,我们控制事件的触发与否

更改代码如下

el.addEventListener('touchstart', e => {

// 根据stop值阻止事件触发

!this.stop && this.touchStart(e)

})

el.addEventListener('touchmove', e => {

// 根据stop值阻止事件触发

!this.stop && this.touchMove(e)

})

el.addEventListener('touchend', e => {

// 根据stop值阻止事件触发

!this.stop && this.touchEnd(e)

})

完整的下拉刷新的组件就全部完成了,下面就是怎么引用这个组件了

使用组件

import pullRefresh from '/pullRefresh.vue'

components: {pullRefresh}

// html

...

// 方法

refresh() {

// 刷新页面,重新请求接口

}

html仿照聊天下拉刷新,h5实现下拉刷新,模拟原生下拉刷新,封装组件相关推荐

  1. 开发一个出生年份的下拉选择框供用户选择_你的下拉式菜单设计对了吗?

    追波范儿(dribbbledesign)------------------------------------------- 下拉菜单主要有两种类型:1. 用于导航的下拉菜单:2. 用于表单的下拉菜 ...

  2. 用vant框架做H5时踩过的坑(下拉刷新、上拉加载等)

    用vant框架做H5时踩过的坑 1. 页面在手机端不能上下滑动,在PC端浏览器正常滑动 说明:在设置了overflow:auto;属性的前提下,H5页面在PC端浏览器里展示可以上下滑动,在ios上可正 ...

  3. h5结合vant框架,实现列表上拉加载下拉刷新

    最近在做h5移动页面开发,并且需要用移动端android和ios将h5嵌进去.在开发过程中,使用了vant这个框架: vant文档:https://youzan.github.io/vant/#/zh ...

  4. android下拉刷新动画效果代码_vue项目实录:下拉刷新组件的开发及slot的使用

    "下拉刷新"和"上滑加载更多"功能在前端.尤其是移动端项目中非常重要,这里笔者由曾经做过的vue项目中的"blink"功能和各位探讨下[下拉 ...

  5. html下拉加载实现原理,GitHub - sybiele/wxPull: 原生JS实现微信公众号或网页使用下拉加载和上拉刷新...

    原生JS实现微信公众号或网页使用下拉加载和上拉刷新 微信浏览器打开网页显示网址安全信息解决办法,网上很多办法,也找了很久,但是最新的很多用不了. 先看看效果,是不是亲想要的,可以跳过,以免浪费宝贵时间 ...

  6. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 因为公司人员变动原因,导致了博主四个月没有动安卓,一直在做IOS开发,如今接近年前,终于可以花一定的时间放在安卓上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下 ...

  7. Linux下构建 uniapp h5 应用(非命令行创建项目)

    最近公司有git提交uniapp项目之后自动部署h5的需求,故有了此文章.大致流程就是git提交代码后通过Webhooks触发git拉取,然后在Linux主机上编译构建,接下来就是实际操作(省略了gi ...

  8. 扒一扒那些叫欧拉的定理们(十)——群论观点下的欧拉公式进阶

    早点关注我,精彩不迷路! 在欧拉系列前面的文章中,我们已经从欧拉定理讲到了欧拉公式,相关内容请戳: 扒一扒那些叫欧拉的定理们(九)--群论观点下的欧拉公式初步 扒一扒那些叫欧拉的定理们(八)--欧拉公 ...

  9. “是男人就下一百层”h5游戏全网最详细教学、全代码,js操作

    "是男人就下一百层"h5游戏全网最详细教学.全代码,js操作 博主的话 游戏展示 编程工具介绍 游戏代码 代码讲解 js 第一步 切换div的显示与隐藏 js 第二步 在菜单页面用 ...

最新文章

  1. React 循环渲染 5
  2. 微软hackathon_武汉Hackathon的黑客之路–开发人员如何抗击COVID-19
  3. nagios 监控NFS
  4. java学习笔记12--异常处理
  5. win32 api setwindowlong 第2个参数_FME与MapBox 01:等时圈(Isochrone)API
  6. Yii Model中添加默认搜索条件
  7. 群晖218J安装mysql_ds216(群晖218j可以换内存吗)
  8. Angular中修改第三方组件的样式 - zorro日期选择器右端不对齐的BUG
  9. 邀请 | 关于微软容器服务,你需要知道的二三事
  10. 串口发送通信---UART发送---STM32F4实现
  11. LeetCode每日打卡 - 汉明距离总和
  12. 关于ORM的一些外文资料
  13. 微控制器MCU四大平台你了解多少?(一)
  14. Raki的读paper小记:MEMORY REPLAY WITH DATA COMPRESSION FOR CONTINUAL LEARNING
  15. 我做的第一个PHP网站
  16. 仿美团外卖小程序源码
  17. vue学习之监听浏览器宽度
  18. 建设内链要注意的事项
  19. 微信Mars-xlog日志加密踩坑指南
  20. 已解决 You can enable repos with yum-config-manager --enable <repo>

热门文章

  1. Linux 的md5sum命令
  2. 小马哥----高仿红米note m8207 2015 0813纸标贴 刷机拆机主板图与开机识别图
  3. 竞争性谈判需要遵循哪些原则?
  4. GCC 编译命令和基本使用
  5. 非DDS卡发送彩信(MMS)业务流程介绍
  6. 微信小程序开发之开发引导页面
  7. 开发使用air还是pro_「爱范儿」第四代 iPad Air 评测:性能向 Pro 看齐,续航比 Pro 更强,为啥有人说不香?...
  8. 输入生日,计算到目前为止的天数,以及活到10000天的日期
  9. 被判死刑的飞信,中移动要“复活”它丨价值观点
  10. python 基础练习 字母图形