原生js图片懒加载
来先看个效果图~

讲一下原理。首先为什么要使用懒加载呢?1、因为我们服务器软硬件资源是有限的要提高服务器效能。2、用户的时间是宝贵的节约加载时间。用户访问***加载哪里你好我好大家好~。3、用户的流量在今时今日已经不稀罕了!但是咱没必要让用户去等待无意义又浪费用户带宽和电量的东西哈。
说原理扯远了。懒加载实现原理很简单。浏览器加载img标签时候会对src地址的图片进行下载解析。这里打开就下载所有src的图片是不是有点~浪费时间、带宽、电量?对对对 所以我们让图片别着急 我翻***阅读 你就显示哪里 这样就很赞了。所以img标签初始我们给src值给一张很小的占位图。在给img自定义一个属性来存放正确的图片路径。通过js判断用户滚动条位置计算图片是否出现到了用户浏览器可视区域。如果某一张图片出现在了可视区域就把正确的图片路径更新到src让img显示正确的图片。对就这么简单。来看看案例代码把。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>7.15懒加载 -大灰狼</title>
</head>
<body style="height: 2000px;">
<script type="text/javascript">
//滚动条的上面到文档顶部的距离
var scrollTop=document.documentElement.scrollTop;
//可视区域高度(不包含状态栏 收藏夹 地址栏等)
var clientHeight=document.documentElement.clientHeight;
//元素距离顶部的距离
var offsetTop=document.documentElement.offsetTop;
//-----------以上是备注
//创建一个div元素
var container=document.createElement('div');
//创建文档片段
var frga=document.createDocumentFragment();
//动态生成图片元素
for(var i=1;i<=12;i++){
//创建一个图片
var img=document.createElement('img');
//设置一个统一的占位图
img.setAttribute('src','http://www.xdidc.com/test0715/images715/loading.gif');
//设置真是图片地址 保存在自定义属性里
img.setAttribute('data-src','http://www.xdidc.com/test0715/images715//'+i+'.jpg');
//设置图片样式
img.setAttribute('style','width:600px;height: 350px;margin: 5px;');
//先将图片这一张图片添加到文档片段中
frga.appendChild(img);
};
//将文档片段添加到容器中
container.appendChild(frga);
//将container容器插入到body中
document.body.insertBefore(container,document.body.firstElementChild);
//监听页面的滚动事件
window.addEventListener('scroll',lazyLoaded,false);
//加载的方法
function lazyLoaded(){
//滚动高度
var scrollTop=document.documentElement.scrollTop;
var clientHeight=document.documentElement.clientHeight;
//将所有图片转为数组 第一种
var imgArr=Array.prototype.slice.call(document.images,0);
//将所有图片转换为数组 第二种 可选
// var imgArr=Array.from(document.images);
imgArr.forEach(function(img,index){
if (img.offsetTop <= (scrollTop+clientHeight)) {
img.src=img.dataset.src;
}
});
};
//页面打开的时候加载
window.addEventListener('load',lazyLoaded,false);
</script>
</body>
</html>点击 "运行实例" 按钮查看在线实例
=================================朴实的分割线
原生js的tab选项卡


为什么用tab选项卡?因为在有限的空间区域可以展示更多内容嘛~
但是很多时候我们简单的一个页面为了使用tab标签要加载某某框架。框架都比我们写的代码大好多倍。来吧多学一些原生js自己写需要的东西。
实现原理比较简单用到了冒泡事件、自定义属性、元素集转数组、遍历
dom结构 Emmet语法好表达看不懂可以看后面案例源码
总容器为div.tab-container 子元素有tab-nav > ul > li + div.tab-content >div.detail
1 首先我们获得tab-nav的html元素集 再将其转为数组方便遍历。
2 在把对应的内容取detail也获得元素集 同样转数组方便遍历。
3 给tab-nav添加鼠标点击事件或鼠标移入事件
4 事件函数 对tab菜单进行遍历移除激活active 给当前点击添加active (需要判断后在添加 当前点击必须是li在添加激活)
再对内容容器进行遍历先移除所有active激活状态 再通过自定义属性判断当前点击的li 自定义index值与内容index相等的添加激活active即可。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>7.15 原生js tab选项卡 支持鼠标点击和鼠标移入切换</title>
<style type="text/css">
*{margin: 0;padding: 0;}
.tab-container{width: 500px; margin: 50px auto;}
.tab-container li{list-style: none; }
.tab-nav li{display: inline-block;font-weight: bold;padding: 6px 8px;}
.tab-nav li:hover{background:#87CEEB;}
.tab-nav ul .active{background: linear-gradient(#44aaff, #6a6aff); border-radius: 5px 5px 0 0;color: #FFFFFF;}
.tab-content .detail{display: none;}
.tab-content .active{display: block;}
.tab-content{border: 1px solid #4682B4; padding: 10px;}
</style>
</head>
<body>
<div class="tab-container">
<div class="tab-nav">
<ul>
<li data-index='1' class="active">热卖排行</li>
<li data-index='2'>新品排行</li>
<li data-index='3'>大神推荐</li>
</ul>
</div>
<div class="tab-content">
<div class="detail active" data-index='1'>
<ul>
<li>热卖的列表001</li>
<li>热卖的列表002</li>
<li>热卖的列表003</li>
<li>热卖的列表004</li>
<li>热卖的列表005</li>
<li>热卖的列表006</li>
<li>热卖的列表007</li>
<li>热卖的列表008</li>
<li>热卖的列表009</li>
<li>热卖的列表010</li>
</ul>
</div>
<div class="detail" data-index='2'>
<ul>
<li>新品的列表001</li>
<li>新品的列表002</li>
<li>新品的列表003</li>
<li>新品的列表004</li>
<li>新品的列表005</li>
<li>新品的列表006</li>
<li>新品的列表007</li>
<li>新品的列表008</li>
<li>新品的列表009</li>
<li>新品的列表010</li>
</ul>
</div>
<div class="detail" data-index='3'>
<ul>
<li>大神推荐的列表001</li>
<li>大神推荐的列表002</li>
<li>大神推荐的列表003</li>
<li>大神推荐的列表004</li>
<li>大神推荐的列表005</li>
<li>大神推荐的列表006</li>
<li>大神推荐的列表007</li>
<li>大神推荐的列表008</li>
<li>大神推荐的列表009</li>
<li>大神推荐的列表010</li>
</ul>
</div>
</div>
</div>
<script type="text/javascript">
var tabNva=document.getElementsByClassName('tab-nav')[0];
var navList=Array.prototype.slice.call(tabNva.firstElementChild.children);
var detail=document.querySelectorAll('.detail');
var detailArr=Array.prototype.slice.call(detail);
//click鼠标点击切换 mouseover鼠标移入切换
tabNva.addEventListener('mouseover',showDetail,false);
function showDetail(ev){
navList.forEach(function(li,index) {
if (ev.target.nodeName==='LI') {
li.classList.remove('active');
ev.target.classList.add('active');
};
});
detailArr.forEach(function(det,index){
if (ev.target.nodeName==='LI') {
det.classList.remove('active');
};
if(det.dataset.index==ev.target.dataset.index){
det.classList.add('active');
}
});
};
</script>
</body>
</html>点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号