Bootstrap垂直Tab的简单实现
背景
本人是后端(水平不怎么样), 由于项目需要开始着手写一点点前端, 因为需要一个Bootstrap的垂直tab页, 但是找来找去发现Bootstrap的组件只有水平的tab页, 因此只能自己动手实现一个简单的垂直tab页
需求
- 垂直显示
- 动态的进行tab切换, 无需进行路由跳转
- 利用Bootstrap的组件, 风格统一
看了一眼官网的组件列表, 发现列表组比较满足需求, 因此使用列表组来实现, 就是下面这个
效果
先看最终实现效果
思路
首先要做切换的效果我想到的是通过jQuery控制元素的隐藏和显示来实现, 在选中一个tab标签的时候, 将这个标签高亮并且显示出它所对应的tab页, 然后我就给每一个标签都手动绑定了一个点击事件, 没错手动绑定, 好在我的tab不算是很多, 即使是这样我也写了六个点击事件, 好在是实现了, 下面上代码
-
第一版
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <!-- jQuery文件。务必在bootstrap.min.js 之前引入 --> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> <link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> <title>Document</title> </head> <body> <div class="row"> <div class="list-group col-md-4 col-xs-4"> <a id="tab1" href="#" class="tab list-group-item active">tab1</a> <a id="tab2" href="#" class="tab list-group-item">tab2</a> <a id="tab3" href="#" class="tab list-group-item">tab3</a> <a id="tab4" href="#" class="tab list-group-item">tab4</a> <a id="tab5" href="#" class="tab list-group-item">tab5</a> <a id="tab6" href="#" class="tab list-group-item">tab6</a> </div> <div class="col-md-8 col-xs-4"> <div id="tab-item1" class="tab-item"> tab1 </div> <div id="tab-item2" class="tab-item"> tab2 </div> <div id="tab-item3" class="tab-item"> tab3 </div> <div id="tab-item4" class="tab-item"> tab4 </div> <div id="tab-item5" class="tab-item"> tab5 </div> <div id="tab-item6" class="tab-item"> tab6 </div> </div> </div> <script> $(document).ready(function () { $(".tab-item").hide(); $("#tab-item1").show(); $("#tab1").click(function () { $(".tab-item").hide(); $(".tab").removeClass("active"); $("#tab1").addClass("active"); $("#tab-item1").show(); }); $("#tab2").click(function () { $(".tab-item").hide(); $(".tab").removeClass("active"); $("#tab2").addClass("active"); $("#tab-item2").show(); }); $("#tab3").click(function () { $(".tab-item").hide(); $(".tab").removeClass("active"); $("#tab3").addClass("active"); $("#tab-item3").show(); }); $("#tab4").click(function () { $(".tab-item").hide(); $(".tab").removeClass("active"); $("#tab4").addClass("active"); $("#tab-item4").show(); }); $("#tab5").click(function () { $(".tab-item").hide(); $(".tab").removeClass("active"); $("#tab5").addClass("active"); $("#tab-item5").show(); }) $("#tab6").click(function () { $(".tab-item").hide(); $(".tab").removeClass("active"); $("#tab6").addClass("active"); $("#tab-item6").show(); }); }); </script> </body> </html>
到此位置效果是出来了…但是产品告诉我, 此时他要再加几个tab页!!! 这时候这种写法就让我的工作量变得很大了, 按照思路想下去我想到了循环遍历页面元素然后绑定事件的写法, 没错就是用forEach, 但是问题来了, 我的标签是a, 这个a标签啊, 实在是哪里都有, 这样遍历完了之后可能会把不该绑的地方也绑上点击事件, 这时候我咨询了前端小伙伴, 从而得知一个叫做事件委托的东西
事件委托
所谓委托, 顾名思义介绍把自己的事情交给别人去办嘛, 我们看一下现代汉语词典里面的定义哈
事件委托也就是说把自己(本元素)的事件交给别人(父级)去做好了, 对于这个需求了解这么多已经足够实现了(多了我也不会), 如需详细了解请诸君进行百度
下面贴一个
然后就产生了第二版
-
第二版
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <!-- jQuery文件。务必在bootstrap.min.js 之前引入 --> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> <link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> <title>Document</title> </head> <body> <div class="row"> <div id="tabs" class="list-group col-md-4 col-xs-4"> <!--tab里面的值应与下面标签页的id一致--> <a tab="tab-item1" href="#" class="tab list-group-item active">tab1</a> <a tab="tab-item2" href="#" class="tab list-group-item">tab2</a> <a tab="tab-item3" href="#" class="tab list-group-item">tab3</a> <a tab="tab-item4" href="#" class="tab list-group-item">tab4</a> <a tab="tab-item5" href="#" class="tab list-group-item">tab5</a> <a tab="tab-item6" href="#" class="tab list-group-item">tab6</a> </div> <div class="col-md-8 col-xs-4"> <!--id与上面标签里面的tab一致--> <div id="tab-item1" class="tab-item"> tab1 </div> <div id="tab-item2" class="tab-item"> tab2 </div> <div id="tab-item3" class="tab-item"> tab3 </div> <div id="tab-item4" class="tab-item"> tab4 </div> <div id="tab-item5" class="tab-item"> tab5 </div> <div id="tab-item6" class="tab-item"> tab6 </div> </div> </div> <script> //事件委托给父级div来处理 $(document).ready(function () { $(".tab-item").hide(); $("#tab-item1").show(); }); $(document).ready(function () { $("#tabs").on("click", "a", function (event) { let target = $(event.target); $(".tab-item").hide(); $(".tab").removeClass("active"); //添加css样式 target.addClass("active"); //取自定义字段里面的值(即a标签里面的tab字段) //tab字段里面存的是各个标签页的id, 以此来控制显示和隐藏 $("#" + target.attr("tab")).show(); }); }); </script> </body> </html>
最后
本人技术水平有限, 欢迎大家指出我的错误与不足# Bootstrap垂直Tab的简单实现