JavaScript实现图片滚动加载与刷新回顶部的完整方案

作者:白露时间:2026-10-30 07:25:12浏览:380

本文解析如何利用JavaScript或jQuery实现图片滚动加载,通过将图片地址暂存于自定义属性,滚动至可视区时赋值src以优化性能。同时介绍使用onbeforeunload事件在页面刷新时自动滚动至顶部,解决底部刷新内容未加载的问题,提升网站加载速度与用户体验。

淘宝图片滚动加载机制分析

淘宝网页面规模庞大,但打开速度依然迅速,其核心技巧在于运用了滚动加载机制,即只有当滚动轴滚动到特定位置时,该位置的图片才会被加载。虽然淘宝的代码经过高度压缩和合并,难以直接查看源码,但通过实际操作可以推测,当用户在页面底部刷新时,由于图片未加载,底部内容往往无法显示。因此,淘宝的做法似乎是让页面在刷新后自动回到顶部,以确保内容正常加载。

JavaScript与jQuery实现图片懒加载

为了模仿淘宝的滚动图片加载效果,这里探讨了三种实现思路:第一种是基于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.log(imgObj[i].src)获取的是完整的浏览器地址。第二种方法是使用jQuery实现的懒加载,即上述JavaScript代码的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;
          }
        }

 });

可视区域加载的延伸应用

第三种方法是对可视区域加载的延伸应用。例如,对于动画效果或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事件来实现刷新回顶部。onbeforeunload与onunload事件均在页面刷新或关闭时触发,可以通过window.onunload在<script>脚本中指定,或在<body>标签中指定。两者的区别在于,onbeforeunload在onunload之前执行,且可以阻止onunload的执行。Onbeforeunload在页面刷新或关闭时调用,此时尚未开始读取新的服务器页面;而onunload则在已从服务器获取到新页面、即将替换当前页面时调用。Onunload无法阻止页面的更新和关闭,而Onbeforeunload可以。具体执行顺序如下:1. 页面加载时仅执行onload;2. 页面关闭时先执行onbeforeunload,最后执行onunload;3. 页面刷新时先执行onbeforeunload,然后onunload,最后onload。利用这一特性,可以通过以下代码实现刷新回顶部:


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

网站性能优化总结

如果网站中的所有图片都采用了可视区域加载,并且CSS和JS都经过合并压缩,那么网站的加载速度和性能将得到显著提升。若想达到淘宝的效果,可以在此基础上改进代码。其实,延迟加载的核心思路是先将图片地址存储在data-src或其他自定义属性中,当页面滚动到可视区域内时,再将存储的图片地址赋值给src属性。此处不再罗列具体代码。


作者最新文章