排他思想干货

这篇文章展示了如何使用HTML和CSS构建一个基础的Tab切换界面,通过清除所有元素样式并设置当前选中项的样式。JavaScript部分运用了排他思想,当点击列表项时,移除所有列表项的‘current’类并添加到被点击的项,同时隐藏所有内容模块并显示与选中列表项对应的内容。

1.所有元素全部清除样式
2.给当前元素设置样式
3.注意顺序不能颠倒,首先要把除自己外的其他人干掉,在设置自己

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			<style>
			body{
				background-Color:#ff9711;
			}
			    * {
			        margin: 0;
			        padding: 0;
			        border: 0;
			        box-sizing: border-box;
			    }
			    
			    li {
			        list-style: none;
			    }
			    
			    .tab {
			        width: 650px;
			        margin: 100px auto;
			    }
			    
			    .tab .tab_list {
			        width: 650px;
			        height: 70px;
			        line-height: 35px;
			        border: 1px solid #999;
			        background-color: #ccc;
			    }
			    
			    .tab_list li {
			        float: left;
			        height: 33px;
			        padding: 0 20px;
			        cursor: pointer;
			        text-align: center;
			    }
			    
			    .current {
			        background-color: #c81523;
			        color: #fff;
			    }
			    
			    .tab_con {
			        clear: both;
			    }
			    
			    .item {
			        display: none;
			    }
			</style>

		</style>
	</head>
	<body>
		<div class="tab">
		    <div class="tab_list">
		        <ul>
		            <li class="current">商品介绍</li>
		            <li>规格与包装</li>
		            <li>售后保障</li>
		            <li>商品评价(5000)</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 class="item">商品评价(5000)模块内容</div>
		        <div class="item">手机社区模块内容</div>
		    </div>
		</div>
<script>
    var lis = document.querySelector('ul').querySelectorAll('li');
	console.log(lis)
    var items = document.querySelectorAll('.item');
    for (i = 0; i < lis.length; i++) {
        // 为5个li设置自定义属性,用于当索引号
        lis[i].index = i
        lis[i].onclick = function() {
            // 1.排他思想
            for (i = 0; i < lis.length; i++) {
                lis[i].className = '';
            }
            this.className = 'current';
            // 2.获取一一对应的自定义索引号,当鼠标点击了li后,获取该li的索引号index并赋值给变量index
            // 这里只能用this,选中触发的事件,lis[i]则是循环最后的事件	
            for (var i = 0; i < items.length; i++) {
                items[i].style.display = 'none';
            }
			items[this.index].style.display = 'block';	
        }
    }
</script>

	</body>
</html>

<think> 我们被要求解释JavaScript排他思想的原理、实现方法及应用场景,并基于提供的引用内容进行回答。 引用[1]展示了按钮的排他操作:点击一个按钮时,先清除所有按钮的背景色(干掉所有人),再设置当前按钮的背景色(留下自己)。 引用[2]展示了一个类似的案例,点击div改变其背景色,其他div恢复原色。 原理:排他思想的核心是,在操作一组元素中的某一个时,首先清除该组元素中所有元素的样式或状态(即排除其他元素的影响),然后再设置当前元素的样式或状态。 实现方法: 1. 获取一组元素(如通过getElementsByTagName等) 2. 遍历该组元素,为每个元素绑定事件(如点击事件) 3. 在事件处理函数中: a. 遍历整个元素集合,清除所有元素的样式(恢复默认) b. 单独设置当前元素(this)的样式 应用场景:当需要一组元素中只有一个元素被激活(如选项卡、轮播图指示器、按钮组、图片选择等)时,都可以使用排他思想。 注意:在引用[1]中,代码使用了两个循环,第一个循环用于绑定事件,第二个循环在事件处理函数内部用于清除其他元素的样式。引用[2]也是类似。 我们还可以给出一个更通用的代码示例: 但是注意:引用[2]中的代码有误,在事件绑定处写的是`divs[i].function()`,应该是`divs[i].onclick = function(){...}`。因此我们在示例中修正。 下面我们将按照要求,使用中文回答,并生成相关问题。 </think> ### JavaScript排他思想详解 #### 原理 排他思想的核心是**先清除所有同类元素的状态,再设置当前元素状态**。其实现基于以下原理: 1. **事件冒泡机制**:利用DOM事件传播机制捕获用户交互 2. **DOM集合操作**:通过`getElementsByTagName`等API获取元素集合 3. **状态重置与设置**:先遍历重置所有元素状态,再单独设置当前目标状态 4. **作用域控制**:使用`this`关键字精准定位当前触发元素 #### 实现方法 ```html <!-- 基础实现 --> <button>按钮1</button> <button>按钮2</button> <button>按钮3</button> <script> const btns = document.querySelectorAll('button'); btns.forEach(btn => { btn.addEventListener('click', function() { // 1. 清除所有元素状态 btns.forEach(item => item.style.backgroundColor = ''); // 2. 设置当前元素状态 this.style.backgroundColor = 'pink'; }); }); </script> ``` ##### 优化实现(性能提升) ```javascript // 使用事件委托减少事件绑定 document.querySelector('.btn-container').addEventListener('click', e => { if(e.target.tagName === 'BUTTON') { // 获取同级所有按钮 const siblings = [...e.target.parentNode.children]; // 排他操作 siblings.forEach(btn => btn.classList.remove('active')); e.target.classList.add('active'); } }); ``` #### 应用场景 1. **导航菜单切换**:选项卡切换时激活当前菜单项 2. **图片选择器**:相册中选择单张图片(如引用[2]案例) 3. **表单单选组**:单选框组中只能选择一个选项 4. **评分组件**:五星评分系统中选中特定星级 5. **主题切换**:网站换肤功能(如引用[1]的百度换肤案例) 6. **轮播图指示器**:高亮显示当前轮播图对应的指示点 #### 关键要点 1. **操作顺序不可颠倒**:必须"先清除所有,再设置当前" 2. **性能优化**:对大型元素集合使用事件委托 3. **CSS类切换**:推荐使用`classList`操作替代直接修改style 4. **伪数组处理**:HTMLCollection需转换为数组(`[...collection]`)才能用forEach 5. **作用域注意**:事件处理函数中建议用`function`声明而非箭头函数,确保`this`正确指向[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值