如何实现选项卡切换

问题

利用原生js实现选项卡切换效果,如下:

解题思路

  1. 打好html框架,即选项卡标题(ul…li…)及内容(div…);
  2. 样式设置,默认显示第一个选项卡标题及内容,显示样式为,选中li的上边框变红,下边框消失。解决思路是设置ul下边框为红色,为li添加类"active",上边框为红色,下边框为白色,此时li下边框就会覆盖ul下边框,如上图所示。此处需计算li及ul盒模型高度,保持两者一致。
  3. 补充js部分代码,实现点击标题页切换对应内容页等效果。解题思路,为每一个li添加鼠标移过事件 ,遍历li,为其移除"active"类,并为当前li添加"active", this.classList.add("active")。同时,遍历div内容,全部隐藏,并为当前div移除隐藏classList.remove("hide"),显示对应内容页。

body部分代码

<!-- HTML页面布局 -->
<ul class="list" id='nav'>
    <li class="active">房产</li>
    <li class="">家居</li>
    <li class="">二手房</li>
</ul>

<div class="all " id='content'>
    <div class="">
        275万购昌平邻铁三居 总价20万买一居
        <br> 200万内购五环三居 140万安家东三环
        <br> 北京首现零首付楼盘 53万购东5环50平
        <br> 京楼盘直降5000 中信府 公园楼王现房
        <br>
    </div>

    <div class="hide ">
        40平出租屋大改造 美少女的混搭小窝
        <br> 经典清新简欧爱家 90平老房焕发新生
        <br> 新中式的酷色温情 66平撞色活泼家居
        <br> 瓷砖就像选好老婆 卫生间烟道的设计
        <br>
    </div>

    <div class="hide ">
        通州豪华3居260万 二环稀缺2居250w甩
        <br> 西3环通透2居290万 130万2居限量抢购
        <br> 黄城根小学学区仅260万 121平70万抛!
        <br> 独家别墅280万 苏州桥2居优惠价248万
        <br>
    </div>
</div>
复制代码

CSS部分代码

* {
    padding: 0;
    font-size: 13px;
    width: 230px;
    margin: 0 auto;
    font: normal 12px "微软雅黑";
}

.hide {
    display: none;
    /*默认隐藏后两个标签页 */
}

li {
    display: inline-block;
    /*转换为内联块状元素,并排展示li内容 */
    border: 1px solid #ccc;
    width: 50px;
    height: 22px;
    border-bottom: none;
    margin-left: 5px;
}

ul {
    list-style: none;
    /*去除li默认小黑点 */
    margin-top: 2px;

    width: 232px;
    height: 24px;
    border-bottom: 2px solid #8a0f0f;
}

.all {
    border: 1px solid rgb(75, 68, 68);
    width: 230px;
    border-top: none;
}

.active {
    border-top: 2px solid #8B4513;
    border-bottom: 2px solid #FFFFFF;
    /*默认显示第一个标题页的效果*/
}
复制代码

CSS难点:盒模型高度计算

保持ul和li高度一致,以免出现如标题下边框没有完全覆盖内容页等情况,影响美观,反例如下:

解决方法:利用浏览器盒模型直观计算比对。

li.active:

ul:

2+22+2=24+2,这样边框就能正确覆盖了。

JS部分代码

// JS实现选项卡切换
window.onload = function () {
//先加载页面,否则函数无效
    change('nav', 'content');
}
// 当页面需要多次实现选项卡效果,可以对函数进行封装,以实现多次调用。
function change(navId, contentId) {
    // 切换代码
    var nav = document.getElementById(navId);
    var liarray = nav.children;
    var content = document.getElementById(contentId);
    var contentarray = content.children;
    for (var i = 0; i < liarray.length; i++) {
        liarray[i].index = i;
        liarray[i].onmouseover = function () {
        //为每一个li添加鼠标移过事件
            for (var j = 0; j < liarray.length; j++) {
                liarray[j].classList.remove("active");
                //遍历liarray,全部删除"active"类
            }
            this.classList.add("active");
            //为当前li添加"active"类
            for (var j = 0; j < contentarray.length; j++) {
                if (!contentarray[j].classList.contains("hide")) {
                    contentarray[j].classList.add("hide")
                }
            }
            contentarray[this.index].classList.remove("hide");
        }
    }
}
复制代码

JS难点

  1. 如何得到和选项卡标题相匹配的内容页: 方法:自定义属性"index",实现映射
  2. Active 和 remove hide 效果同时实现,注意代码位置

转载于:https://juejin.im/post/5a4a4f52518825258227bbf7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值