JS闯关之路

多级菜单

2017-07-24  本文已影响9人  icessun
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>多级菜单</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
                list-style: none;
            }
            .wrap{
                width: 500px;
                margin:10px;
                 padding:10px;
                /*linear-gradient:渐变要指定内核才能有效果*/
                background: -webkit-linear-gradient(top,lightcyan,lightgoldenrodyellow,lightcoral);
            }
            .wrap li{
                line-height: 25px;
                position: relative;
            }
            .wrap em{
                position: absolute;
                width: 16px;
                height:16px;
                top: 6px;
                /*加号*/
                background: url(img/icon.png) no-repeat -59px -28px;
                /*减号*/
               /*background: url(img/icon.png) no-repeat -42px -28px;*/
            }
            .wrap li span{
                margin-left: 20px;
            }
            .wrap li em:hover{
                cursor: pointer;
            }
            .wrap ul{
                /*display: none;*/
            }
             .wrap .one{
                 text-indent: 40px;
             }
             .wrap .two{
                 text-indent: 80px;
            }
             .wrap .three{
                text-indent: 120px;
              }
        </style>
    </head>
    <body>
        <ul class="wrap" id="wrap">
                <li><em></em><span>第一级第一个</span>
                    <ul class="one">
                      <li><em></em><span>第二级第一个</span>
                          <ul class="two">
                            <li><span>第三级第一个</span></li>
                            <li><em></em><span>第三级第二个</span>
                                <ul class="three">
                                    <li><span>第四级第一个</span></li>
                                    <li><span>第四级第二个</span></li>
                                </ul>
                            </li>
                            <li><span>第三级第三个</span></li>
                          </ul>
                      </li>
                      <li><span>第二级第二个</span></li>
                      <li><em></em><span>第二级第三个</span>
                          <ul class="two">
                             <li><span>第三级第一个</span></li>
                             <li><span>第三级第二个</span></li>
                          </ul>
                      </li>
                      <li><em></em><span>第二级第四个</span>
                          <ul class="two">
                             <li><em></em><span>第三级第一个</span>
                                 <ul class="three">
                                    <li><span>第四级第一个</span></li>
                                    <li><span>第四级第二个</span></li>
                                    <li><span>第四级第三个</span></li>
                                 </ul>
                             </li>
                             <li><span>第三级第二个</span></li>
                             <li><span>第三级第三个</span></li>
                             <li><span>第三级第四个</span></li>
                          </ul>
                      </li>
                    </ul>
                </li>
        </ul>
        <script src="js/jquery.js"></script>
        <script type="text/javascript">
            var $wrap=$('#wrap');
            var $aSpan=$wrap.find('span')
//          console.log($aSpan)
// 使得每一个有子级的菜单都呈现出小手,可以点击 遍历对象的方法:$.each()
            $.each($aSpan, function(index,item) {
            //console.log($(item).prev());// 数组形式
//           console.log(item)
//console.log($(item));
                // item是一个原生js对象,纯粹的标签,使用jquery方法prev(),找到span的父级元素
                var preEm=$(item).prev();
                
                if(preEm.length){
                     $(item).css('cursor','pointer'); // 添加的是行内样式
                }
            });
            
            //当一个容器里面有多个点击事件发生的时候,使用事件委托给容器
            $wrap.click(function(e){
                 //如果事件源是(span),看span前是否有em;如果有em,再看容器中是否有ul,显示-隐藏,隐藏-显示; 注意改变em的背景图;
                  var target= e.target;//原生js  获取事件源
//                console.log(target.tagName) //大写的事件名
                  // 判断 事件源
                  if(target.tagName.toLowerCase()=== 'span' || target.tagName.toLowerCase()=='em'){
                     var $parent=$(target.parentNode);
//                   console.log($parent);
                     var $ul=$parent.children('ul'); // 找的是li下面的子代childrenul
                     console.log($ul)
                     var $em=$parent.children('em');
              if($ul.length){// 说明在父节点li里面找到了ul,li里面还可以展开
                if($ul.css('display')=='block'){//收
                    //当收起来的时候,让该容器下所有的ul都收起来;同时,让该容器下,所有的em都变成+号;
                    var $aUl=$parent.find('ul');// 所有的,包括孙子ul
                    var $aEm=$parent.find('em');
                    $aUl.css('display','none');
                    $aEm.css('background','url("img/icon.png") no-repeat -59px -28px')
                }else{//展开
                    $ul.css('display','block');
                    $em.css('background','url("img/icon.png") no-repeat -42px -29px')
                }
            }
                  }
            })
            
            
        </script>
    </body>
</html>
上一篇 下一篇

猜你喜欢

热点阅读