1、排他思想
如果有同一组元素,想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (保留我自己)
- 注意顺序不能颠倒
思路:
a. 选择需要的一类标签,获得一个伪数组;
b. 用for()循环遍历获得的伪数组,排除其他(包括自己)的所有样式;
c. 遍历后用this改变自己的样式。
代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<style>
.change {
background-color: skyblue;
}
</style>
<script>
window.onload = function () {
var btns = document.getElementsByTagName('button');
for (var i = 0; i < btns.length; i++) {
btns[i].index = i; //记录索引号
btns[i].onclick = function () {
//把所有按钮的颜色去掉 --->干掉所有人(包括自己)
for (var i = 0; i < btns.length; i++) {
btns[i].className = '';
}
//改变当前颜色 ---> 保留我自己
this.className = 'change';
}
}
}
</script>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<button>按钮6</button>
</body>
</html>
2、应用
应用案例
新浪新闻页:如图
实现方法:
最外面一个大盒子,大盒子里上面一个放按钮,下面一个盒子放div,且上下个数对应。移动鼠标,按钮颜色变化且相应的盒子出现。
2.1 单Tab栏
代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
.tab {
width: 360px;
margin: 100px auto;
}
.tab_list {
height: 36px;
border: 1px solid #DBDEE1;
background-color: #F7F7F7;
}
.tab_list li {
float: left;
height: 35px;
line-height: 36px;
padding: 0 10px;
text-align: center;
cursor: pointer;
font-size: 16px;
}
.tab_list .current {
border-top: 3px solid #ff8400;
background-color: #fff;
margin-top: -1px;
border-left: 1px solid #DBDEE1;
margin-left: -1px;
border-right: 1px solid #DBDEE1;
}
.tab_con {
padding: 10px 0 0 0;
}
.item {
display: none;
}
</style>
<script>
window.onload = function () {
// 获取元素
var lis = document.querySelector('.tab_list').querySelectorAll('li');
var items = document.querySelectorAll('.item');
// for循环绑定点击事件
for (var i = 0; i < lis.length; i++) {
lis[i].index = i; //记录索引号
lis[i].onmouseover = function () {
// 排他思想
// 干掉所有人
for (var i = 0; i < lis.length; i++) {
lis[i].className = '';
}
// 保留我自己
this.className = 'current';
// 下面div显示内容模块
// 干掉所有人 让其余的item 这些div 隐藏
for (var j = 0; j < items.length; j++) {
items[j].style.display = 'none';
}
// 保留我自己 让对应的item 显示出来
items[this.index].style.display = 'block';
}
}
}
</script>
<body>
<div class="tab">
<div class="tab_list">
<ul>
<li class="current">图片</li>
<li>专栏</li>
<li>热点</li>
</ul>
</div>
<div class="tab_con">
<div class="item" style="display: block;">
图片部分
</div>
<div class="item">
专栏部分
</div>
<div class="item">
热点部分
</div>
</div>
</div>
</body>
</html>
效果
2.2 多Tab栏
若直接使用单Tab的会出错,多个tab栏切换时需要用大盒子的id区分来封装个函数。
代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
.tab {
width: 360px;
margin: 100px auto;
}
.tab_list {
height: 36px;
border: 1px solid #DBDEE1;
background-color: #F7F7F7;
}
.tab_list li {
float: left;
height: 35px;
line-height: 36px;
padding: 0 10px;
text-align: center;
cursor: pointer;
font-size: 16px;
}
.tab_list .current {
border-top: 3px solid #ff8400;
background-color: #fff;
margin-top: -1px;
border-left: 1px solid #DBDEE1;
margin-left: -1px;
border-right: 1px solid #DBDEE1;
}
.tab_con {
padding: 10px 0 0 0;
}
.item {
display: none;
}
</style>
<script>
window.onload = function () {
function bigbox(bigid) {
var bigid = document.getElementById(bigid); //大盒子的id
var lis = bigid.querySelector('.tab_list').querySelectorAll('li');
var items = bigid.querySelectorAll('.item');
for (var i = 0; i < lis.length; i++) {
lis[i].index = i;
lis[i].onmouseover = function () {
//排他思想
for (var i = 0; i < lis.length; i++) {
lis[i].className = '';
}
this.className = 'current';
for (var j = 0; j < items.length; j++) {
items[j].style.display = 'none';
}
items[this.index].style.display = 'block';
//或者合并代码(如下)
/*
* for (var j=0; j<lis.length;j++){
* lis[j].className='';
* items[j].style.display='none';
* }
* this.className='current';
* items[this.index].style.display='block';
*/
}
}
}
bigbox('one');
bigbox('two');
}
</script>
<body>
<div class="tab" id="one">
<div class="tab_list">
<ul>
<li class="current">图片</li>
<li>专栏</li>
<li>热点</li>
</ul>
</div>
<div class="tab_con">
<div class="item" style="display: block;">
图片部分
</div>
<div class="item">
专栏部分
</div>
<div class="item">
热点部分
</div>
</div>
</div>
<div class="tab" id="two">
<div class="tab_list">
<ul>
<li class="current">视频</li>
<li>综艺</li>
</ul>
</div>
<div class="tab_con">
<div class="item" style="display: block;">
视频部分
</div>
<div class="item">
综艺部分
</div>
</div>
</div>
</body>
</html>
效果