前言
在app端常常看到类似加载数据的动画,接下来我们来实现滚动触底加载动画提示,以及如何复用这些逻辑。
如何判断滚动触底
来看下几张图:
情况一:
当文档高度还为超过可视区域高度时,不存在滚动,所以也没有滚动触底
情况二:
当文档高度超过可视区域的高度时,还有剩余的文档没有滚动完,也就是说 可视区域高度 + 滚动高度 < 文档高度
,此时没有达到滚动触底的条件
情况三:
文档高度大于可视区域,并且滚动到文档底部, 也就是说 可视区域高度 + 滚动高度 = 文档高度
判断是否滚动到底
经过上面三种情况的分析,我们需要拿到 可视区域的高度
, 滚动高度
, 文档高度
这三个变量来进行比较。
可视区域的高度
function getWindowHeight() { return document.documentElement.clientHeight; }
滚动高度
对有doctype申明的页面使用document.documentElement.scrollTop,safari特例独行:使用 window.pageYOffset
function getScrollHeight() { return Math.max(document.documentElement.scrollTop,window.pageYOffset||0) }
文档高度
function getDocumentTop() { return document.documentElement.offsetHeight; }
代码实现
触底打印
codepen 触底打印demo
通过监听滚动事件来判断 可视区域
, 滚动高度
, 文档高度
的关系,实现最基础的触底加载
<div id="app"> <ul> <li v-for="item in list" :key="item" > {{item}}</li> </ul> </div> created(){ // 初始化数据 this.list = Array.from(Array(10),(item,index)=>index) // 通过监听滚动事件来判断 可视区域 , 滚动高度 ,文档高度的关系 window.addEventListener('scroll',()=>{ let isBottom = (getScrollHeight() + getWindowHeight()) >= getDocumentTop() if(isBottom){ console.log('触底了',new Date()) let list = this.list let last = list[list.length-1] let newList = Array.from(Array(10),(item,index)=>index+last+1) this.list.push(...newList) } }) }
优化和复用滚动事件逻辑
将滚动逻辑抽取成 mixins 放在 scroll.js 中。优化功能点如下:
- 增加触底距离
- 滚动事件监听事件节流
- 添加触底动画,并将 UI 样式一起封装在 scroll.js 中
模拟请求事件
为了模拟请求数据,封装了一个 Promise 一秒后返回结果
methods:{ // 返回一个 promise ,用于请求服务端数据 findDataList(){ let list = this.list let last = list[list.length-1] return new Promise((resolve)=>{ // 模拟服务端数据 let newList = Array.from(Array(10),(item,index)=>index+last+1) setTimeout(() => { resolve(newList) }, 1000); }) } }
滚动事件监听
滚动事件触发,判断当前是否触底,触底了以后去执行 loadMore 发起请求拿取服务端的数据
created(){ let fn = throttle(()=>{ let isOver = (getScrollHeight() + getWindowHeight()) >= (getDocumentTop()- MIN_INSTANCE) // 触底时进行数据加载 if(isOver){ // 创建加载组件 this.loadMore&&this.loadMore() } },DEALY_TIME) window.addEventListener('scroll',fn) },
添加触底动画
因为我们是将逻辑抽离在 mixins中,为了把触底动画也集成在里面使用 Vue.extend() 来实现编程式插入UI样式的方法。
首先定义好 loading 组件的样式
<template> <div id="loading-alert"> <i class="el-icon-loading"></i> <span>{{ message }}</span> </div> </template> <script> export default { props:{ message:{ type:String, default:'正在加载更多数据' } }, };
当触底时去插入这个 loading 组件
import load from './load.vue' data(){ return { isLoading:false, component:null } }, created(){ let fn = throttle(()=>{ let isOver = (getScrollHeight() + getWindowHeight()) >= (getDocumentTop()- MIN_INSTANCE) // 触底时进行load组件显示 if(isOver){ // 判断loading组件是否已经存在,不存在就创建一个 if(!this.component){ this.component = extendComponents(load) } // 创建加载组件 this.loadMore&&this.loadMore() // 判断当前状态来控制loading的组件显示与否 if(!this.isLoading){ this.component.$el.remove() // 将loading组件置为空 this.component = null } } },DEALY_TIME) window.addEventListener('scroll',fn) },
详细代码
完整代码可以 点击查看 codepen 触底动画 关于上面代码中 extendComponents
方法的实现可以查看详细代码,也可以查看 Vue.extend 编程式插入组件
最后
将滚动触底的逻辑和 UI 都集成到 scroll.js 中,复用都方式可以放在 mixins 可以抽离成 v-directive,这样我们可以接受到绑定的 dom 不仅仅可以做 window 的滚动触底事件的判断,也可以 实现单个元素的滚动事件触底的监听
。后续可以在实现 v-directive 的版本。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]