js学习之原生js实现懒加载
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>
img{
width: 500px;
height: 500px;
display: block;
}
</style>
</head>
<body>
<div class = "box">
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
<img asrc = "img/2.jpg" src="" alt="img1"/>
</div>
</body>
<script type="text/javascript">
(function(){
function tagName(tagName){
return document.getElementsByTagName(tagName);
}function addEvent(obj,type,func){
if(obj.addEventListener){
obj.addEventListener(type,func,false);
}else if(obj.attachEvent){
obj.attachEvent('on'+type,func);
}
}
var v = {
eleGroup:null,
eleTop:null,
eleHeight:null,
screenHeight:null,
limitHeight:null
}
function init(element){
v.eleGroup = document.getElementsByTagName(element);
v.screenHeight = document.documentElement.clientHeight;
var len = v.eleGroup.length;
for(var i = 0;i < len; i++){
if(v.eleGroup[i].offsetTop<v.screenHeight&&v.eleGroup[i].getAttribute("asrc")){
v.eleGroup[i].setAttribute("src",v.eleGroup[i].getAttribute("asrc"));
v.eleGroup[i].removeAttribute("asrc");
}
}
}
function lazyload(){
v.limitHeight = document.documentElement.scrollTop || document.body.scrollTop + document.documentElement.clientHeight;
var len = v.eleGroup.length;
for(var j = 0 ;j < len; j++){
if(v.eleGroup[j].offsetTop <= v.limitHeight&&v.eleGroup[j].getAttribute("asrc")){
v.eleGroup[j].setAttribute("src",v.eleGroup[j].getAttribute("asrc"));
v.eleGroup[j].removeAttribute("asrc");
}
}
}
init("img");
addEvent(window,"scroll",lazyload);
})()
</script>
</html>
我们知道了浏览器加载img是很耗费资源的,还有带宽,而且还有一个特点就是如果没有设置img的src属性,就不会消耗这些资源,所以我们用到的加载的方法就是首先将所有img的src置空,然后自定义一个asrc属性,这里放的是实际的src,当我们需要加载这张图片时就可以获取img的这个属性,并将其值赋值给src,实现图片的加载。
思路:首先在当前可视化的区域加载图片,首先需要获取浏览器的高度,然后查询每个元素相对浏览器顶部距离,然后加载满足:相对浏览器顶部的距离小于浏览器高度的图片,实现对可视化区域的初始化填充。
真正实现懒加载的原理是:获取当前元素距离浏览器顶部的高度,与浏览器+scroll卷到上面的高度相比较,如果前者小于后者就代表轮到这张图片显示了!就把它加载出来。
ps:需要注意的地方
addEventListener VS attachEvent
前者兼容主流浏览器,后者兼容ie(ie6及更高级版本兼容,低于ie6未测试)
document.documentElement VS document.body
ie默认的box-sizing为border-box不会将html识别为盒模型,所以用document.documentElement就获取不到clientHeight scrollHeight等值。所以使用
document.documentElement.scrollTop || document.body.scrollTop
可以解决兼容性问题
js学习之原生js实现懒加载的更多相关文章
- 001_Chrome 76支持原生HTML 图片懒加载Lazy loading
Table Of Content 什么是懒加载? 语法参数及使用方式? 有哪些特点? 与js有关的实践 什么是懒加载? 技术背景 Web应用需要经常向后台服务器请求资源(通过查询数据库,是非常耗时耗资 ...
- Spring5.0源码学习系列之浅谈懒加载机制原理
前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文挑一个比较重要的知识点Bean的懒加载进行学习 1.什么是懒加载? 懒加载(Lazy-ini ...
- 原生 JS 实现最简单的图片懒加载
懒加载 什么是懒加载 懒加载其实就是延迟加载,是一种对网页性能优化的方式,比如当访问一个页面的时候,优先显示可视区域的图片而不一次性加载所有图片,当需要显示的时候再发送图片请求,避免打开网页时加载过多 ...
- Vue-Router学习第二弹动态路由\懒加载\嵌套路由
在我们做项目时肯定会有出现动态路由: 举个栗子: 一个品种的商品页面会有同类不同样的商品就要在路由的后面加一个id: Vue的路由id是这样添加的: 两种动态路由 一种是params参数添加: 首先现 ...
- 原生javascript代码懒加载
1.先定义需要懒加载的样式: class="lazyload" 2.设置初始透明度为0.1: .lazyload{ filter: Alpha(opacity=10); -moz- ...
- 【转】ViewPager学习笔记(一)——懒加载
在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...
- [转]ViewPager学习笔记(一)——懒加载
在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...
- Swift 学习一函数&函数属性&懒加载
函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值} func 函数名(参数列表){ // 返回值为Void 可 ...
- Chrome 75 将原生支持图片懒加载
4 月 6 日,Google 的 Chrome & Web 平台工程经理 Addy Osmani 在个人博客发文,介绍到 <img> 和 <iframe> 的 load ...
随机推荐
- vue-cli 发布部署IIS
有些时候我们的服务器不用的是node,也许是IIS,这样就需要把工程构建出来,与IIS集成. 构建的命令如下 cnpm run build 将其中的dist文件夹拷贝出来,放到IIS的发布目录,在浏览 ...
- python向config、ini文件读取写入
config读取操作 cf = configparser.ConfigParser() # 实例化对象 cf.read(filename) # 读取文件 cf.sections() # 读取secti ...
- python数据类型、if判断语句
python的数据类型: int(整型) float(浮点型) #相较c++,去除了char.long.longlong... str(字符串) #同等c++ sting类型 list(列表) ...
- intellij idea 汉化
intellij idea是IDEA的全称,现在最新版本的是intellij idea 16.这是一款公认的比较好的用于编程的软件.但是每次软件的发布都是全英文的,这让英文不好的人很是头疼.现在我告诉 ...
- Revit 模态框
非模态窗口有一个好处,就是可以一直停留在程序之前,然后持续完成操作.但是在Revit二次开发中,非模态窗口也有几个注意事项. 1.需要在文档关闭的时候,把非模态窗口也关闭掉,不然会导致文档关闭,窗口还 ...
- Vue.js中记不住 的东西
给样式背景赋值: :style="{backgroundImage:'url(' + otherInfo.head_image + ')'}" <img :src=" ...
- 分布式一致性算法2PC和3PC
为了解决分布式一致性问题,产生了不少经典的分布式一致性算法,本文将介绍其中的2PC和3PC.2PC即Two-Phase Commit,译为二阶段提交协议.3PC即Three-Phase Commit, ...
- 设计一函数,求整数区间[a,b]和[c,d]的交集
问题: 设计一函数,求整数区间[a,b]和[c,d]的交集.(c/c++.Java.Javascript.C#.Python) 1.Python: def calcMixed(a,b,c,d): r ...
- 5.SLB排错思路
500/502/504可能的原因: https://help.aliyun.com/knowledge_detail/55207.html 请求不均衡可能的原因: https://help.aliyu ...
- Linux命令学习——strings
strings命令的作用是打印文件中的可打印字符. 常用的参数有: -f --print-file-name,在每个输出的字符串前打印文件名. -t [radix] --radix=[radix],输 ...