<!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实现懒加载的更多相关文章

  1. 001_Chrome 76支持原生HTML 图片懒加载Lazy loading

    Table Of Content 什么是懒加载? 语法参数及使用方式? 有哪些特点? 与js有关的实践 什么是懒加载? 技术背景 Web应用需要经常向后台服务器请求资源(通过查询数据库,是非常耗时耗资 ...

  2. Spring5.0源码学习系列之浅谈懒加载机制原理

    前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文挑一个比较重要的知识点Bean的懒加载进行学习 1.什么是懒加载? 懒加载(Lazy-ini ...

  3. 原生 JS 实现最简单的图片懒加载

    懒加载 什么是懒加载 懒加载其实就是延迟加载,是一种对网页性能优化的方式,比如当访问一个页面的时候,优先显示可视区域的图片而不一次性加载所有图片,当需要显示的时候再发送图片请求,避免打开网页时加载过多 ...

  4. Vue-Router学习第二弹动态路由\懒加载\嵌套路由

    在我们做项目时肯定会有出现动态路由: 举个栗子: 一个品种的商品页面会有同类不同样的商品就要在路由的后面加一个id: Vue的路由id是这样添加的: 两种动态路由 一种是params参数添加: 首先现 ...

  5. 原生javascript代码懒加载

    1.先定义需要懒加载的样式: class="lazyload" 2.设置初始透明度为0.1: .lazyload{ filter: Alpha(opacity=10); -moz- ...

  6. 【转】ViewPager学习笔记(一)——懒加载

    在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...

  7. [转]ViewPager学习笔记(一)——懒加载

    在项目中ViewPager和Fragment接口框架已经是处处可见,但是在使用中,我们肯定不希望用户在当前页面时就在前后页面的数据,加入数据量很大,而用户又不愿意左右滑动浏览,那么这时候ViewPag ...

  8. Swift 学习一函数&函数属性&懒加载

    函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 {    代码块    return 返回值} func 函数名(参数列表){  // 返回值为Void 可 ...

  9. Chrome 75 将原生支持图片懒加载

    4 月 6 日,Google 的 Chrome & Web 平台工程经理 Addy Osmani 在个人博客发文,介绍到 <img> 和 <iframe> 的 load ...

随机推荐

  1. 整理 logging 2种方式

    第一种************************************************************************************************* ...

  2. Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...

  3. xpath 笔记

    from lxml import etree info = f.read()  # requests.get().text # print(info) selector=etree.HTML(info ...

  4. The component and implementation of a basic gradient descent in python

    in my impression, the gradient descent is for finding the independent variable that can get the mini ...

  5. python3+2 不换行打印,多用于进度条 process bar

    python3 不换行打印,多用于进度条 process bar process = 0 # process bar for i in user: process += 1 print("\ ...

  6. zk开机自动启动脚本

    [Unit] Description=Zookeeper service After=network.target [Service] User=www Group=www SyslogIdentif ...

  7. python-day6面向对象、类的继承

    @面向对象三大特性:封装encapsulation.继承inheritance.多态(一个接口,多个实现)polymorphism. @面向对象介绍http://www.cnblogs.com/ale ...

  8. pflag如何使用

    1 为何我对这个库感兴趣呢? 因为我想看看Kubernetes的源码,Kubernetes,Hugo啥的都是那这个解析的命令行参数 2 安装 go get github.com/spf13/pflag ...

  9. Python第9天

    迭代器(减少代码量增强可读性)和生成器(只能遍历一次):遵循迭代器协议,就是生成可迭代对象 生产者和消费者模型:可触发生成器运行的方法 直接调用next方法 用系统next+生成器的方法 send y ...

  10. MTK6261初始化待机流程