学习记录-js基础-tab栏

tab栏功能描述

  1. 单击选项卡,选项卡样式切换
  2. 选项卡样式切换后,下方内容也跟着切换

实现效果

在这里插入图片描述

tab栏实现步骤

1. 概念理解

  1. 理解事件委托和自定义属性的用法
    事件委托:利用冒泡的特性:子元素绑定事件触发,父元素事件也触发
    自定义属性:用户自行定义的属性,通常以data-开头
  2. tab栏的html框架
		<div class="tab">
		    <div class="tab-nav">
		      <h3>每日特价</h3>
		      <ul>
		        <li><class="active" href="javascript:;">精选</a></li>
		        <li><href="javascript:;">美食</a></li>
		        <li><href="javascript:;">百货</a></li>
		        <li><href="javascript:;">个护</a></li>
		        <li><href="javascript:;">预告</a></li>
		      </ul>
		    </div>
		    <div class="tab-content">
		      <div class="item active"><img src="./images/tab00.png" alt="" /></div>
		      <div class="item"><img src="./images/tab01.png" alt="" /></div>
		      <div class="item"><img src="./images/tab02.png" alt="" /></div>
		      <div class="item"><img src="./images/tab03.png" alt="" /></div>
		      <div class="item"><img src="./images/tab04.png" alt="" /></div>
		    </div>
		  </div>

2. 选项卡样式切换

获取选项卡的父级元素,给父级元素添加鼠标点击属性,判断点击的是否为选项卡,是就使用排它,利己思想添加active类名
为了避免所有子元素冒泡都会作用于父元素,需要对子元素类型进行区分

    	const tabNav=document.querySelector('.tab-nav')					//tab栏位置
  		tabNav.addEventListener('click',function(e){				
    	if(e.target.tagName==='A'){										//使用e.target中的tagName属性来分辨选项卡
     	document.querySelector('.tab-nav .active').classList.remove('active')
      	e.target.classList.add('active')
      	const items=document.querySelectorAll('.tab-content .item')		//内容位置
      	document.querySelector('.tab-content .active').classList.remove('active')
      	items[e.target.dataset.id].classList.add('active')
    }
  })

排它:查找该位置上所有.active类名的元素,清除类名。如有多个可用querySelectorAll获取,并用循环遍历清除

	document.querySelector('.tab-nav .active').classList.remove('active')

利己:让所对应的选项卡加上active类名

	e.target.classList.add('active')

3. 选项卡所指内容切换

获取内容元素集合,使用自定义属性来规定所点击选项卡所绑定内容
自定义属性设置

		<li><a data-id='0' class="active" href="javascript:;">精选</a></li>		//a后的data-id为自定义属性
        <li><a data-id='1' href="javascript:;">美食</a></li>
        <li><a data-id='2' href="javascript:;">百货</a></li>
        <li><a data-id='3' href="javascript:;">个护</a></li>
        <li><a data-id='4' href="javascript:;">预告</a></li>

使用自定义属性选择对应内容

  1. 使用dataset.属性名来获取属性值
  2. 自定义属性的值来作为items的下标,从而找到选项卡所对应内容
		const items=document.querySelectorAll('.tab-content .item')				//内容位置
      	document.querySelector('.tab-content .active').classList.remove('active')
      	items[e.target.dataset.id].classList.add('active')

完整实例代码

<!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>tab栏切换</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .tab {
      width: 590px;
      height: 340px;
      margin: 20px;
      border: 1px solid #e4e4e4;
    }

    .tab-nav {
      width: 100%;
      height: 60px;
      line-height: 60px;
      display: flex;
      justify-content: space-between;
    }

    .tab-nav h3 {
      font-size: 24px;
      font-weight: normal;
      margin-left: 20px;
    }

    .tab-nav ul {
      list-style: none;
      display: flex;
      justify-content: flex-end;
    }

    .tab-nav ul li {
      margin: 0 20px;
      font-size: 14px;
    }

    .tab-nav ul li a {
      text-decoration: none;
      border-bottom: 2px solid transparent;
      color: #333;
    }

    .tab-nav ul li a.active {
      border-color: #e1251b;
      color: #e1251b;
    }

    .tab-content {
      padding: 0 16px;
    }

    .tab-content .item {
      display: none;
    }

    .tab-content .item.active {
      display: block;
    }
  </style>
</head>

<body>
  <div class="tab">
    <div class="tab-nav">
      <h3>每日特价</h3>
      <ul>
        <li><a data-id='0' class="active" href="javascript:;">精选</a></li>
        <li><a data-id='1' href="javascript:;">美食</a></li>
        <li><a data-id='2' href="javascript:;">百货</a></li>
        <li><a data-id='3' href="javascript:;">个护</a></li>
        <li><a data-id='4' href="javascript:;">预告</a></li>
      </ul>
    </div>
    <div class="tab-content">
      <div class="item active"><img src="./images/tab00.png" alt="" /></div>
      <div class="item"><img src="./images/tab01.png" alt="" /></div>
      <div class="item"><img src="./images/tab02.png" alt="" /></div>
      <div class="item"><img src="./images/tab03.png" alt="" /></div>
      <div class="item"><img src="./images/tab04.png" alt="" /></div>
    </div>
  </div>

</body>
<script>
  const tabNav=document.querySelector('.tab-nav')
  tabNav.addEventListener('click',function(e){
    if(e.target.tagName==='A'){
      document.querySelector('.tab-nav .active').classList.remove('active')
      e.target.classList.add('active')
      const items=document.querySelectorAll('.tab-content .item')
      document.querySelector('.tab-content .active').classList.remove('active')
      items[e.target.dataset.id].classList.add('active')
    }
  })
</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值