JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析


Posted in Javascript onMay 24, 2016

淘宝图片处理讨论
淘宝网页面很大,但是打开速度很快。其对图片处理是运用了滚动加载,就是滚动轴滚到哪里,图片在哪里加载。但是你想查看他的源代码,那要费九牛二虎之力吧,因为他们代码压缩合并做的很好!因为图片是滚动加载的,初始化的时候图片不加载,那么当你在页面底部刷新页面的时候,底部的页面通常不会加载出来,淘宝网的做法貌似是(因为我没有看他们的源代码,只是凭操作),刷新让页面回到顶部。

模仿淘宝,做滚动图片加载
这里想到了三种方法:
1.javascript懒加载之可视区域加载

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>haorooms前端博客-可视区域加载之 javascript</title>
  <style>
  img{width:100%;margin-bottom: 30px; min-height: 400px; background-color: #ddd;}

  </style>
</head>
<body>
  <img haoroomslazyload="Chrysanthemum.jpg" src="" >
  <img haoroomslazyload="Desert.jpg" src="" >
  <img haoroomslazyload="Hydrangeas.jpg" src="" >
  <img haoroomslazyload="Koala.jpg" src="" >
  <img haoroomslazyload="Lighthouse.jpg" src="" >
  <img haoroomslazyload="Penguins.jpg" src="" >
  <img haoroomslazyload="Tulips.jpg" src="" >
  <script>
  var imgNum=document.getElementsByTagName('img').length;
  var imgObj=document.getElementsByTagName("img");
  var l=0;

    window.onscroll=function(){
        var seeHeight = document.documentElement.clientHeight;
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        for(var i=l;i<imgNum;i++){
          if(imgObj[i].offsetTop < seeHeight + scrollTop){
            console.log(imgObj[i].getAttribute("src"));
            console.log(imgObj[i].src );
            if(imgObj[i].getAttribute("src") == ""){
              imgObj[i].src = imgObj[i].getAttribute("haoroomslazyload");
            }
          }
          if(imgObj[i].offsetTop > seeHeight + scrollTop){
            l=i;
            break;
          }
        }
    }

</script>

大家注意看我的两个console输出,console.log(imgObj[i].src );获取的是整个浏览器地址!
2.jquery懒加载之可视区域加载
上面的js用jquery翻译版!

var l=0
//js方法翻译版
$(window).bind("scroll", function(event){

        for(var i=l;i<$("img").length;i++){
          if($("img").eq(i).offset().top < parseInt($(window).height()) + parseInt($(window).scrollTop())){
            if($("img").eq(i).attr("src") == ""){
              var lazyloadsrc=$('img').eq(i).attr("haoroomslazyload");
              $("img").eq(i).attr("src",lazyloadsrc);
            }
          }
          if($("img").eq(i).offset().top > parseInt($(window).height()) + parseInt($(window).scrollTop())){
            l=i;
            break;
          }
        }

 });

3.可视区域加载延伸
例如一个动画效果,或者一个canvas图片,我想达到的效果是,初始进来不加载,当滚动到这个动画或者图表上面的时候,进行加载,那么我们就可以根据上面的代码进行如下改进:

$(window).bind("scroll", function(event){

     //窗口的高度+看不见的顶部的高度=屏幕低部距离最顶部的高度 
      var thisButtomTop = parseInt($(window).height()) + parseInt($(window).scrollTop()); 
      var thisTop = parseInt($(window).scrollTop()); //屏幕顶部距离最顶部的高度 
        var PictureTop = parseInt($("你的要滚动加载的ID").offset().top); 
         if (PictureTop >= thisTop && PictureTop <= thisButtomTop) {
         // $("#你的要滚动加载的ID").attr("src", $("#你的要滚动加载的ID").attr("haoroomslazyload")); 

          //此处可以执行你的加载函数,加载函数由原来的document.ready中,移到这里来!



         }
})

刷新回顶部
当我们做了可视区域加载的时候,通常让其刷新回到顶部。像淘宝那样。刷新回顶部。
我不知道淘宝网是如何做的。刷新回顶部,我用到的是onbeforeunload 事件。
onbeforeunload与onunload事件,onunload和onbeforeunload都是在刷新或关闭时调用,可以在< script>脚本中通过window.onunload来指定或者在< body>里指定。区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行。
Onbeforeunload也是在页面刷新或关闭时调用,Onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取;而onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用。Onunload是无法阻止页面的更新和关闭的。而 Onbeforeunload 可以做到。
1.页面加载时只执行onload
2.页面关闭时先执行onbeforeunload,最后onunload
3.页面刷新时先执行onbeforeunload,然后onunload,最后onload。
刷新回顶部就是用这个事件,可以这么写。

window.onbeforeunload  =  function(){$(window).scrollTop(0);}

当网站所有的图片都用了可是区域加载,css和js都合并压缩了,那我们的网站速度和性能会提升很多!
假如你想做成淘宝那样,你可以改进一下代码。
其实延迟加载的思路就是先把图片放在一个data-src或者一个属性中,当页面滑动到可视区域内时,把存起来的图片地址赋值给src就可以了。
这里我就不罗列代码了。

Javascript 相关文章推荐
json 实例详细说明教程
Oct 31 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
Jan 26 Javascript
JavaScript通过元素的ID和name设置样式
Jul 08 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
Sep 05 Javascript
js带点自动图片轮播幻灯片特效代码分享
Sep 07 Javascript
利用JS实现页面删除并重新排序功能
Dec 09 Javascript
关于使用js算总价的问题
Jun 23 Javascript
npm全局模块卸载及默认安装目录修改方法
May 15 Javascript
解决vue v-for 遍历循环时key值报错的问题
Sep 06 Javascript
基于JavaScript伪随机正态分布代码实例
Nov 07 Javascript
微信小程序实现锚点跳转
Nov 23 Javascript
Vue实现动态查询规则生成组件
May 27 Vue.js
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 #Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 #Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 #Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
May 24 #Javascript
JQuery点击事件回到页面顶部效果的实现代码
May 24 #Javascript
JavaScript中判断数据类型的方法总结
May 24 #Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 #Javascript
You might like
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
ext jquery 简单比较
2010/04/07 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
深入解析Python中函数的参数与作用域
2016/03/20 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
解决python flask中config配置管理的问题
2019/07/26 Python
python 标准差计算的实现(std)
2019/07/29 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
python 实现性别识别
2020/11/21 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
酒店秘书求职信范文
2014/02/17 职场文书
关于旅游的活动方案
2014/08/15 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
实名检举信范文
2015/03/02 职场文书
2014年个人总结范文
2015/03/09 职场文书
最美乡村教师观后感
2015/06/11 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript