Javascript进阶篇的最后一节是一个选项卡切换的编程,要求效果如下。

这里涉及到两块,一个是内容的切换显示,一个是红色的边框样式切换。

内容切换可以用纯js代码实现,但当这里还需设置一个红色边框样式的时候,JS里会出现大量CSS代码,所以统一使用className切换是更好的选择,不同的class样式可以在CSS文件中设置。这样JS的任务只剩下区分onclick元素和其他元素这一项了。

我的第一反应是给<p>内容部分加上房产/家居/二手房的id,通过if判断id是否与触发onclick选项的<li>.firstChild.nodeValue相等来分别设置样式。但是这里还涉及到<li>本身的样式切换,又要用一个if判断,显然非常麻烦,而且会出现if this.firstChild.nodeValue==li[i].firstChild.nodeValue这种逆天的代码。这里其实基于样式可以覆盖,直接遍历所有元素设置非点击样式,然后获取this来设置点击样式是比较方便的。就好像CSS代码习惯在最开始用*{margin:0px,padding:0px}初始化一样,这也是一个初始化的思想。

这里给oLis(每个li元素)设置了一个属性index来存放i,因为只有属性可以跟随变量,onclick事件函数只有触发后才开始执行代码,而i的循环是在onload时就运行完了,i的值将停留在oLis.length-1,这对切换样式没有影响,但是会影响到内容的切换,因为oLis和oDivs是通过i联系在一起的。

window.onload=function(){

var oTabs=document.getElementById("Tabs")
var oLis=document.getElementsByTagName('li');
var oDivs=document.getElementsByTagName('div');
for (var i = 0; i < oLis.length; i++) {
oLis[i].index=i;
oLis[i].onclick=function(){
for (var n = 0; n < oLis.length; n++) {
oLis[n].className="";
oDivs[n].className="hide"; }
this.className="on";
oDivs[this.index].className="";
}
} }

html部分:现在就非常简洁了。

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

比较复杂的是CSS代码,慕课网的答案是按这样的思路设计边框样式的,红色的那条线绑定在ul的border-bottom。非点击状态中li没有下边框,点击状态中li下边框为2px白色,就把红色位置的边框遮盖住了。当然ul要定高,依赖于li高度决定。会产生一个细节问题就是非点击状态下li加边框是29px,而ul是30px的高度,所以标签的下边框处会有1px的间隙,不能咬住红色的边框。

我自己做的时候,选择把红色边框作为div元素的上边框,设置Margin为-2px。所以我不需要Tabs的div来框住ul的宽度。但是间隙的问题依然存在。

另外有一点我也不是很确定,li的float:left和display:inline-block理论上是一样的效果,我注释掉浮动发现标签之间间距会变宽,1px的间隙神奇地消失了。注释掉display的代码没有发现任何变化。网上查了一下有一种是说display:inline-block会产生双倍边距是因为html代码中li之间存在换行符,试了一下放在一行中果然间距就正常了。间隙依然不知道是为什么。。。。

*{padding:0px;margin:0px;font:12px normal "microsoft yahei"}
#tabs{width:290px;padding:5px;height:150px;margin:20px;}
#tabs ul{
display:block;
height:30px;
line-height:30px;
border-bottom:2px saddlebrown solid;
}
#tabs ul li{
background:#fff;
cursor:pointer;
float:left;
list-style: none;
height:28px;
line-height:28px;
margin:0px 3px;
border:1px solid #aaa;
border-bottom: none;
display:inline-block;
width:60px;
text-align:center;
}
#tabs ul li.on{border-top:2px solid saddlebrown;
border-bottom:2px solid #fff;}
#tabs div{
height:120px;
line-height:25px;
border:1px solid #336699;
border-top:none;
padding:5px;
}
.hide{display:none;}

一个比较基础的题,然而还是做了挺久的,时间基本都花在改BUG上了TAT。。

慕课编程题JS选项卡切换的更多相关文章

  1. js选项卡切换效果

    选项卡切换在页面中比较常见,这里是我利用js闭包还有setTimeout定时器实现的一个比较实用的选项卡功能. <!DOCTYPE html> <html lang="en ...

  2. 二、JavaScript语言--JS基础--JavaScript进阶篇--选项卡切换效果

    利用JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居     200万内购五环三居 140万安家东三环     北京首现零首付楼 ...

  3. js实现选项卡切换

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  4. 用js实现选项卡切换效果

    这是要实现的效果图: 一.HTML页面布局 <!-- HTML页面布局 --><ul class="tab_menu"> <li class=&quo ...

  5. 常用js效果:选项卡切换

    js选项卡,很多网站都会用到,我这里用jquery给整了一个简单但是却很实用的js选项卡,废话不多说,直接上代码: <style> .txtadsblk01{ width:200px;} ...

  6. 用html+css+js实现选项卡切换效果

    文章转载自:http://tongling.github.io/JSCards/ 用html+css+js实现选项卡切换效果 使用之前学过的综合知识,实现一个新闻门户网站上的常见选项卡效果: 文字素材 ...

  7. JS编程题练习

    JS编程题练习 1. 两个数组合并成一个数组排序返回 先依次比较两个数组,按照小的就传入新的数组.当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可. function ...

  8. 纯js实现网页tab选项卡切换效果

    纯js实现网页tab选项卡切换效果 百度搜索     js 点击菜单项就可以切换内容的效果

  9. 五四青年节,今天要学习。汇总5道难度不高但可能遇到的JS手写编程题

    壹 ❀ 引 时间一晃,今天已是五一假期最后一天了,没有出门,没有太多惊喜与意外.今天五四青年节,脑子里突然想起鲁迅先生以及悲欢并不相通的话,我的五一经历了什么呢,忍不住想说那大概是,父母教育孩子大声嚷 ...

随机推荐

  1. XML代码生成器——XMLFACTORY 简介(三)

    XML代码生成器——XMLFACTORY 简介(三) 这一篇我们讲“类名称”页签 的配置功能,您将了解到:如何为Xml元素指定对应的类名称及脱壳功能. 如果,你没看过这个系列的第一篇文章,请先去看这篇 ...

  2. SlickUpload 发布到IIS后报错

    开发时候采用slickupload控件都没问题,项目发布到IIS时发生了错误: Could not contact SlickUpload request progress handler at /S ...

  3. git常见错误

    一.如果输: $ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git         提示出错信息:fat ...

  4. hexo环境变量的配置问题

    因为一些个人原因,想尝试在github上用hexo搭建一个博客,于是用npm安装,安装完成之后却一直无法确认hexo的版本问题,cmd中也一直提示hexo -v 不是有效的命令行,在重装了几次Node ...

  5. Sqoop使用手册

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 1 Sqoop概述 2 版本说明 3 驱动安装 3.1 MySQL 4 基本用法 4.1 导入 4.1.1 保护密码 4. ...

  6. 在 Java 代码中对 Kerberos 主体进行身份验证

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 本文举例说明如何使用 org.apache.hadoop.security.UserGroupInformation 类在 ...

  7. hping原理、安装、使用详解介绍

    [原理基础]  Hping是一个命令行下使用的TCP/IP数据包组装/分析工具,其命令模式很像Unix下的ping命令,但是它不是只能发送ICMP回应请求,它还可以支持TCP.UDP.ICMP和RAW ...

  8. C#编程语言与面向对象——类与对象

    由于ASP.NET技术是全面向对象的,因此,要掌握这一技术,必须具备有扎实的面向对象理论基础 使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类中之外的函数,因此,类是面向对象编程的基本单元 ...

  9. flume中的agent配置和启动

    首先创建一个文件example.conf(touch example.conf) 然后在文件中,进行agent文件的如下的配置(vi  example.conf)   agent文件的配置:(配置ag ...

  10. php 函数strpos()

    strpos() 函数查找字符串在另一字符串中第一次出现的位置. strpos(string,find,start) 返回  从string中的start位置开始找find第一次出现的位置 注意: s ...