JQuery-链式练习中遇到的问题

2017-11-08  本文已影响0人  Alex_717
代码
<!DOCTYPE html>
<html>
<head>
    <style type="text/css">
        #menu{
            width: 300px;
        }
        div a{
            float: left;
            display: none;
            width: 300px;
            background-color: #888;
        }
        .has_children{
            background-color: #555;
            color: #fff;
            cursor: pointer;
        }
        .highlight{
            background-color: green;
        }
    </style>
    <title>链式写法</title>
</head>
<body>
    <div id="menu">
        <div class="has_children">
            <span>第1章</span>
            <a href="#">1.1</a>
            <a href="#">1.2</a>
            <a href="#">1.3</a>
            <a href="#">1.4</a>
            <a href="#">1.5</a>
        </div>
        <div class="has_children">
            <span>第2章</span>
            <a href="#">2.1</a>
            <a href="#">2.2</a>
            <a href="#">2.3</a>
            <a href="#">2.4</a>
            <a href="#">2.5</a>
        </div>
        <div class="has_children">
            <span>第3章</span>
            <a href="#">3.1</a>
            <a href="#">3.2</a>
            <a href="#">3.3</a>
            <a href="#">3.4</a>
            <a href="#">3.5</a>
        </div>
    </div>
</body>
<script src="../scripts/jquery-3.2.1.js"></script>
<script type="text/javascript">
    
    $(".has_children").on('click', function(){
        $(this).addClass('highlight')         
               .children('a').show()
               .end()
               .siblings().removeClass("highlight")
               .children('a').hide(); 
    });
</script>
</html>

在这次练习中,遇到了两个问题:
1、为什么当点击div.has_children时,添加了highlight样式,但只有<span>标签的背景色变为了绿色。下面展开的a标签的内容的背景色并没有变为绿色。a标签中的内容也是div.has_children中的内容。
2、在调用了siblings()方法后,下面的.children('a').hide(); 作用于this还是this的兄弟元素。

第一个问题:因为a标签设置了float样式,此时已经脱离了文档流,而div.has_children并没有设置高度,因此div中包裹着的是span标签。如果要在视觉上div.has_children包裹a标签。可以动态地给div.has_children添加高度。但是此时的a标签其实还是脱离了文档流了的。
第二个问题:在调用siblings后,后面的.children('a').hide();虽然还跟在$(this)后面,但是收到siblings()的影响。.children('a').hide();此时是作用于this对象的兄弟元素。

其中这里面还有另一个知识点。
点击了div.has_children后,a标签一个一个往下排列。而没有一个一个挨着左边排列。这是因为a标签设置了float样式,然后就可以设置宽度,此时设置的宽度和父元素div.menu的宽度是一样的。所以就会外下排列。

上述纯属个人理解,如有不正确的地方,请指正。

上一篇 下一篇

猜你喜欢

热点阅读