前端的那些事--懒加载

瀑布流

何为瀑布流布局,一般就是值图片等宽不等长,像下面这个车的图片,高度在这里插入图片描述不等,像瀑布一样往下排列,这种瀑布流布局在旅游类网站比较常见。
最简单的瀑布流:活用css3的新增属性:column-count:列数;这个定义了元素应该被划分的列数。

*{margin: 0px auto;}
.all{
	width: 630px;
	column-count:3;
}
.all div{
	width:200px;
	break-inside: avoid;
	border:1px solid;
}
<div class="all">
	<div style="height:100px">1</div>
	<div style="height:200px">2</div>
	<div style="height:200px">3</div>
	<div style="height:100px">4</div>
	<div style="height:100px">5</div>
	<div style="height:200px">6</div>
</div>

效果如下:
在这里插入图片描述

图片懒加载

打开页面页面全部展示的,那叫预加载,如果图片存放数量和内存都大,那么对于请求还是用户体验都是极差的,后台异步加载图片需要时间响应,具体图片加载过程参考js的时间线以及异步,如果等用户滑动滚动条到某个需要加载图片的区域,在加载对应区域需要展示的图片,那么就会优化一个页面的响应速度。

思路

图片放置的盒子是预加载的,那么可以在img标签把src的路径放空,把图片的路径放置到自定义属性上,等用户滑到指定区域,把自定义属性的图片路径拉到图片的路径上

代码

这里我使用的jq的代码环境,图片采用mock.js模拟图片数据

<ul class="all"></ul>
$(".all").append(function(){//添加节点
	let $_li = "";
	for(let i = 0; i < 45; i ++){//循环创建节点
		let hei = 100*~~(Math.random()*5+1);//图片随机高度
		let img = Mock.Random.image("230x"+hei+"/"+color()+"/FFF/&text=???");//Mock的创建图片语法接口
		$_li += `<li style="width:230px;height:${hei}px"><img class="img_node" data-src="${img}"/></li>`//创建图片并且把图片路径绑定到data-src中
	}
	return $_li
})

function color(){//随机16进制的颜色代码
	let col = "";
	var aryNum = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
	for(let i = 0; i < 6; i ++){
		col += aryNum[~~(Math.random()*aryNum.length)];//~~es新语法的取整,不熟悉的可以使用parseInt()
	}
	return col
}

function begin(){
	$(".img_node").not("[data-dia]").each(function(i,index){//对所有未绑定data-dia属性的元素遍历
		if($(this).offset().top <= $(window).height()+$(window).scrollTop()){//遍历元素距离距离顶部的高度和视窗的高度加上滚动条滑动距离高度的距离进行判断,小于后面的和说明图片到了需要加载的地方了
			$(this).attr('src', $(this).attr('data-src'));//把图片data-src的路径绑定到img的src上
			$(this).attr('data-dia',"true");//给已经加载的图片绑定data-dia属性,方便遍历没有加载的图片,同时也不会对已经加载图片的img做重复操作
		}
	})
}

window.addEventListener("scroll",fn(begin,1000));//绑定滚动条事件,使用1s延迟执行
			
function fn(callback,time){//使用防抖函数优化begin的触发
	let timer = null;
	return function(){
		clearInterval(timer);
		timer = setTimeout(callback,time)
	}
}

$(function(){//页面加载时触发一次,因为有些图片是放在页面打开可见位置,就需要把那些图片先加载出来
	begin();
})

关于防抖函数可以详看关于优化之防抖和节流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端图片懒加载(Image Lazy Loading)和路由懒加载(Route Lazy Loading)是两种不同的优化技术,用于提高用户体验和网站性能。 1. **图片懒加载**: - 图片懒加载是一种延迟加载策略,当用户滚动到图片所在位置时才加载图片,而不是在页面加载初期就全部加载。这有助于减少初始页面加载时间,尤其是在内容较多或图片数量较大的情况下。 - 常见实现方式包括使用Intersection Observer API(Intersection Observer API是一个浏览器原生API,用于检测元素是否进入视口),或者利用HTML的`<img>`标签的`srcset`和`loading`属性,如`loading="lazy"`。 - 相关问题: 1. 如何使用Intersection Observer API实现懒加载? 2. `srcset`和`loading="lazy"`如何协同工作? 3. 图片懒加载对SEO有影响吗? 2. **路由懒加载**: - 路由懒加载是针对单页应用(SPA)的一种优化,只在用户导航到特定路由时才加载该路由对应的组件或模块,而不是一开始就下载所有可能的页面内容。 - 这通常在服务器端渲染(SSR)、动态导入(Dynamic Import)或路由预加载(Preloading)时使用,比如React的`import()`函数或Vue的`require()`。 - 相关问题: 1. 如何在Vue中实现路由懒加载? 2. SSR和路由懒加载有什么区别? 3. 使用动态导入时如何处理异步依赖? 两者都是前端性能优化的重要手段,可以帮助提高网页的加载速度和用户交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值