Blogger Information
Blog 36
fans 4
comment 3
visits 31902
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
7.15 原生js 图片懒加载、tab选项卡
大灰狼的博客
Original
1642 people have browsed it

原生js图片懒加载

来先看个效果图~

1.png

讲一下原理。首先为什么要使用懒加载呢?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选项卡

3.png4.png

为什么用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>

运行实例 »

点击 "运行实例" 按钮查看在线实例



Correction status:qualified

Teacher's comments:总结的很好, 代码写得也很规范 , 里面用到了一些知识点, 可能在其它教材是看不到的, 要多看多写才能记住
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post