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 相关文章推荐
超越Jquery_01_isPlainObject分析与重构
Oct 20 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
Mar 06 Javascript
javascript正则表达式之search()用法实例
Jan 19 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
Mar 14 Javascript
javascript实现链接单选效果的方法
May 13 Javascript
深入理解JavaScript中的for循环
Feb 07 Javascript
Bootstrap3 模态框使用实例
Feb 22 Javascript
详解webpack4之splitchunksPlugin代码包分拆
Dec 04 Javascript
详解wepy开发小程序踩过的坑(小结)
May 22 Javascript
layui 动态设置checbox 选中状态的例子
Sep 02 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
vue style width a href动态拼接问题的解决
Aug 07 Javascript
通过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 ci框架验证码实例分析
2013/06/26 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
web前端开发也需要日志
2010/12/09 Javascript
面向对象的Javascript之二(接口实现介绍)
2012/01/27 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
node读写Excel操作实例分析
2019/11/06 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
Final类有什么特点
2012/04/25 面试题
大二学生职业生涯规划书
2014/02/05 职场文书
学校募捐倡议书
2014/05/14 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
2015年妇女工作总结
2015/05/14 职场文书
详解MySQL中的主键与事务
2021/05/27 MySQL
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
Go遍历struct,map,slice的实现
2021/06/13 Golang