为了账号安全,请及时绑定邮箱和手机立即绑定

【JavaScript编程挑战】:选项卡切换分步解析

先放一张完成后的效果图。
img1
介绍一下做选项卡切换任务时的思路吧,顺便梳理一下就当是对自己学习的一个检验和总结。
我一般习惯先写html代码,因为大家常把html比喻成一间房子的结构,先把结构搭起来,再“刷墙放家具”可能会更顺手一点,不过每个人都有自己的风格,找到适合自己的方式最重要。

html代码如下:
其实这个html结构相对简单,无非就是三个菜单按钮(在html中对应id为menu的div下面的三个li标签),再加上与这三个菜单按钮一一对应的三块内容信息(在html中对应id为content的div下面的三个ul标签),结构就是这么简单。通常,我还习惯在最外面加上包裹层(在html中对应id为wrap的div),这样做的好处相信大家都了解,作为整个房子的“外墙”,约束房子的“占地面积”,同时做定宽块状元素居中操作很方便。

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

房子的结构很容易就搭建出来了,接下来为房子“刷漆”。
css代码如下(内部样式表):
在代码起始将外边距和内边距都设置为0是一个不错的习惯,至少我已经形成了这个习惯,这样可以去掉部分浏览器默认添加的边距,让显示效果更贴近自己想象的结果。
所以第一步采用通配选择器将内外边距设置为0,因为不希望html中的li的样式出现,所以将list-style设置为none,超链接的下划线也是不希望出现的,所以将text-decoration设置为none,同时,如果任务对文字大小没有特殊要求的话,也可以在这里一并设置了。小结:使用通配选择器实现类似初始化的操作,可以很大程度上减少编码的工作量,不需要在内部结构中重复写,在遇到没有继承的属性时这一点更为明显。
上面写html结构时说到了包裹层,在这里就应用到了定宽块状元素居中操作,给定wrap一个固定的width值,同时将左右外边距设置为auto就ok了。
下面来到了比较关键的部分,也是我之前编程中遇到问题的地方。
菜单按钮是ul下面的三个li标签,要实现li的横排显示,我们可以很自然地想到float:left,此时三个li标签就浮动起来了,大概是下图这样的。
图片描述
为了解决浮动带来的问题(浮动溢出),我们通常习惯于在浮动元素的父元素中设置overflow:hidden,但在这个任务中这样做是无法满足要求的,这一点我们后面再说。那既然不是设置overflow:hidden,那应该怎么做呢?我们需要给ul添加一个固定高度,暂且让height为30px,同时效果图中还有一条酒红色的边框,我们令border-bottom:2px solid maroon,此时ul的高度是30+2=32px,这一点很重要,如果没有和li匹配,就没法实现要求的效果。
下面,先不急于设置li的样式,我们再来看看效果图。
图片描述
当菜单按钮被选中时(也就是鼠标点击事件),上边框变为2px的酒红色,而下边框变为2px的白色,刚刚我们计算了ul的高度是32px,所以li的高度需要定为32-2-2=28px,这样就可以实现菜单按钮被选中时,底部的白色边框可以覆盖ul的酒红色边框的效果。
之前说到,li左浮动之后,不能对li的容器使用overflow:hidden清除浮动,是为什么呢?因为一旦清除了浮动,那么li的下边框就无法呈现覆盖ul的下边框的效果了。如下图:
图片描述
其他较为基础的css样式设置就不在此赘述了。

    <style type="text/css">
     /* CSS样式制作 */  
*{
     margin:0;
     padding:0;
     list-style:none;
     text-decoration:none;
     font-size:12px;
     }
a:link{
     color:#000;
}
#wrap{
    width:290px;
    //border:1px solid;
    margin:20px auto;
}
#menu ul{
    height:30px;
    width:100%;
    border-bottom:2px solid maroon;
    //overflow:hidden;   !!!!key!!!!
}
#menu li{
    //display:inline-block;
    float:left;
    margin:0 5px;
    height:28px;
    line-height:28px;
    padding:0 15px;
    border:1px solid #ccc;
    border-bottom:none;
}
#menu li.select{
    border-top:2px solid maroon;
    border-bottom:2px solid #fff;
}
#content{
    //width:100%;
    border:1px solid blue;
    border-top:none;
    padding:10px 40px 25px 10px;
}
    </style>

接下来就是为刷好漆的房子里面“放家具”了
JavaScript代码如下:
JS是交互的精髓所在,我们需要搞清楚交互是如何实现的:当点击菜单按钮时,当前按钮获得特殊样式,与其对应的文本内容显示,而其他按钮没有效果,与之对应的文本内容不显示。
菜单按钮和文本内容的一一对应关系需要通过循环遍历实现,而建立好了对应关系之后,就只需要让当前点击的按钮获得相应的类,与之匹配的文本显示就ok了。
所以首先获取两个变量数组,menus和contents,分别是菜单按钮和文本内容,然后在for循环中,为每个菜单按钮menus[i]添加鼠标点击事件就好了,也就是this.className="select"; contents[this.id].style.display="block";为按钮添加类,让相应文本内容显示。
但进行到这一步还不够,你会发现,点击不同的按钮会让它们都拥有特殊的样式,而且对应的文本内容都会显示,所以需要在让它们获取样式之前,先将之前的样式全部去掉。即
for(var j=0;j<menus.length;j++) { menus[j].className=""; contents[j].style.display="none"; }

    <script type="text/javascript">

    // JS实现选项卡切换
 window.onload=function(){
     var menus=document.getElementById("menu").getElementsByTagName("li");
     var contents=document.getElementById("content").getElementsByTagName("ul");
     //alert(menus.length)
     for(var i=0;i<menus.length;i++)
     {
         menus[i].id=i;
         menus[i].onclick=function(){
             for(var j=0;j<menus.length;j++)
             {
                 menus[j].className="";
                 contents[j].style.display="none";
             }
             this.className="select";
             contents[this.id].style.display="block";

         }
     }
 }

到这里,编程的工作就完成了。我觉得,有时候会做一个例子可能还不够,当时会了并不代表李领悟了,这个例子我也不是第一次做了,第一次做的时候,似懂非懂的觉得“原来也不过如此”,可是第二遍再看的时候还是没有思路,所以我选择写手记的方式来巩固知识,梳理思路。如有错误,欢迎各位指正!

点击查看更多内容
13人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消