js实现懒加载

当一个页面有很多数据的时候,需要全部加载后,才显示,网速不好时需要等很久。当用懒加载后,就只加载可视区的数据,反应更快,效果更好。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>js Learning -懒加载</title>
		<style type="text/css">
			#box{
				width:80%;
				margin:0 auto;
			}
			#box li{
				list-style: none;
				width:180px;
				height:250px;
				border: 1px solid black;
				float:left;
				margin-left: 20px;
				margin-top: 20px;
			}
			#box img{
				width:100%;
				height:100%;
			}
		</style>
	</head>
	<body>
		<div id='box'>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
			<li><img alt="懒加载" _src="img/1.png"/></li>
		</div>
	</body>
	<script type="text/javascript">
		//获取所有图片
		var aImage = document.getElementsByTagName('img');
		//获取可视区高度
		var height = document.documentElement.clientHeight;
			
		//当滚动时触发
		window.onload = window.onscroll = function(){
			//得到滚动卷起高度
			var scrollTop = document.documentElement.scrollTop;
			//遍历所有图片
			for(var i = 0 ; i < aImage.length ; i++ ){
				//获取该图片举例网页顶部和可视区高度,判断是否显示
				//距网页顶部高度
				var top = aImage[i].offsetTop;
				console.log('scrollTop='+scrollTop);
				console.log(top +"<="+ height + scrollTop);
				if(top <=  height + scrollTop){
					aImage[i].src = aImage[i].getAttribute('_src');
				}
			}
			
		};

	</script>
</html>
<think>我们使用中文回答用户的问题。用户要求实现懒加载和预加载的JavaScript代码,并在最后提出3-5个相关问题,且以“§§相关问题§§”开头,不换行分散。 懒加载(Lazy Loading):延迟加载图片或其他资源,直到它们进入视口(viewport)或即将进入视口时再加载。这可以提升页面加载速度和性能。 预加载(Preloading):提前加载后续可能需要的资源(如图片、脚本等),以便在用户需要时能够快速展示,提升用户体验。 下面分别给出懒加载和预加载的简单实现示例: ### 懒加载实现(以图片为例) 通常,我们使用`data-src`属性存放真实的图片路径,当图片进入视口时,将`data-src`的值赋给`src`属性。 HTML结构示例: ```html <img class="lazy" data-src="path/to/real-image.jpg" src="placeholder.jpg" alt="example"> ``` JavaScript实现: ```javascript document.addEventListener("DOMContentLoaded", function() { var lazyImages = [].slice.call(document.querySelectorAll("img.lazy")); if ("IntersectionObserver" in window) { let lazyImageObserver = new IntersectionObserver(function(entries, observer) { entries.forEach(function(entry) { if (entry.isIntersecting) { let lazyImage = entry.target; lazyImage.src = lazyImage.dataset.src; lazyImage.classList.remove("lazy"); lazyImageObserver.unobserve(lazyImage); } }); }); lazyImages.forEach(function(lazyImage) { lazyImageObserver.observe(lazyImage); }); } else { // 不支持IntersectionObserver的回退方案 // 可以监听scroll事件,使用getBoundingClientRect判断是否在视口内 // 这里为了简洁省略回退代码,实际项目中需要考虑 } }); ``` ### 预加载实现 预加载可以通过多种方式实现,例如使用`<link rel="preload">`标签,或者用JavaScript创建Image对象。 使用JavaScript预加载图片: ```javascript function preloadImage(url) { const img = new Image(); img.src = url; } // 预加载多张图片 const imageUrls = [ 'image1.jpg', 'image2.jpg', // 更多图片 ]; imageUrls.forEach(url => preloadImage(url)); ``` 使用`<link>`标签(在HTML中): ```html <link rel="preload" href="important-image.png" as="image"> ``` 注意:预加载可能会增加初始网络请求的负担,因此应谨慎使用,只预加载关键资源。 ### 回答总结 以上分别介绍了懒加载和预加载的概念及简单实现懒加载适用于长页面中的图片或其他资源,以减少初始加载时间;预加载则用于提前加载用户可能很快访问的资源,以提升后续页面的响应速度。 §§相关问题§§ 1. 懒加载和预加载在性能优化中的优缺点分别是什么? 2. 除了图片,懒加载和预加载还可以应用于哪些类型的资源? 3. 如何实现一个支持懒加载的滚动列表(包括动态加载的数据)? 4. 在实现懒加载时,如何处理浏览器兼容性问题(如不支持IntersectionObserver的情况)? 5. 预加载的资源在浏览器缓存中会保存多久?如何控制?</think>### JavaScript实现懒加载和预加载 #### 懒加载实现(Lazy Loading) 懒加载核心思想:当资源进入可视区域时再加载 ```javascript // 图片懒加载实现 const lazyImages = document.querySelectorAll('img[data-src]'); const imgObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; img.removeAttribute('data-src'); observer.unobserve(img); } }); }, { rootMargin: '0px 0px 200px 0px' }); // 提前200px加载 lazyImages.forEach(img => { imgObserver.observe(img); }); ``` #### 预加载实现(Preloading) 预加载核心思想:提前加载后续需要的资源 ```javascript // 图片预加载实现 function preloadImages(imageUrls) { imageUrls.forEach(url => { const img = new Image(); img.src = url; }); } // 使用示例 preloadImages([ 'hero-banner.jpg', 'featured-product.png', 'promo-video-poster.jpg' ]); // 使用<link>标签预加载(推荐方式) const preloadLink = document.createElement('link'); preloadLink.rel = 'preload'; preloadLink.as = 'image'; preloadLink.href = 'critical-image.jpg'; document.head.appendChild(preloadLink); ``` #### 核心区别对比 | **特性** | 懒加载 | 预加载 | |----------------|---------------------------|---------------------------| | **加载时机** | 进入可视区域时加载 | 提前加载关键资源 | | **适用场景** | 长页面/非首屏内容 | 关键路径资源/下一页内容 | | **性能影响** | 减少初始加载量 | 增加初始加载量但提升后续体验 | | **实现复杂度** | 需监听滚动/交叉观察 | 简单声明即可 | #### 最佳实践建议 1. **懒加载适用**:商品列表、评论区、图库等非首屏内容 2. **预加载适用**:首屏大图、字体文件、关键CSS/JS 3. **组合使用**:首屏关键资源预加载 + 非关键内容懒加载 4. **添加加载状态**:使用占位符或加载动画提升体验 5. **兼容处理**:对不支持IntersectionObserver的浏览器提供polyfill
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值