选项卡案例实现
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>选项卡小案例</title> <link rel="stylesheet" href="reset.min.css"> <style> .cardBox { width: 600px; margin: 20px auto; } .cardBox ul { position: relative; top: 1px; } .cardBox ul li { float: left; margin-right: 20px; width: 80px; height: 30px; text-align: center; line-height: 30px; border: 1px solid #000; } .cardBox div { width: 600px; height: 300px; text-align: center; line-height: 300px; border: 1px solid #000; display: none; } .cardBox li.active { background-color: aqua; border-bottom-color: aqua; } .cardBox div.active { background-color: aqua; display: block; } </style></head><body> <div class="cardBox" id="cardBox"> <ul class="clearfix"> <li class="active">新闻</li> <li>娱乐</li> <li>图片</li> </ul> <div class="active">新闻页</div> <div>娱乐页</div> <div>图片页</div> </div> <script> /* 效果:当点击LI标签让对应的div显示 * 思路: * 1、当点击第一个LI时让第一个LI和第一个div同时加上active的class名, * 2、并让其他两个没有active的class名 * (也可以是点击LI时,先让所有LI和DIV都没有active的class名, * 点击谁,让谁有active的class名) */ let cardBox = document.getElementById("cardBox"), list = cardBox.getElementsByTagName("li"), divs = cardBox.getElementsByTagName("div"); function changeBox(index) { // 让点击的这个LI和DIV有选中样式(但是创建函数的时候,还不知道点击的是哪一个LI呢,只有点击的时候才知道,此时我们要把点击的是哪一个作为形参,提供对应的入口) =>index形参变量:点击的是谁,就在执行changeBox的时候,把点击这一项的索引传递给我 for (var i = 0; i < list.length; i++) { list[i].className = ""; divs[i].className = ""; } list[index].className = "active"; divs[index].className = "active"; } for (var i = 0; i < list.length; i++) { //=>list[i] 获取到的LI元素对象(堆,有很多内置的属性,也可以设置自定义属性) // 我们在每一轮循环的时候,给当前元素对象的堆内存中设置一个自定义属性index,属性值存储当前LI元素对象的索引 list[i].index = i list[i].onclick = function () { // 传递当前点击这个LI的索引 // this => 当前点击的这个LI,而我们基于它的自定义属性index,就可以拿到它的索引 changeBox(this.index); } } </script></body></html>复制代码
不能直接用i当作形参的原因
for (var i = 0; i < list.length; i++) {
list[i].onclick = function () {
changeBox(i);
}
}
// 这样写不行的原因:点击每一个LI的时候,绑定事件函数中的i都是3(循环结束后i的结果)
/*
i=0 第一轮循环 i++
list[0].onclick = function () {
此处是创建函数,函数存储的是一堆破字符串,我们看到的i,也只是一个字符
“changeBox(i);”
}
i=1 第二轮循环 i++
list[1].onclick = function () {
“changeBox(i);”
}
i=2 第三轮循环 i++
list[2].onclick = function () {
“changeBox(i);”
}
i=3 循环结束
........
手欠点了第二个LI,触发第二个LI绑定的函数
changeBox(i) 此时的i已经是循环结束后的3了
*/
复制代码
