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 相关文章推荐
js获取IFRAME当前的URL的方法
Nov 13 Javascript
javascript事件冒泡详解和捕获、阻止方法
Apr 12 Javascript
AspNet中使用JQuery上传插件Uploadify详解
May 20 Javascript
jQuery+正则+文本框只能输入数字的实现方法
Oct 07 Javascript
简单实现js倒计时功能
Feb 13 Javascript
CodeMirror js代码加亮使用总结
Mar 25 Javascript
JS实现队列的先进先出功能示例
May 10 Javascript
javascript 缓冲运动框架的实现
Sep 29 Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 Javascript
vue 修改 data 数据问题并实时显示的方法
Aug 27 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
Feb 11 Javascript
vue调用本地摄像头实现拍照功能
Aug 14 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
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
python 算法 排序实现快速排序
2012/06/05 Python
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
Python读取word文本操作详解
2018/01/22 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
生产部经理岗位职责
2013/12/16 职场文书
项目计划书范文
2014/01/09 职场文书
经典促销广告词大全
2014/03/19 职场文书
个人培训自我鉴定
2014/03/28 职场文书
信息技术课后反思
2014/04/27 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技