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 timers计时器简单应用说明
Oct 28 Javascript
jquery 年会抽奖程序
Dec 22 Javascript
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
JS字符串拼接在ie中都报错的解决方法
Mar 27 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
深入分析Javascript事件代理
Jan 30 Javascript
原生js实现商品放大镜效果
Jan 12 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
Aug 17 Javascript
Vee-Validate的使用方法详解
Sep 22 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
vuex state中的数组变化监听实例
Nov 06 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
Jul 20 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
第三节--定义一个类
2006/11/16 PHP
php zend 相对路径问题
2009/01/12 PHP
php 不同编码下的字符串长度区分
2009/09/26 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
Prototype Array对象 学习
2009/07/19 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
[52:03]Secret vs VG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python实现的RSS阅读器实例
2015/07/25 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
Python实现把类当做字典来访问
2019/12/16 Python
如何将字串String转换成整数int
2015/02/21 面试题
Java的基础面试题附答案
2016/01/10 面试题
给校长的建议书
2014/03/12 职场文书
大学新闻系自荐书
2014/05/31 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
校长师德表现自我评价
2015/03/04 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
导游词之大雁塔景区
2019/09/17 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python