<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>选项卡</title>
<!-- IMPORT CSS -->
<style>
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
.tabBox {
box-sizing: border-box;
margin: 20px auto;
width: 500px;
}
.navBox {
display: flex;
position: relative;
top: 1px;
}
.navBox li {
box-sizing: border-box;
margin-right: 10px;
padding: 0 10px;
line-height: 35px;
border: 1px solid #999;
}
.navBox li.active {
border-bottom-color: #FFF;
}
.tabBox>div {
display: none;
box-sizing: border-box;
padding: 10px;
height: 150px;
border: 1px solid #999;
}
.tabBox>div.active {
display: block;
}
</style>
<script>
// 在结构加载之前获取元素肯定获取不到,所以我们一般把 JS 放到 BODY 末尾(就是为了等待结构加载完再去获取元素)
// let tabBox = document.getElementById('tabBox');
// console.log(tabBox); // null
// 1.如果不需要获取页面中的元素,放到哪都可以
// 2.就是想放到开头,还想获取元素,可以基于 window.onload 或者 JQ 中的 $(document).ready() 来处理
</script>
</head>
<body>
<div class="tabBox">
<ul class="navBox">
<li class="active">编程</li>
<li>读书</li>
<li>运动</li>
</ul>
<div class="active">编程使我快乐</div>
<div>读书使我幸福</div>
<div>运动使我健康</div>
</div>
<!-- IMPORT JS -->
<script>
// 链式调用方式,有点浪费性能
$('.tabBox>.navBox>li').click(function () {
let n = $(this).index();
$(this).addClass('active')
.siblings().removeClass('active')
.parent()
.nextAll('div').eq(n).addClass('active')
.siblings().removeClass('active');
});
</script>
<script>
/*
* $([function]):等待页面中所有的 DOM 结构加载完成才会执行这个方法
* => $(document).ready([function])
*
* window.onload=function () {} :等待页面中所有的资源(DOM 结构、内容、其它的富媒体资源等)
都加载完成才会执行函数
*/
/* $(function () {
// 选项卡正常思路:给所有的 LI 绑定点击事件 ,当点击某一个 LI 的时候,让其有选中样式,而其余的LI 都移除选中样式,同时对应索引的 DIV 有选中样式,其余的 DIV 移除选中样式即可,这样就可以实现选项卡切换效果
let $tabBox = $('#tabBox'),
$navList = $tabBox.find('#navBox>li'),
$divList = $tabBox.children('div');
// JQ 特性:内置循环处理机制(基于一个 JQ 集合去操作某个方法,我们无需循环每一项单独操作,JQ 内部帮我们循环处理了,例如:$navList.css('color','#000')集合中有100项,JQ 会把100项都设置了这个样式,无需自己循环处理 )
$navList.on('click', function () {
// THIS:当前点击操作的元素 => $(this)此能调取 JQ 方法
// JQ特性:链式写法
let n = $(this).index();
$(this).addClass('active').siblings().removeClass('active');
// 根据点击 LI 的索引,在 DIV 集合中找到对应的那一项,然后这一项选中,它的兄弟项都移除选中即可
$divList.eq(n).addClass('active').siblings().removeClass('active');
});
基于 JQ 中的 EACH 遍历集合中的每一项,绑定点击事件
$navList.each(function (index, $item) {
// 参数顺序和内置的 FOR-EACH 是反着的
// index:当前循环这一项的索引
// $item:当前循环的这一项
// this === $item:当前方法中的 THIS 也是循环的这一项
$item.on('click', function () {
...
});
});
$navList.each((index, $item) => {
// THIS 不再是循环的这一项(箭头函数中没有 THIS)
});
}); */
</script>
</body>
</html>