JavaScript实现图片滚动加载与刷新回顶部的完整方案
本文解析如何利用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属性。此处不再罗列具体代码。
AOS.js 动画不触发怎么办?排查 DOM 加载与移动端兼容问题
2026-11-05 17:02:26
sigma.js 怎么实现节点点击、拖拽与悬停提示交互
2026-11-05 15:03:27
Matter.js 与 PixiJS/Three.js 集成:分离物理计算与渲染
2026-11-05 13:43:48
主流JS弹幕库选型指南:Danmaku.js等库的功能与体积对比
2026-11-05 09:28:19
JavaScript点击事件监听与交互效果实例
2026-11-05 09:10:19
