zoukankan      html  css  js  c++  java
  • 整理用js实现tab标签页

    首先是css样式,比如这样的:

     1 <style>
     2         *{
     3             margin:0;
     4             padding: 0;
     5             list-style: none;
     6             font-size: 12px;
     7         }
     8         .notice{
     9             width: 298px;
    10             height: 98px;
    11             margin: 10px;
    12             border:1px solid #7c7c7c;
    13             overflow: hidden;
    14         }
    15         .notice-tit{
    16             height: 27px;
    17             background-color: #eaeaea;
    18             position: relative;
    19         }
    20         .notice-tit ul{
    21             position: absolute;
    22             width: 300px;
    23             left: -1px;
    24         }
    25         
    26         .notice-tit ul li{
    27             float: left;
    28             width: 58px;
    29             height: 26px;
    30             line-height: 26px;
    31             text-align: center;
    32             border-bottom: 1px solid #7c7c7c;
    33             padding: 0 1px;
    34         }
    35         .notice-tit ul a{
    36             text-decoration: none;
    37             display: block;
    38         }
    39         .notice-tit ul .select{
    40             background-color: white;
    41             border-right: 1px solid #7c7c7c;
    42             border-left: 1px solid #7c7c7c;
    43             border-bottom: 1px solid white;
    44             padding: 0;
    45         }
    46         /*.notice-tit ul li:hover{
    47             background-color: white;
    48             border-right: 1px solid #7c7c7c;
    49             border-left: 1px solid #7c7c7c;
    50             border-bottom: 1px solid white;
    51             padding: 0;
    52         }*/
    53 </script>

    注意:1.需要给.notice-tit这个盒子设置相对定位,ul设置绝对定位并且left:-1px(如果不设置-1,ul这个盒子不会和.notice-tit这个盒子完全重叠,因为.notice-tit有个1px 的边框);

       2.要给ul下面的li标签设置左右padding 1px;当悬浮的时候出现左右1px的border,同时把当前悬浮的li左右padding设置为0,这样悬浮的时候不会因为li加了2px的左右边框而导致宽度增加;

    然后是HTML结构:

     1 <div class="notice">
     2         <div class="notice-tit" id="notice-tit">
     3             <ul>
     4                 <li class="select"><a href="#">公告</a></li>
     5                 <li><a href="#">规则</a></li>
     6                 <li><a href="#">论坛</a></li>
     7                 <li><a href="#">安全</a></li>
     8                 <li><a href="#">公益</a></li>
     9             </ul>
    10         </div>
    11         <div class="notice-con" id="notice-con">
    12             <div style="display: block">我是内容1</div>
    13             <div style="display: none">我是内容2</div>
    14             <div style="display: none">我是内容3</div>
    15             <div  style="display: none">我是内容4</div>
    16             <div  style="display: none">我是内容5</div>
    17         </div>
    18     </div>

    首先定个小目标比如实现简单的点击或者悬浮的TAB切换:

    1.获取#notice-tit下面的所有li节点,获取#notice-con下面的所有div节点。

    2.遍历#notice-tit下面的所有li节点并添加ID和悬浮或者点击事件。

     添加id的作用是悬浮在当前ID上时对应的显示.notice-con内的div。

     1 <script>
     2     //获取id封装成一个函数$()方便调用
     3     function $(id){
     4     //如果传入的参数类型为字符串则获取当前ID元素,否则返回id
     5         return typeof id==="string"?document.getElementById(id):id;
     6     }
     7     //window.onload表示当文档加载完毕时执行函数
     8     window.onload=function(){
     9         //获取#notice-tit下面的全部li元素
    10         var titles=$('notice-tit').getElementsByTagName('li');
    11         //获取#notice-con下面的全部div元素
    12         var divs=$('notice-con').getElementsByTagName('div');
    13         //遍历所有li标签,给每个li加上id和值,并且绑定事件
    14         for(var i=0;i<titles.length;i++){
    15             //给每个li加上id和值
    16             titles[i].id=i;
    17             //给每个li绑定事件
    18             titles[i].onmouseover=function(){
    19             //悬浮后首先应该初始化每个li和div上的类和display
    20                 for(var j=0;j<titles.length;j++){
    21                     titles[j].className="";
    22                     divs[j].style.display="none";
    23                 }
    24             //给当前悬浮元素添加属性
    25                 titles[this.id].className="select";
    26                 divs[this.id].style.display="block";
    27             }
    28         }
    29     }
    30 </script>


    初步效果实现了,如果需要点击效果把上面的onmouseover改为onclick。一般的tab标签有个延时的效果,更有利于用户体验,下面来加个定时器。

     1 <script>
     2     //获取id封装成一个函数$()方便调用
     3     function $(id){
     4     //如果传入的参数类型为字符串则获取当前ID元素,否则返回id
     5         return typeof id==="string"?document.getElementById(id):id;
     6     }
     7     //window.onload表示当文档加载完毕时执行函数
     8     window.onload=function(){
     9         //获取#notice-tit下面的全部li元素
    10         var titles=$('notice-tit').getElementsByTagName('li');
    11         //获取#notice-con下面的全部div元素
    12         var divs=$('notice-con').getElementsByTagName('div');
    13         //遍历所有li标签,给每个li加上id和值,并且绑定事件
    14         var timer=null;
    15         for(var i=0;i<titles.length;i++){
    16             //给每个li加上id和值
    17             titles[i].id=i;
    18             //给每个li绑定事件
    19             titles[i].onmouseover=function(){
    20             //this指向当前悬浮的对象并存进变量that中,用that做一个this的引用
    21             var that=this;
    22             //当存在定时器的时候我们需要把它清除,如果悬浮的时间少于500毫秒,
    23             //则不会执行后面的函数,一般定时器前面都需要有个清除的步骤。
    24             if(timer){
    25                 //清除定时器
    26                 clearTimeout(timer);
    27                 //初始化变量的值
    28                 timer=null;
    29             }
    30             //设置定时器,执行函数的时间延迟了500毫秒
    31             timer=setTimeout(function(){
    32             //悬浮后首先应该初始化每个li和div上的类和display
    33                 for(var j=0;j<titles.length;j++){
    34                     titles[j].className="";
    35                     divs[j].style.display="none";
    36                 }
    37             //给当前悬浮元素添加属性
    38             //这个地方不能用this.id了,因为this指向了window这个对象了,
    39                 titles[that.id].className="select";
    40                 divs[that.id].style.display="block";},500);
    41             }
    42         }
    43     }
    44 </script>


    下面来实现一个标签页轮播的效果

    思路:设置一个索引index=0,和一个定时器timer,在定时器setInterval()中隔2秒不停的去把索引加一,然后根据索引找到对应的元素节点进行操作,注意index不能无限的增加,最大值根据li的数量来决定。

     1     window.onload=function(){
     2         var titles=$('notice-tit').getElementsByTagName('li');
     3         var divs=$('notice-con').getElementsByTagName('div');
     4         //声明一个空的变量来储存定时器
     5         var timer=null;
     6         //索引值,初始值为0
     7         var index=0;
     8         //设置一个定时器,每隔2秒去执行函数
     9         timer=setInterval(function(){
    10         //每执行一次index加一
    11             index++;
    12         //设置index的最大值,超过则设为0
    13             if(index>=titles.length){
    14                 index=0;
    15             }
    16         //添加样式前应初始化全部样式
    17             for(var i=0;i<titles.length;i++){
    18                 titles[i].className="";
    19                 divs[i].style.display="none";
    20             }
    21         //给索引为index的节点去添加样式
    22             titles[index].className="select";
    23             divs[index].style.display="block";
    24         },2000); 
    25     }


    终极目标来了:tab悬浮切换+延时效果+自动轮播

     1 <script>    
     2     //获取id封装成一个函数$()方便调用
     3 function $(id){
     4         //如果传入的参数类型为字符串则获取当前ID元素,否则返回id
     5             return typeof id==="string"?document.getElementById(id):id;
     6         }
     7         function tab(){
     8         //声明 索引index,两个变量来装定时器,一个轮播定时器,一个延时定时器
     9         var index=0,timer=null,timer2=null;
    10         var titles=$('notice-tit').getElementsByTagName('li');
    11         var divs=$('notice-con').getElementsByTagName('div');
    12         for(var j=0;j<titles.length;j++){
    13             //给每个li设置ID
    14             titles[j].id=j;
    15             //给每个li绑定悬浮事件
    16             titles[j].onmouseover=function(){
    17             //悬浮时首先清除延时定时器
    18                 clearInterval(timer);
    19             //清除轮播定时器
    20                 clearTimeout(timer2);
    21             //初始化两个定时器
    22                 timer2=null;
    23                 timer=null;
    24             //this的一个引用,因为在setTimeout中this指向window对象
    25                 var that=this;
    26             //创建一个延时定时器
    27                 timer2=setTimeout(function(){
    28                     for(var i=0;i<titles.length;i++){
    29                 titles[i].className="";
    30                 divs[i].style.display="none";
    31             }
    32             titles[that.id].className="select";
    33             divs[that.id].style.display="block";
    34             //鼠标悬浮时改变index的值为当前的id
    35             index=that.id;
    36                 },500);
    37             }
    38             //给每个Li绑定鼠标离开时的事件
    39             titles[j].onmouseout=function(){
    40             //创建一个轮播定时器,离开时轮播能继续进行,因为上面设置了index=that
    41             //所以鼠标离开后会自动播放下一个tab
    42             timer=setInterval(function(){
    43                 index++;
    44             if(index>=titles.length){
    45                 index=0;
    46             }
    47             for(var i=0;i<titles.length;i++){
    48                 titles[i].className="";
    49                 divs[i].style.display="none";
    50             }
    51             titles[index].className="select";
    52             divs[index].style.display="block";
    53             },2000);
    54             }
    55         }
    56         //创建之前看是否存在轮播定时器,有就清除掉
    57         if(timer){
    58             clearInterval(timer);
    59             timer=null;
    60         }
    61         //创建一个轮播定时器
    62         timer=setInterval(function(){
    63             index++;
    64             if(index>=titles.length){
    65                 index=0;
    66             }
    67             for(var i=0;i<titles.length;i++){
    68                 titles[i].className="";
    69                 divs[i].style.display="none";
    70             }
    71             titles[index].className="select";
    72             divs[index].style.display="block";
    73         },2000);
    74 }
    75 tab();
    76 </script>        

    做这个标签页demo的过程中感觉单独的功能做出来还是比较能理解,难理解的是把三个功能做在一起,重复做了几遍,经常会卡壳,不知道下一步的思维逻辑。下一步终极+目标是代码优化了,上面的代码太多的重复,后续如何,下回分解。

  • 相关阅读:
    EasyUI限制时间选择(开始时间小于结束时间)
    C# readonly与const的区别
    C# Lambda 表达式
    C# 扩展方法
    C# 枚举enum
    Visual Studio中的“build”、“rebuild”、“clean”的区别
    无root开热点教程
    数据库锁
    安卓:标题栏右上角添加按钮
    安卓:从assets目录下复制文件到指定目录
  • 原文地址:https://www.cnblogs.com/yewenxiang/p/6060453.html
Copyright © 2011-2022 走看看