参考资料

现代化懒加载的方式
设计无限滚动下拉加载,实践高性能页面真谛

这里的下拉加载是翻页的代替,
即首次加载10条数据,当用户翻到最后一条数据后,自动加载数据实现翻页效果

不是移动端的下拉刷新(无需监听手势

way1

实现思路:
1、监听页面的用户的滚动事件,
当用户翻到了底部(内容页的底部) 就新加载数据

同时注意:1、节流 2、需要一个标识位,当加载数据时 监听无效

  1. // 节流函数
  2. $(document).scroll(function () {
  3. if (($(document).scrollTop() + window.innerHeight === $(document).height())
  4. && window.scrollTag === undefined
  5. )
  6. {
  7. window.scrollTag = true;
  8. // 显示loading效果
  9. $('.question-list-loading').html('<i class="iknow-icons">&#xe6a6;</i><span>加载中</span>');
  10. this.getdata()
  11. .then(res=>{
  12. window.scrollTag = false;
  13. })
  14. }

way2

优化:
if (($(document).scrollTop() + window.innerHeight === $(document).height())

===》 某元素在可视区域了怎么判断

  1. let scrTop = getTop();
  2. let windowHeight = document.documentElement.clientHeight;
  3. function getTop() {
  4. return document.documentElement.scrollTop || document.body.scrollTop;
  5. }
  6. function getOffset(node) {
  7. return node.getBoundingClientRect().top + scrTop;
  8. }
  9. function inView(node) {
  10. // 设立阈值
  11. const threshold = 0;
  12. const viewTop = scrTop;
  13. const viewBot = viewTop + windowHeight;
  14. const nodeTop = getOffset(node);
  15. const nodeBot = nodeTop + node.offsetHeight;
  16. const offset = (threshold / 100) * windowHeight;
  17. console.log((nodeBot >= viewTop - offset), (nodeTop <= viewBot + offset))
  18. return (nodeBot >= viewTop - offset) && (nodeTop <= viewBot + offset)
  19. }

way3

下拉到底部之后发送ajax异步请求,成功之后的回调里进行页面拼接
存在的问题:
1、图片:
当加载后的内容插入到页面中时,浏览器就开始获取图片。这意味着所有的图像同时下载,浏览器中的下载通道将被占满。同时,由于内容优先于用户浏览而加载,所以可能被迫下载底部那些永远也不会被用户浏览到的图像。

解决思路:
即一次性请求下一页的10个也是不明智的,在有图片的下拉加载里,最好 加配个懒加载

2、真正的页面底部时才进行加载和渲染
==》用户较长时间等待

解决思路:
设置一个合理阈值,在用户滚动到页面底部之前,先进行提前加载

3、页面滚动事件
是否必须,还有出路吗 (因为监听是耗能的

解决思路:
防抖
标志位
滚动的主动询问
(现代化:IntersectionObserver 这个放在wayx说

1)Throttle允许我们限制激活响应的数量。我们可以限制每秒回调的数量。反过来,也就是说在激活下一个回调之前要等待多少时间; (节流
2)Debounce意味着当事件发生时,我们不会立即激活回调。相反,我们等待一定的时间并检查相同的事件是否再次触发。如果是,我们重置定时器,并再次等待。如果在等待期间没有发生相同的事件,我们就立即激活回调。(弹簧

滚动的主动询问:
把滚动事件替换为一个带有计时器的滚动处理程序,每100毫秒进行简单检查,看这段时间内用户是否滚动过。如果没有,则什么都不做;如果有,就进行处理。

4、dom操作
针对这部分的优化:dom缓存

超前阈值的懒加载+DOM Cache和图片Cache+滚动throttle模拟+CSS fadeIn

  1. <div class="exp-list-box" id="expListBox">
  2. <ul class="exp-list" id="expList">
  3. {
  4. list.map(item =>(
  5. <div class="slide">
  6. <li>
  7. <a href={item.href}>
  8. <img class="img" src="default.png" data-src={item.src}/>
  9. <strong></strong>
  10. <span class="writer">{item.writer}</span>
  11. <span class="good-num">{item.num}</span>
  12. </a>
  13. </li>
  14. </div>
  15. ))
  16. }
  17. </ul>
  18. <div class="ui-refresh-down"></div>
  19. </div>

请求返回的数据dataList可以理解为由9个对象构成的数组,也就是说,每次请求加载9个block-item。

  1. .slide .img{
  2. display: inline-block;
  3. width: 90px;
  4. height: 90px;
  5. margin: 0 auto;
  6. opacity: 0;
  7. -webkit-transition: opacity 0.25s ease-in-out;
  8. -moz-transition: opacity 0.25s ease-in-out;
  9. -o-transition: opacity 0.25s ease-in-out;
  10. transition: opacity 0.25s ease-in-out;
  11. }

image的opacity设置为0,图片将会在成功请求并渲染后调整为1,辅助transition属性实现一个fade in效果(用户体验)

IntersectionObserver


vue-lazyload

https://juejin.im/post/59bf501ff265da06602971b9

其他

1、用户体验:
在图像加载完成时,使用淡入(fade in)效果出现。这在实际情况上会稍微慢一下,应该慢一个过渡执行时间。但用户体验上感觉会更快。这是已经被证实且普遍应用的小“trick”。