html仿照聊天下拉刷新,h5实现下拉刷新,模拟原生下拉刷新,封装组件
上一篇,我们实现了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实现下拉刷新,模拟原生下拉刷新,封装组件相关推荐
- 开发一个出生年份的下拉选择框供用户选择_你的下拉式菜单设计对了吗?
追波范儿(dribbbledesign)------------------------------------------- 下拉菜单主要有两种类型:1. 用于导航的下拉菜单:2. 用于表单的下拉菜 ...
- 用vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
用vant框架做H5时踩过的坑 1. 页面在手机端不能上下滑动,在PC端浏览器正常滑动 说明:在设置了overflow:auto;属性的前提下,H5页面在PC端浏览器里展示可以上下滑动,在ios上可正 ...
- h5结合vant框架,实现列表上拉加载下拉刷新
最近在做h5移动页面开发,并且需要用移动端android和ios将h5嵌进去.在开发过程中,使用了vant这个框架: vant文档:https://youzan.github.io/vant/#/zh ...
- android下拉刷新动画效果代码_vue项目实录:下拉刷新组件的开发及slot的使用
"下拉刷新"和"上滑加载更多"功能在前端.尤其是移动端项目中非常重要,这里笔者由曾经做过的vue项目中的"blink"功能和各位探讨下[下拉 ...
- html下拉加载实现原理,GitHub - sybiele/wxPull: 原生JS实现微信公众号或网页使用下拉加载和上拉刷新...
原生JS实现微信公众号或网页使用下拉加载和上拉刷新 微信浏览器打开网页显示网址安全信息解决办法,网上很多办法,也找了很久,但是最新的很多用不了. 先看看效果,是不是亲想要的,可以跳过,以免浪费宝贵时间 ...
- Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件
前言: 因为公司人员变动原因,导致了博主四个月没有动安卓,一直在做IOS开发,如今接近年前,终于可以花一定的时间放在安卓上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下 ...
- Linux下构建 uniapp h5 应用(非命令行创建项目)
最近公司有git提交uniapp项目之后自动部署h5的需求,故有了此文章.大致流程就是git提交代码后通过Webhooks触发git拉取,然后在Linux主机上编译构建,接下来就是实际操作(省略了gi ...
- 扒一扒那些叫欧拉的定理们(十)——群论观点下的欧拉公式进阶
早点关注我,精彩不迷路! 在欧拉系列前面的文章中,我们已经从欧拉定理讲到了欧拉公式,相关内容请戳: 扒一扒那些叫欧拉的定理们(九)--群论观点下的欧拉公式初步 扒一扒那些叫欧拉的定理们(八)--欧拉公 ...
- “是男人就下一百层”h5游戏全网最详细教学、全代码,js操作
"是男人就下一百层"h5游戏全网最详细教学.全代码,js操作 博主的话 游戏展示 编程工具介绍 游戏代码 代码讲解 js 第一步 切换div的显示与隐藏 js 第二步 在菜单页面用 ...
最新文章
- React 循环渲染 5
- 微软hackathon_武汉Hackathon的黑客之路–开发人员如何抗击COVID-19
- nagios 监控NFS
- java学习笔记12--异常处理
- win32 api setwindowlong 第2个参数_FME与MapBox 01:等时圈(Isochrone)API
- Yii Model中添加默认搜索条件
- 群晖218J安装mysql_ds216(群晖218j可以换内存吗)
- Angular中修改第三方组件的样式 - zorro日期选择器右端不对齐的BUG
- 邀请 | 关于微软容器服务,你需要知道的二三事
- 串口发送通信---UART发送---STM32F4实现
- LeetCode每日打卡 - 汉明距离总和
- 关于ORM的一些外文资料
- 微控制器MCU四大平台你了解多少?(一)
- Raki的读paper小记:MEMORY REPLAY WITH DATA COMPRESSION FOR CONTINUAL LEARNING
- 我做的第一个PHP网站
- 仿美团外卖小程序源码
- vue学习之监听浏览器宽度
- 建设内链要注意的事项
- 微信Mars-xlog日志加密踩坑指南
- 已解决 You can enable repos with yum-config-manager --enable <repo>
热门文章
- Linux 的md5sum命令
- 小马哥----高仿红米note m8207 2015 0813纸标贴 刷机拆机主板图与开机识别图
- 竞争性谈判需要遵循哪些原则?
- GCC 编译命令和基本使用
- 非DDS卡发送彩信(MMS)业务流程介绍
- 微信小程序开发之开发引导页面
- 开发使用air还是pro_「爱范儿」第四代 iPad Air 评测:性能向 Pro 看齐,续航比 Pro 更强,为啥有人说不香?...
- 输入生日,计算到目前为止的天数,以及活到10000天的日期
- 被判死刑的飞信,中移动要“复活”它丨价值观点
- python 基础练习 字母图形