博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何实现选项卡切换
阅读量:7052 次
发布时间:2019-06-28

本文共 2867 字,大约阅读时间需要 9 分钟。

问题

利用原生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部分代码

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

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

你可能感兴趣的文章
Codeforces-963 D Frequency of String
查看>>
MyBatis-mybatis全局映射文件解析
查看>>
WebApi 跨域解决方案 --CORS
查看>>
MySQL系列详解五: xtrabackup实现完全备份及增量备份详解-技术流ken
查看>>
单独编译Android源代码中的模块
查看>>
manjaro安装mysql5.7
查看>>
记录零散的知识点
查看>>
H5上传图片并使用canvas制作海报
查看>>
springmvc学习笔记
查看>>
LRU算法的设计
查看>>
清除windows系统垃圾文件简易脚本(bat)
查看>>
Java 之switch语句
查看>>
焊盘的制作
查看>>
Finalize 和 Dispose 的分析
查看>>
从一道题看线程安全--牛客网Java基础题
查看>>
简单验证码业务
查看>>
Java util包中常用的类和方法
查看>>
[R] 之 管理工作空间函数
查看>>
将windows目录共享到linux
查看>>
计算机是如何启动的
查看>>