JavaScript实现选项卡效果的分析及步骤


Posted in Javascript onApril 16, 2019

JavaScript实现选项卡效果的分析及步骤

慕课网上JavaScript进阶课最后一个编程挑战,自己也是边做边搜,希望通过最后这个自己的总结加深对节点获取方法的了解。

下面话不多说了,来一起看看详细的介绍吧

效果分析之HTML结构

整个结构由上至下分为两部分,标题块使用列表的方式来做,内容快使用盒子模型。其中,内容块中的内容为了实现换行效果,采用了<br>,其实这里每一行用<p>也是可以的(不知道怎么用css实现的我)。

<div id="tab">
	<ul class="tit">
		<li>房产</li>
		<li>家居</li>	
		<li>二手房</li>
	</ul>
	<div> 
	275万购昌平邻铁三居 总价20万买一居<br>
 200万内购五环三居 140万安家东三环<br>
 北京首现零首付楼盘 53万购东5环50平<br>
 京楼盘直降5000 中信府 公园楼王现房<br>
	</div>
 <div>
 40平出租屋大改造 美少女的混搭小窝<br>
 经典清新简欧爱家 90平老房焕发新生<br>
 新中式的酷色温情 66平撞色活泼家居<br>
 瓷砖就像选好老婆 卫生间烟道的设计<br>
 	</div>
 <div> 
 通州豪华3居260万 二环稀缺2居250w甩<br>
 西3环通透2居290万 130万2居限量抢购<br>
 黄城根小学学区仅260万 121平70万抛!<br>
 独家别墅280万 苏州桥2居优惠价248万<br>
 	</div>
</div>

效果是这样滴,

JavaScript实现选项卡效果的分析及步骤

效果实现之CSS

这里的效果,比较难想到的就是边框的变化了,做的时候想到两个办法:

列表底部设置边框border-bottom,然后每个li设置背景白色,底部边框为无,从而起到 遮挡列表ul底部边框的作用。

JavaScript实现选项卡效果的分析及步骤

JavaScript实现选项卡效果的分析及步骤

每个内容盒子设置顶部边框border-top,然后每个li设置背景白色,底部边框为无,当点击标题块的时候,用li的背景色去遮挡内容盒子对应部分的边框。

JavaScript实现选项卡效果的分析及步骤

下面是采取第一种方法的css:

*{
 margin: 0;
 padding: 0;
 }
#tab{	
 	width:290px;
 /*padding:5px;*/
 height:150px;
 margin:20px;
 }
 #tab ul{
 	list-style:none;
 /*display: block;*/
 height:30px;
 line-height:30px;
 border-bottom:2px saddlebrown solid;
 }
 #tab ul li{
 	display: inline-block;
 	cursor: pointer;
 	list-style: none;
 	height: 28px;
 	width: 60px;
 	line-height: 28px
 	margin:0 5px;
 	text-align: center;
 	border: 2px solid #aaa;
 	border-bottom: none;
 }`

效果基本实现了,接下来做内容块!

JavaScript实现选项卡效果的分析及步骤

按照之前的思路,每个盒子设置边框,但是上边框为无。

#tab div{
 	font-size: 14px;
 height:120px;
 line-height: 25px;
 border:2px solid saddlebrown;
 border-top: none;
 padding:5px;
 }

内容块实现的效果!

JavaScript实现选项卡效果的分析及步骤

到这里,样式设置基本完成,但是根据效果要求,“房产”标题块是默认被点击的状态,所以我在改标题的li上添加一个类名为on,为了更好的配后之后的js添加点击事件,我同时设置on类的样式:

#tab ul li.on{
  	height: 30px;
  	border:2px solid saddlebrown;
  	border-bottom: none;
  	background:#fff;
  }

除此之外,我们希望点击哪个标题就出现相关标题的内容块,其他内容块隐藏,默认状态下第二个和第三个内容块是隐藏的,所以在这两个盒子上添加类名hide,同时设置hide类的样式:

.hide { display:none; }

JavaScript实现选项卡效果的分析及步骤

交互效果之JavaScript

首先是标题块点击效果—>给每个li添加鼠标点击事件:当某个li被点击,当前li的类名为on,其他li的类名为空。

var lis = document.getElementsByTagName("li");
//console.log(divs)
for(let i=0; i<lis.length; i++){
 lis[i].onclick = function() {
 	for( let n=0; n<lis.length; n++){
 			lis[n].className = "";
 	}
 			this.className = "on";
 }
}

JavaScript实现选项卡效果的分析及步骤

接下来是内容块的设置,如何设置当点击标题时只显示对应的内容块呢?他们有什么共同之处可以使得内容和标题绑在一起呢?假设给他们排序的化,标题一对应内容一,标题二对应内容二,所以这里使用了index,

index() 方法返回指定元素相对于其他指定元素的 index 位置。

这个位置我们也是可以设置的。在给每个li添加事件的时候用到了for里面的参数i在这里表示0,1,2可以表示标题块之间的相对位置(lis[i].index = i),这也正是盒子块之间的相对位置。我们可以通过divs[this.index]来获取被点击标题对应的盒子。

var divs = document.getElementById("tab").getElementsByTagName("div");
//console.log(divs)
 for(let i=0; i<lis.length; i++){
  lis[i].index = i;
  lis[i].onclick = function() {
 		for( let n=0; n<lis.length; n++){
 				lis[n].className = "";
 				divs[n].className = "hide";
 		}
 			this.className = "on";
 			divs[this.index].className = "";
 	}
 }

到这里,题目要求的所有效果都实现了,回头看看,感觉不是很难,但是当时在刚看到题目的时候还是很懵的,不知道如何获取被点击的标题(想到了冒泡和捕获,后面还需要对这个进行学习),不知道如何设置css....,自己还需要更多的学习。

——————————分割线—————

很多大佬都指导我说之前的方法耗内存:用for循环给每个li都添加一个点击事件。下面,我用事件委托来更新一下这个办法:

window.onload = function() {
  var uls = document.getElementById('tit');
  var lis = uls.getElementsByTagName('li');
  var divs = document.getElementById('tab').getElementsByTagName('div');
  // console.log(lis)
  console.log(divs)
  uls.onclick = function(ec) {
  for(let i=0; i<lis.length; i++){
   lis[i].className = ""; //遍历每个li设置类名
   divs[i].className = "hide"; 
  }
  var ev = ev || window.event;
  var target = ev.target || ev.srcElement;
  if(target.nodeName.toLowerCase() == 'li'){
   target.className = "on";
   //自己在每个li中定义了一个属性 data-index
   divs[target.getAttribute("data-index")].className = ""; 
   console.log(target);
  }
  } 
 }

我在html中给每个li自定了属性data-index:

<li class="on" data-index="0">房产</li>
<li data-index="1">家居</li>	
<li data-index="2">二手房</li>

再在js中用getAttribute获取所点击的li的属性值

divs[target.getAttribute("data-index")].className = "";

源码链接

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery 应用代码 方便的排序功能
Feb 06 Javascript
JavaScript 设计模式 安全沙箱模式
Sep 24 Javascript
jQuery随便控制任意div隐藏的方法
Jun 28 Javascript
JS常用正则表达式总结
Nov 12 Javascript
详解jQuery Mobile自定义标签
Jan 06 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
深入理解JavaScript中的预解析
Jan 04 Javascript
深入浅析JavaScript中的RegExp对象
Sep 18 Javascript
jQuery 实现左右两侧菜单添加、移除功能
Jan 02 jQuery
vue文件树组件使用详解
Mar 29 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
Apr 07 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
Jun 11 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
Apr 16 #Javascript
详解滑动穿透(锁body)终极探索
Apr 16 #Javascript
一些手写JavaScript常用的函数汇总
Apr 16 #Javascript
浏览器事件循环与vue nextTicket的实现
Apr 16 #Javascript
理理Vue细节(推荐)
Apr 16 #Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 #Javascript
js实现删除li标签一行内容
Apr 16 #Javascript
You might like
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
js实现页面转发功能示例代码
2013/08/05 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
详解Vue打包优化之code spliting
2018/04/09 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
Python学习笔记之常用函数及说明
2014/05/23 Python
python实现发送邮件功能代码
2017/12/14 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
python中的随机函数random的用法示例
2018/01/27 Python
基于Python实现用户管理系统
2019/02/26 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
python写一个随机点名软件的实例
2019/11/28 Python
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
岗位廉政承诺书
2014/03/27 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
员工离职通知函
2015/04/25 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server