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 相关文章推荐
24款非常有用的 jQuery 插件分享
Apr 06 Javascript
jquery ajax例子返回值详解
Sep 11 Javascript
JavaScript定义类的几种方式总结
Jan 06 Javascript
node.js中的forEach()是同步还是异步呢
Jan 29 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
Feb 07 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
Sep 14 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
layer.close()关闭进度条和Iframe窗的方法
Aug 17 Javascript
JS 数组和对象的深拷贝操作示例
Jun 06 Javascript
Ant Design moment对象和字符串之间的相互转化教程
Oct 27 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
使用Apache的rewrite技术
2006/06/22 PHP
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
jquery中:input和input的区别分析
2011/07/13 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
jquery实现数字输入框
2017/02/22 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Python中用于返回绝对值的abs()方法
2015/05/14 Python
python:print格式化输出到文件的实例
2018/05/14 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
如何在python中实现线性回归
2020/08/10 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
Python修改DBF文件指定列
2020/12/19 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
专业求职信撰写要诀
2014/02/18 职场文书
班班通项目实施方案
2014/02/25 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
Java Spring Lifecycle的使用
2022/05/06 Java/Android