1.小米搜索框案例:
代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
ul {
list-style: none;
}
.mi {
position: relative;
width: 223px;
margin: 100px auto;
}
.mi input {
width: 223px;
height: 48px;
padding: 0 10px;
font-size: 14px;
line-height: 48px;
border: 1px solid #e0e0e0;
outline: none;
transition: all 0.3s;
}
.mi .search {
border: 1px solid #ff6700;
}
.result-list {
display: none;
position: absolute;
left: 0;
top: 48px;
width: 223px;
border: 1px solid #ff6700;
border-top: 0;
background: #fff;
}
.result-list a {
display: block;
padding: 6px 15px;
font-size: 12px;
color: #424242;
text-decoration: none;
}
.result-list a:hover {
background-color: #eee;
}
</style>
</head>
<body>
<div class="mi">
<input type="search" placeholder="小米笔记本" />
<ul class="result-list">
<li><a href="#">全部商品</a></li>
<li><a href="#">小米11</a></li>
<li><a href="#">小米10S</a></li>
<li><a href="#">小米笔记本</a></li>
<li><a href="#">小米手机</a></li>
<li><a href="#">黑鲨4</a></li>
<li><a href="#">空调</a></li>
</ul>
</div>
<script>
/* 学习目标: 输入框焦点事件
1. onfocus : 成为焦点。 点击输入框出现光标,此时输入可以输入
2. onblur : 失去焦点。 点击页面其他区域光标消失,此时输入框不可以输入
小米搜索框思路
(1)输入框成为焦点: 显示ul列表, 输入框添加自身边框
(2)输入框失去焦点: 隐藏ul列表, 输入框移除自身边框
*/
//1.获取元素
let input = document.querySelector('input')
let ul = document.querySelector('.result-list')
//2.注册事件
//2.1 成为焦点
input.onfocus = function () {
//this : 事件源 input
console.log('1-你点击我了,光标出现,此时可以输入内容了')
//3. 输入框成为焦点: 显示ul列表, 输入框添加自身边框
//(1)显示ul
ul.style.display = 'block'
//(2)自身添加边框 元素.classList.add('类名')
this.classList.add('search')
}
//2.2 失去焦点
input.onblur = function () {
console.log('2-你点击了其他区域,我的光标消失了,此时不可以输入内容')
//输入框失去焦点: 隐藏ul列表, 输入框移除自身边框
//(1)隐藏ul
ul.style.display = 'none'
//(2)自身移除边框 元素.classList.remove('类名')
this.classList.remove('search')
}
</script>
</body>
</html>
2.购物车+ -案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
div {
width: 80px;
}
input[type='text'] {
width: 50px;
height: 44px;
outline: none;
border: 1px solid #ccc;
text-align: center;
border-right: 0;
}
input[type='button'] {
height: 24px;
width: 22px;
cursor: pointer;
}
input {
float: left;
border: 1px solid #ccc;
}
</style>
</head>
<body>
<div>
<input type="text" id="total" value="1" readonly />
<input type="button" value="+" id="add" />
<input type="button" value="-" id="reduce" />
<script>
/* 分析思路:交互
1.点击+号按钮: 输入框内容数量 自身+1
2.点击-号按钮: (1)输入框内容数量 自身-1 (2)当数量为0的时候,禁用-号按钮
*/
//1.获取元素
let add = document.querySelector('#add')
let reduce = document.querySelector('#reduce')
let total = document.querySelector('#total')
//2.注册事件
//2.1 +号点击
add.onclick = function () {
//3.输入框内容数量 自身+1
total.value++ //total.value = total.value + 1
//细节: 只要点击了+号, 此时-号无条件可以点击
reduce.disabled = false
}
//2.2 -号点击
reduce.onclick = function () {
//this : reduce按钮
//3.1 输入框内容数量 自身-1
total.value--
//3.2 当数量为0的时候,禁用-号按钮
console.log(total.value)//字符串类型数字
if (total.value == 0) {
//禁用-号按钮
this.disabled = true
}
}
</script>
</div>
</body>
</html>
3.图片切换案例
图片切换核心思路:
- 1.数组存储图标路径(左右切换)
- 2.使用变量存储下标 let index = 0 ; index++ index–
代码实现:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=0"
/>
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
.title {
background-color: skyblue;
color: white;
}
img {
width: 200px;
height: 200px;
box-shadow: 0 0 20px hotpink;
}
</style>
</head>
<body>
<h2 class="title">图片切换</h2>
<img alt="" src="./images/01.jpg" />
<br />
<input id="prev" type="button" value="上一张" />
<input id="next" type="button" value="下一张" />
<script>
/* 思路分析:交互
*** 图片无限切换核心思路: 全局变量index记录当前图片下标
1.点击下一张 : 修改img标签的src属性 (1)index++
2.点击上一张 : 修改img标签的src属性 (1)index--
*/
let arr = [
'./images/01.jpg',
'./images/02.jpg',
'./images/03.jpg',
'./images/04.jpg',
'./images/05.jpg'
]
//*** 0.声明全局变量记录当前图片下标
let index = 0
//1.获取元素
let prev = document.querySelector('#prev')
let next = document.querySelector('#next')
let img = document.querySelector('img')
//2.注册事件
//2.1 下一页
next.onclick = function () {
//3.1 无限切换: 如果当前下标是最后一张,则变成0 。 否则 index++
if (index == arr.length - 1) {
index = 0
} else {
index++
}
console.log(index)
//3.2 修改img标签的src属性
img.src = arr[index]
}
//2.2 上一页
prev.onclick = function () {
//3.1 无限切换上一页: 如果当前下标是0,则变成最后一张下标。 否则 index--
if (index == 0) {
index = arr.length - 1
} else {
index--
}
console.log(index)
//3.2 修改img标签的src属性
img.src = arr[index]
}
</script>
</body>
</html>
4.输入框文字变化案例:
代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
.userCount {
color: red;
}
</style>
</head>
<body>
<div class="controls">
<textarea
placeholder="说点什么吧..."
id="area"
cols="30"
rows="10"
maxlength="200"
></textarea>
<div>
<span class="userCount">0</span>
<span>/</span>
<span>200</span>
</div>
</div>
<script>
/* 需求分析
文本框输入事件 : 获取输入框文本长度,赋值给span标签
输入事件: oninput 输入框输入内容了就会触发
*/
//1.获取元素
let area = document.querySelector('#area')
let userCount = document.querySelector('.userCount')
//2.注册事件
area.oninput = function () {
// console.log('用户输入了内容')
// this : 事件源area
// 获取文本
// console.log(this.value)
// 获取文本长度
// console.log(this.value.length)
//3.事件处理 获取输入框文本长度,赋值给span标签
/*
innerText : 操作普通元素的文本
value : 操作表单的输入框文本
*/
userCount.innerText = this.value.length
}
</script>
</body>
</html>
5.排他思想按钮案例:
代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<script>
/* 思路分析:点击每一个按钮 : 排他思想修改样式(我自己样式改变,其他人样式恢复默认) */
//1.获取元素
let buttonList = document.querySelectorAll('button')
console.log(buttonList) //伪数组
//2.注册事件
//五个按钮都要注册事件,使用循环语句
for (let i = 0; i < buttonList.length; i++) {
//i = 0 1 2 3 4
//注册点击事件
buttonList[i].onclick = function () {
//3.事件处理
console.log(this) //事件源: 当前点击的按钮
/* 排他思想: 排除他人,复活自己*/
//排除他们
for(let j = 0;j<buttonList.length;j++){
buttonList[j].style.backgroundColor = ''
}
//复活自己
this.style.backgroundColor = 'pink'
}
}
// 个人理解:
/*
外层循环:是为每一个按钮注册事件,增加样式(2)复活自己
里层循环:是得到每一个按钮的样式,并取消 (1)干掉所有兄弟样式
不是双重for循环 外层循环与里层循环 没有任何关系
*/
</script>
</body>
</html>
5.1排他思想升级:
代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style>
.pink {
background-color: pink;
}
</style>
</head>
<body>
<button class="pink">按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
</body>
<script>
// 1.获取元素
let buttonList = document.querySelectorAll('button')
// 2.注册事件 得到每一个button 点击
for (let i = 0; i < buttonList.length; i++) {
buttonList[i].onclick = function () {
// 3.事件处理: 点击的时候 去除包含pink的样式 ('选择器') 类选择器.pink 属性选择器 [class="pink"] 交集选择器button.pink ....
document.querySelector('[class="pink"]').classList.remove('pink')
// 属性.classList.remove('类名')
// 为自己添加 类名为pink的样式
this.classList.add('pink')
}
}
</script>
</html>
6.突出展示案例:
代码实现:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
body {
background: #000;
}
.wrap {
margin: 100px auto 0;
width: 630px;
height: 394px;
padding: 5px;
background: #000;
overflow: hidden;
border: 1px solid #fff;
}
.wrap li {
float: left;
padding: 5px;
}
.wrap img {
display: block;
border: 0;
}
</style>
</head>
<body>
<div class="wrap">
<ul>
<li>
<a href="#"><img src="images/01.jpg" alt=""/></a>
</li>
<li>
<a href="#"><img src="images/02.jpg" alt=""/></a>
</li>
<li>
<a href="#"><img src="images/03.jpg" alt=""/></a>
</li>
<li>
<a href="#"><img src="images/04.jpg" alt=""/></a>
</li>
<li>
<a href="#"><img src="images/05.jpg" alt=""/></a>
</li>
<li>
<a href="#"><img src="images/06.jpg" alt=""/></a>
</li>
</ul>
<script>
/* 思路分析: 鼠标移入每一个li元素: 排他思想修改opacity
1.注册事件:鼠标移入每一个li元素(需要使用循环)
2. 排他思想修改opacity : 需要循环
* 移入的元素: 1
* 其他兄弟: 0.5
*/
//1.获取元素
let liList = document.querySelectorAll('.wrap li')
//2.循环遍历数组给每一个li元素注册事件
for (let i = 0; i < liList.length; i++) {
//鼠标移入事件
liList[i].onmouseenter = function () {
//3.排他思想修改样式
//排除他人
for (let j = 0; j < liList.length; j++) {
liList[j].style.opacity = 0.5
}
//复活自己
this.style.opacity = 1
}
}
</script>
</div>
</body>
</html>
6.1突出展示案例:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
body {
background: #000;
}
.wrap {
margin: 100px auto 0;
width: 630px;
height: 394px;
padding: 5px;
background: #000;
overflow: hidden;
border: 1px solid #fff;
}
.wrap li {
float: left;
padding: 5px;
}
.wrap img {
display: block;
border: 0;
}
</style>
</head>
<body>
<div class="wrap">
<ul>
<li>
<a href="#"><img src="images/01.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="images/02.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="images/03.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="images/04.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="images/05.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="images/06.jpg" alt="" /></a>
</li>
</ul>
</div>
<script>
// 1.获取元素
let liList = document.querySelectorAll('.wrap li')
// 伪数组
/*
for (let i = 0; i < liList.length; i++) {
// 2.注册事件 鼠标移入liList
liList[i].onmouseenter = function () {
// 事件处理
liList[i].style.backgroundColor = 'red'
// console.log('ceshi')
liList[i].style.opacity = '0.5'
}
// 鼠标移出
liList[i].onmouseleave = function () {
liList[i].style.opacity = '1'
}
}
*/
// ----得到每个li
for (let i = 0; i < liList.length; i++) {
// 2.注册事件 鼠标移入
liList[i].onmouseenter = function () {
// 3.事件处理 背景半透明
liList[i].style.opacity = '0.5'
//----再次得到每个li
for (let j = 0; j < liList.length; j++) {
// 注册事件 鼠标离开
liList[i].onmouseleave = function () {
//4.事件处理 背景显示
liList[i].style.opacity = ''
}
}
}
}
</script>
</body>
</html>
这个也是可以实现的:
不过需要单独在style里设置一个样式,用于classList.toggle(‘类名’) 切换样式
<script>
// 1.思路 首先需要单数设置一个CSS样式 方便用切换 元素.classList.toggle('类名') liList[i].classList.toggle('opacity')
// 2.获取元素 遍历得到每一个li ...liList .... querySelectorAll('选择器') 返回伪数组
// 3.事件注册 鼠标移入/移出时 2个事件 liList[i].onmouseenter / liList[i].onmouseleave
// 4.事件处理 li的背景颜色发生改变 第一步有设置样式了 在事件里切换即可 liList[i].classList.toggle('opacity')
// 1.获取元素
let liList = document.querySelectorAll('.wrap li')
//遍历 得到每个li
for (let i = 0; i < liList.length; i++) {
// 2.事件注册 鼠标移入
liList[i].onmouseenter = function () {
// 3.事件处理
liList[i].classList.toggle('opacity')//切换样式 类名有则移除 无则添加
}
liList[i].onmouseleave = function () {
liList[i].classList.toggle('opacity')//切换样式 类名有则移除 无则添加
}
}
</script>
7.全选/反选/全不选案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<input class='check' type="checkbox">
<input class='check' type="checkbox">
<input class='check' type="checkbox">
<input class='check' type="checkbox">
<input class='check' type="checkbox">
<input id="checkAll" type="button" value="全选">
<input id="unCheckAll" type="button" value="全不">
<input id="reverseCheck" type="button" value="反选">
<script>
/*
1.全选 : 设置选择框列表的 checked属性为true
2.全不选 : 设置选择框列表的 checked属性为false
3.反选 : 设置选择框列表的 checked与自身相反( true变false, false变true )
*/
//1.获取元素
let checkAll = document.querySelector('#checkAll')
let unCheckAll = document.querySelector('#unCheckAll')
let reverseCheck = document.querySelector('#reverseCheck')
let checkList = document.querySelectorAll('.check')//选择框列表
//2.1 全选
checkAll.onclick = function () {
for (let i = 0; i < checkList.length; i++) {
checkList[i].checked = true
}
}
//2.2 全不选
unCheckAll.onclick = function () {
for (let i = 0; i < checkList.length; i++) {
checkList[i].checked = false
}
}
//2.3 反选
reverseCheck.onclick = function () {
for (let i = 0; i < checkList.length; i++) {
//如果checked是true,就要变成false。 否则false就要变成true
// if( checkList[i].checked ){
// checkList[i].checked = false
// }else{
// checkList[i].checked = true
// }
/* 表达式 ? 代码1 : 代码2 */
// checkList[i].checked = checkList[i].checked ? false : true
//逻辑非 true变false false变true
checkList[i].checked = !checkList[i].checked
}
}
</script>
</body>
</html>
8.全选反选框升级:
代码实现1:求和思想
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
<style>
* {
margin: 0;
padding: 0;
}
table {
border-collapse: collapse;
border: 1px solid #c0c0c0;
width: 500px;
margin: 100px auto;
text-align: center;
}
th {
background-color: #09c;
font: bold 16px '微软雅黑';
color: #fff;
height: 24px;
}
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
</style>
</head>
<body>
<table>
<tr>
<th><input type="checkbox" id="checkAll" />全选/全不选</th>
<th>菜名</th>
<th>商家</th>
<th>价格</th>
</tr>
<tr>
<td>
<input type="checkbox" class="check" />
</td>
<td>红烧肉</td>
<td>隆江猪脚饭</td>
<td>¥200</td>
</tr>
<tr>
<td>
<input type="checkbox" class="check" />
</td>
<td>香酥排骨</td>
<td>隆江猪脚饭</td>
<td>¥998</td>
</tr>
<tr>
<td>
<input type="checkbox" class="check" />
</td>
<td>北京烤鸭</td>
<td>隆江猪脚饭</td>
<td>¥88</td>
</tr>
</table>
<script>
/* 思路分析
1.点击全选/全不选 : 选择框列表的checked值与自身一致
2.点击下方每一个选择框 : 判断上方选择框的checked值是true还是false
true : 全部都选中
false: 只要有一个没有选中
*/
//1.获取元素
let checkAll = document.querySelector('#checkAll')
let checkList = document.querySelectorAll('.check')
//2.1 点击全选
checkAll.onclick = function(){
//选择框列表的checked值与自身一致
// console.log( this )//自身,指向事件源
for(let i = 0;i<checkList.length;i++){
checkList[i].checked = this.checked
}
}
//2.2 下方选择框列表
for(let i = 0;i<checkList.length;i++){
checkList[i].onclick = function(){
/*3.事件处理:判断是否全部选中
true:全部选中
false:没有全部选中
累加思想 : 求选中数量的累加和, 判断和选择框总数 是否一致
*/
let sum = 0
for(let j = 0;j<checkList.length;j++){
if( checkList[j].checked ){
sum++
}
}
console.log( sum )
//判断选中的数量 和 选择框数量是否一致
// if( sum == checkList.length ){
// checkAll.checked = true
// }else{
// checkAll.checked = false
// }
checkAll.checked = (sum == checkList.length)
}
}
</script>
</body>
</html>
代码实现2:开关思想
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
<style>
* {
margin: 0;
padding: 0;
}
table {
border-collapse: collapse;
border: 1px solid #c0c0c0;
width: 500px;
margin: 100px auto;
text-align: center;
}
th {
background-color: #09c;
font: bold 16px '微软雅黑';
color: #fff;
height: 24px;
}
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
</style>
</head>
<body>
<table>
<tr>
<th><input type="checkbox" id="checkAll" />全选/全不选</th>
<th>菜名</th>
<th>商家</th>
<th>价格</th>
</tr>
<tr>
<td>
<input type="checkbox" class="check" />
</td>
<td>红烧肉</td>
<td>隆江猪脚饭</td>
<td>¥200</td>
</tr>
<tr>
<td>
<input type="checkbox" class="check" />
</td>
<td>香酥排骨</td>
<td>隆江猪脚饭</td>
<td>¥998</td>
</tr>
<tr>
<td>
<input type="checkbox" class="check" />
</td>
<td>北京烤鸭</td>
<td>隆江猪脚饭</td>
<td>¥88</td>
</tr>
</table>
<script>
/* 思路分析
1.点击全选/全不选 : 选择框列表的checked值与自身一致
2.点击下方每一个选择框 : 判断上方选择框的checked值是true还是false
true : 全部都选中
false: 只要有一个没有选中
*/
//1.获取元素
let checkAll = document.querySelector('#checkAll')
let checkList = document.querySelectorAll('.check')
//2.1 点击全选
checkAll.onclick = function(){
//选择框列表的checked值与自身一致
// console.log( this )//自身,指向事件源
for(let i = 0;i<checkList.length;i++){
checkList[i].checked = this.checked
}
}
//2.2 下方选择框列表
for(let i = 0;i<checkList.length;i++){
checkList[i].onclick = function(){
/*3.事件处理:判断是否全部选中
true:全部选中
false:没有全部选中
开关思想:
(1)声明布尔类型开关 let flag = true
(2)遍历选择框列表,只要有选择框没有选中。开关就要改成false
(3)循环结束后, 开关flag的值就是全选框的checked值
*/
let flag = true
for(let j = 0;j<checkList.length;j++){
if( !checkList[j].checked ){
flag = false
break//只要发现没有选中的,后面没有必要查看的
}
}
checkAll.checked = flag
}
}
//实际开发中,布尔类型作为条件判断是直接使用的
let bol = true
//判断bol是不是true
if( bol ){
console.log('是true')
}
let bo = false
//判断bo是不是false
if( !bo ){// 只有当bo是false的时候, 取反才会得到true(小括号条件成立)
console.log('是false');
}
</script>
</body>
</html>
9.tab栏切换:
代码实现:
排他思想1: (1)循环干掉其他兄弟 , (2)复活我自己
顺序不能错
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>tab栏切换</title>
<style>
.Box {
width: 240px;
border: 1px solid #000;
margin: 100px auto;
padding: 20px;
}
.con {
width: 100%;
height: 200px;
background-color: #cccccc;
border: 1px solid #000;
margin-top: 10px;
display: none;
}
.current {
background-color: pink;
border: 2px black solid;
}
.active {
display:block;
}
</style>
</head>
<body>
<div class="Box" id="box">
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<div class="con" style="display:block">内容1</div>
<div class="con">内容2</div>
<div class="con">内容3</div>
<div class="con">内容4</div>
</div>
<script>
/* 思路分析
点击上方按钮 : 排他思想 (1)修改按钮样式 (2)显示对应下标盒子
*/
//1.获取元素
let buttonList = document.querySelectorAll('#box>button')
let conList = document.querySelectorAll('#box>.con')
//2.循环上面按钮注册点击事件
for(let i = 0;i<buttonList.length;i++){
buttonList[i].onclick = function(){
//3.万能排他思想
//3.1 先干掉所有兄弟
for(let j = 0;j<buttonList.length;j++){//j = 0 1 2 3
buttonList[j].style.backgroundColor = ''
conList[j].style.display = 'none'
}
//3.2 复活我自己 和 下面下标一致兄弟
buttonList[i].style.backgroundColor = 'pink'
conList[i].style.display = 'block'
}
};
</script>
</body>
</html>
排他思想升级版:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
.wrapper {
width: 1000px;
height: 475px;
margin: 0 auto;
margin-top: 100px;
}
.tab {
border: 1px solid #ddd;
border-bottom: 0;
height: 36px;
width: 320px;
}
.tab li {
position: relative;
float: left;
width: 80px;
height: 34px;
line-height: 34px;
text-align: center;
cursor: pointer;
border-top: 4px solid #fff;
}
.tab span {
position: absolute;
right: 0;
top: 10px;
background: #ddd;
width: 1px;
height: 14px;
overflow: hidden;
}
.products {
width: 1002px;
border: 1px solid #ddd;
height: 476px;
}
.products .main {
float: left;
display: none;
}
.products .main.selected {
display: block;
}
.tab li.active {
border-color: red;
border-bottom: 0;
}
</style>
</head>
<body>
<div class="wrapper">
<ul class="tab">
<li class="tab-item active">国际大牌<span>◆</span></li>
<li class="tab-item">国妆名牌<span>◆</span></li>
<li class="tab-item">清洁用品<span>◆</span></li>
<li class="tab-item">男士精品</li>
</ul>
<div class="products">
<div class="main selected">
<a href="###"><img src="images/guojidapai.jpg" alt=""/></a>
</div>
<div class="main">
<a href="###"><img src="images/guozhuangmingpin.jpg" alt=""/></a>
</div>
<div class="main">
<a href="###"><img src="images/qingjieyongpin.jpg" alt=""/></a>
</div>
<div class="main">
<a href="###"><img src="images/nanshijingpin.jpg" alt=""/></a>
</div>
</div>
</div>
<script>
/* 点击上方列表: 排他思想修改样式
1. 万能排他 : (1)先干掉所有兄弟 (2)复活自己
2. 升级排他 : (1)先干掉上一次选中的兄弟 (2)复活自己
*/
//1.获取元素
let liList = document.querySelectorAll('.tab>li')// 选中类名 active
let mainList = document.querySelectorAll('.products>.main')// 选中类名 selected
//2.循环注册事件
for(let i = 0;i<liList.length;i++){
liList[i].onclick = function(){
//3.升级版排他
//3.1 先干掉上一次选中的兄弟
document.querySelector('li.active').classList.remove('active')
document.querySelector('.main.selected').classList.remove('selected')
//3.2 复活自己 + 对应兄弟
liList[i].classList.add('active')
mainList[i].classList.add('selected')
}
}
</script>
</body>
</html>