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 EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
Oct 06 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
Sep 19 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
Dec 27 Javascript
JQUERY表单暂存功能插件分享
Feb 23 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
JavaScript知识点总结(十)之this关键字
May 31 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
Feb 06 Javascript
react中Suspense的使用详解
Sep 01 Javascript
vue中keep-alive内置组件缓存的实例代码
Apr 16 Javascript
解决Vue @submit 提交后不刷新页面问题
Jul 18 Javascript
vue select 获取value和lable操作
Aug 28 Javascript
JavaScript 数组去重详解
Sep 15 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 intval的测试代码发现问题
2008/07/27 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
jquery 插件学习(四)
2012/08/06 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
jquery实现商品sku多属性选择功能(商品详情页)
2019/12/20 jQuery
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
Python IDLE清空窗口的实例
2018/06/25 Python
Django进阶之CSRF的解决
2018/08/01 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
24式加速你的Python(小结)
2019/06/13 Python
Python 硬币兑换问题
2019/07/29 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
新学期教师寄语
2014/04/02 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
担保书范本
2015/01/20 职场文书
七一慰问简报
2015/07/20 职场文书
学校安全管理制度
2015/08/06 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android
Redis 异步机制
2022/05/15 Redis