代码
<!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的宽度是一样的。所以就会外下排列。
上述纯属个人理解,如有不正确的地方,请指正。