JavaScript编程实现tab选项卡切换的效果+1

这篇具有很好参考价值的文章主要介绍了JavaScript编程实现tab选项卡切换的效果+1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前在“圳品”信息系统使用了tab选项卡来显示信息,详见:

JavaScript编程实现tab选项卡切换的效果

在tab选项卡中使用其它<div>来显示信息就出现了问题,乱套了,比如下面的这段代码:

<!DOCTYPE html>
<html>
<head>
  <meta name="Author" content="PurpleEndurer">
  <title>“圳品”信息系统</title>
    <style type="text/css">
        *{padding:0px;margin: 0px;font:12px normal "microsoft yahei";}
        #tabs {width:1024px; padding:5px; height:850px; margin:20px;}
        #tabs ul {list-style:none; display: block; height:30px; line-height:30px; border-bottom:2px #33ffff solid;}
        #tabs ul li {background:#eee; cursor:pointer; float:left; list-style:none; height:28px; line-height:28px; margin:0px 3px; border:1px solid #aaaaaa; border-bottom:none; display:inline-block; width:180px; text-align: center; font-size: 15px;}
        #tabs ul li.show {background:#fff;border-top:2px solid #33ffff; border-left:2px solid #33ffff; border-right:2px solid #33ffff; border-bottom: 2px solid #fff; font-weight:bold; font-size: 20px;}
        #tabs div {height:800px; line-height: 25px; border:1px solid #33ffff; border-top:none; padding:5px;}
        .hide{display: none;}
 	.blue{color:blue;}
    </style>
    <script type="text/javascript">
	function initTab()
	{
		var oTab = document.getElementById("tabs");
		var oUl = oTab.getElementsByTagName("ul")[0];
		var oLis = oUl.getElementsByTagName("li");
		var oDivs= oTab.getElementsByTagName("div");
 
		for (var i= 0; i<oLis.length; i++)
		{
			oLis[i].index = i;
			oLis[i].onmousemove = oLis[i].onclick = function (){activeTab(this.index);};
		}
	}//initTab()
 
 
	function activeTab(a)
	{
		var oTab = document.getElementById("tabs");
		var oTabUl = oTab.getElementsByTagName("ul")[0];
		var oTabLis = oTabUl.getElementsByTagName("li");
		var oTabDivs = oTab.getElementsByTagName("div");
		for (var n= 0; n < oTabLis.length; n++)
		{
			oTabLis[n].className = "";
			oTabDivs[n].className = "hide";
		}//for()
		oTabLis[a].className = "show";
        oTabDivs[a].className = "";
	} //activeTab(a)
 
         window.onload = function()
	 {
		 initTab();
	 }
    </script>
 
</head>
<body>
<p>JavaScript编程实现tab选项卡切换的效果 @Edge浏览器</p>
<div id="tabs">
    <ul>
        <li class="show" title="符合条件的产品清单">清单</li>
        <li>区域分布分析</li>
        <li>产品类别分析</li>
    </ul>
    <div id="divZpList">
	符合条件的产品清单
	<div id="div1" class="blue">选项卡1</div>
    </div>
    <div class="tabHide" id="divZpAreaDistNow"><!-- Area distribution //-->
	区域分布分析
	<div id="div2" class="blue">选项卡2</div>
    </div>
    <div class="tabHide" id="divZpTypeDistNow"><!-- Type distribution //-->
	 产品类别分析
     <div id="div3" class="blue">选项卡3</div>
</div>
 
</body>
</html>

运行效果如下:

3.制作tab切换效果。,原创作品,网页制作,JavaScript,html,前端,JavaScript,选项卡效果,数组

可以看到,第1张选项卡中的<div id="div1" class="blue">选项卡1</div>消失了,而第2张和第3张选项卡的内容对调了。

导致问题的原因在于activeTab()函数中,根据函数参数a传递进来的活动选项卡的indax,默认为选项卡组中的每个项目卡里一对<li>的<div>的index是相同的,即第a个<li>对默认匹配第a个<div>,并将第a个<li>和第a个<div>设置为当前活动选项卡:

	oTabLis[a].className = "show";
    oTabDivs[a].className = "";

在选项卡组中的<div>与<li>数量相同时,这样默认是可以的,如<li>区域分布分析</li>与 <div class="tabHide" id="divZpAreaDistNow">匹配,这也是 ​​JavaScript编程实现tab选项卡切换的效果​​ 可以正常工作的原因。

但我们在选项卡组的<div>内引入其它的<div>,比如上面代码中的:

    <div id="divZpList">
	      符合条件的产品清单
	      <div id="div1" class="blue">选项卡1</div>
    </div>

这时选项卡组中的<div>数量大于<li>数量时,第a个<li>对匹配第a个<div>的这种默认关系就不一定准确了。在上面的演示代码中,第2个选项卡中的<li>(即<li>区域分布分析</li>)将会与第2个<div>(即<div id="div1" class="blue">选项卡1</div>)匹配,而不是与第3个<div>(即<div class="tabHide" id="divZpAreaDistNow">)匹配。

找到了原因后,就要想解决问题的办法。解决问题的关键是在进行选项卡切换时如何找到或确定与选项卡组中的与<li>匹配的<div>。

解决这个问题的方法有很多,最直接的办法是定义一个全局的二维数组,把每个选项卡中的<li>和与之匹配的<div>的id保存下来,再用一个全局变量来存放当前活动选项卡的index。但是这样做的话,使用全局变量太多,耦合度低,不够通用。

我使用的解决办法是,先为选项卡中与<li>匹配的<div>设置一个特定的id特征码,比如id都是以"ZpDiv"来开头,然后遍历选项卡中的<div>,并把id中具有id特征码的<div>筛选出来,将其id值保存在一维数组aDivs中,这样第i个<li>就与aDivs[i]存储的id所指向的<div>匹配,然后可以进行相应的操作了。

如果我们在activeTab()中实现上述遍历、筛选和匹配工作的话,每次选项卡切换都要重复进行一次,不划算。

如果我们在选项卡组初始化阶段initTab()完成实现上述遍历、筛选和匹配工作,再把这种匹配关系传递到activeTab()中,就方便多了。

那么如何把这种匹配关系传递到activeTab()中呢?

既然我们先前是通过给选择卡的<li>增加index属性来确定当前活动选项卡的,那么我们再给<li>再增加两个属性,一个是.linkedDivID 用来存与它匹配的<div>的id,另一个是.TabsID ,用来保存<li>所在选项卡组的id。

具体实现起来,我使用的解决办法是,分三步:

第一步,为选项卡中与<li>匹配的<div>设置一个特定的id特征码,比如id都是以"ZpDiv"来开头。

第二步,在选项卡组初始化阶段initTab(),我们先遍历选项卡中的<div>,并把id中具有id特征码的<div>筛选出来,将其id值保存在一个一维数组aDivs中;然后遍历选项卡中的<li>,为每个<li>增加index、.linkedDivID 和.TabsID属性并赋值,并把TabsID和index属性作为参数传递给activeTab(tabsId, a)。

第三步,在activeTab(tabsId, a)中,先根据tabsId建立选项卡中的<li>数组oTabLis ,然后遍历<li>数组oTabLis,将所有的选项卡设置为非活动状态,接着修改oTabLis[a]的className,把它设置为活动选项卡的<li>,最后修改oTabLis[a].linkedDivID指向的<div>的ClassName,把它设置为活动选项卡的<div>。

完整的代码如下,其中增加了一个<textarea>来显示程序运行数据,方便了解代码内部的运行情况:

<!DOCTYPE html>
<html>
<head>
  <meta name="Author" content="PurpleEndurer">
  <title>“圳品”信息系统</title>
    <style type="text/css">
        *{padding:0px;margin: 0px;font:12px normal "microsoft yahei";}
        #tabsId {width:800px; padding:5px; height:300px; margin:20px;}
        #tabsId ul {list-style:none; display: block; height:30px; line-height:30px; border-bottom:2px #33ffff solid; }
        #tabsId ul li {background:#eee; cursor:pointer; float:left; list-style:none; height:28px; line-height:28px; margin:0px 3px; border:1px solid #aaaaaa; border-bottom:none; display:inline-block; width:180px; text-align: center; font-size: 15px; border-radius: 5px;}
        #tabsId ul li.tabShow {background:#fff;border-top:2px solid #33ffff; border-left:2px solid #33ffff; border-right:2px solid #33ffff; border-bottom: 2px solid #fff; font-weight:bold; font-size: 20px; border-radius: 5px;}
        #tabsId div {height:280px; line-height: 25px; border:1px solid #33ffff; border-top:none; padding:5px;}
        div.tabHide {display: none;}
		    .blue {color:blue;}
    </style>

</head>
<body>
<p>JavaScript编程实现tab选项卡切换的效果 @Edge浏览器</p>
<div id="tabsId">
    <ul>
        <li id="liZpList" class="tabShow" title="符合条件的产品清单">清单</li>
        <li id="liZpAreaDist">区域分布分析</li>
        <li id="liZppTypeDist">产品类别分析</li>
    </ul>
    <div id="divZpList">
	符合条件的产品清单
	<div id="div1"  class="blue">选项卡1</div>
    </div>
    <div class="tabHide" id="divZpAreaDistNow"><!-- Area distribution //-->
	区域分布分析
	<div id="div2" >选项卡2</div>
    </div>
    <div class="tabHide" id="divZpTypeDistNow"><!-- Type distribution //-->
	 产品类别分析
	 <div id="div3">选项卡3</div>
    </div>
</div>
<textarea border="1" id="taDebug"  cols="180" rows="15">debug</textarea>

<script type="text/javascript">
	var taDbg = document.getElementById("taDebug");
	const tabsIdZp = "tabsId";		//选项卡组(tabs)的id
	const tabDivIdTagZp = "divZp";//选项卡组(tabs) 中 与 <li> 配对的<div>的id特征码

	// 设置当前活动的选项卡
	//参数说明:tabsId:选项卡组(tabs)的id, a: 当前活动的选项卡中<li>的index
	function activeTab(tabsId, a)
	{
		taDbg.value += '\n\n activeTab begin------';
		taDbg.value += '\n activeTab.index=' + a;
		var oTab = document.getElementById(tabsId);

		var oTabUl = oTab.getElementsByTagName("ul")[0];
		var oTabLis = oTabUl.getElementsByTagName("li");

		//将所有选项卡设置为非活动状态
		var i; //divID
		for (var n = 0; n < oTabLis.length; n++)
		{
			oTabLis[n].className = "";
			i = oTabLis[n]. linkedDivID;
			taDbg.value += '\n oTabLis[' + n + ']. linkedDivID=' + i + '   .className=' + oTabLis[n].className;
			document.getElementById(i).className = "tabHide";
			taDbg.value += '\n oTabLis[' + n + '].id=' + oTabLis[n].id + '   .className=' + oTabLis[n].className;
			i = document.getElementById(i);
			taDbg.value += '\n Divs.id=' + i.id + '   .className=' + i.className;
		}//for()

		//设置当前活动的选项卡
		oTabLis[a].className =   "tabShow";
		i = oTabLis[a]. linkedDivID;
		document.getElementById(i).className = "";

		taDbg.value += '\nactiveTab end------';
	} //activeTab() 

	
	//初始化选项卡
	//参数说明:tabsId: 选项卡组(tabs) id, tabDivIdTag:选项卡组(tabs) 中与<li>配对的<div>的id特征码
	function initTab(tabsId, tabDivIdTag)
	{
		taDbg.value += '\n initTab() begin------';
		var oTab = document.getElementById(tabsId);

		var oTabUl = oTab.getElementsByTagName("ul")[0];
		var oTabLis = oTabUl.getElementsByTagName("li");

		var oTabDivs= oTab.getElementsByTagName("div");
		taDbg.value += '\n oTabDivs.length=' + oTabDivs.length;

		var aDivs = new Array();//用来存放选项卡组(tabs)中与<li>配对的<div>的id
		var iDividTagLen = tabDivIdTag.length;
		if (iDividTagLen==0)
		{
			//与<li>配对的<div>的id特征码为"",直接从oTabDivs生成
			aDivs = Array.from(oTabDivs);
		}
		else
		{
			//遍历所有的<div>
			for (var i = 0; i<oTabDivs.length; i++)
			{
				//检查<div>的id是否符合与<li>配对<div>的id特征码
				if (oTabDivs[i].id.substr(0, iDividTagLen) == tabDivIdTag)
				{
					//保存符合与<li>配对<div>的id特征码的<div> 的id
					aDivs.push(oTabDivs[i].id);
				}
			}
		}

		if (aDivs.length < oTabLis.length)
		{
			alert("<div>数量小于<li>数量,不能完成初始化");
		}
		else
		{
			//初始化
			for (var i = 0; i < oTabLis.length; i++)
			{
				oTabLis[i].index = i; //设置选项卡中<li>的index属性,用于确定当前活动选项卡
				oTabLis[i].linkedDivID = aDivs[i]; //设置选项卡中<li>的linkedDivID属性,保存与该<li>配对的<div>的id
				oTabLis[i].TabsID = 	tabsId;	//设置选项卡中<li>的TabsID属性,保存选项卡组的id
				taDbg.value += '\n oTabLis[' + i + '].id=' + oTabLis[i].id + '   linkedDivID=' + oTabLis[i].linkedDivID;
				oTabLis[i].onclick = function() {activeTab(this.TabsID, this.index);};
				//oTabLis[i].onmousemove = oTabLis[i].onclick = function() {activeTab(this.TabsID, this.index);};
			}   //for			
		}//if

		taDbg.value += '\n initTab() end------'
	}//initTab()

   
	window.onload = function()
	{
		 //initTab(tabsId, tabLiId, tabDivId);
		  initTab(tabsIdZp, tabDivIdTagZp);  
	}
</script>          
</body>
</html>          

代码运行效果如下:

3.制作tab切换效果。,原创作品,网页制作,JavaScript,html,前端,JavaScript,选项卡效果,数组

 

嵌套的<div>内容都能正常显示出来。文章来源地址https://www.toymoban.com/news/detail-777297.html

到了这里,关于JavaScript编程实现tab选项卡切换的效果+1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3实现带动画效果的tab栏切换

    效果图如下所示: 实现思路: 其实很简单 1、首先切换tab栏时tab标签激活下标与对应显示内容下标要一致。 2、其次点击tab栏切换时更新下标 3、最后就是css添加动画效果 这样就 了!!! 上全部代码

    2024年02月22日
    浏览(28)
  • uniapp 微信小程序实现监听屏幕左右滑动实现tab标签切换效果

            实际的项目开发之中,有很多所谓的奇葩需求,当工程量相对较大的时候去更换组件会显得特别麻烦和费时。我这次的需求因为某些特殊原因,更换组件后也无法实现需要达到的效果,所以最后只能监听滑动事件,相信你看了我的代码也能轻松搞定!          

    2024年02月14日
    浏览(41)
  • Android 中利用多个Button组合实现选项切换效果

    效果图:       xml布局: gray_button.xml rect_white_button.xml  rect_gray_bg.xml  ​自己再实现3个按钮的点击事件即可  

    2024年02月15日
    浏览(36)
  • 通过JavaScript、css、H5 实现简单的tab栏的切换和复用

    目录 一、效果展示 二、实现的大致原理 三、H5的布局 四、CSS样式 五、JS代码内容 六、完整代码 1.我们先通过css 和h5布局得到最基本的tab栏样式(有代码参考) 2.在获得样式,给我们所需要点击的目标设置监听事件,在获取节点,设置一个自定义的节点属性index,通过它在获取

    2023年04月09日
    浏览(28)
  • 使用JavaScript实现页面滑动切换效果

      使用JavaScript实现页面滑动切换效果 在现代Web页面设计中,页面滑动切换效果已经成为了一种常见的设计要求,能够提升用户体验,增加页面的交互性。本文将通过JavaScript来实现这一效果。 首先,我们需要在HTML中添加一些基础结构和样式。以下是一个简单的例子:   在

    2024年02月13日
    浏览(40)
  • JavaScript实现背景图像切换3D动画效果

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料以及文中源

    2023年04月20日
    浏览(41)
  • HTML5+CSS3小实例:3D翻转Tab选项卡切换特效

    实例:3D翻转Tab选项卡切换特效 技术栈:HTML+CSS 效果: 源码: 【HTML】

    2024年02月04日
    浏览(48)
  • uniapp tab切换及tab锚点效果(兼容wx小程序及H5端)

    效果如下 H5端 H5端tab切换及tab锚点效果 小程序端 小程序端tab切换及tab锚点效果 代码实现-重要几点 渲染页面循环数组时,每一个item都需要给不重复的id tab使用uviewUI库实现的,list值里面每一个元素也需要给上id值。如[‘1-20’,‘21-40’,…],那么21-40给的是第21个item的id。 这里

    2024年02月03日
    浏览(30)
  • 前端Vue自定义验证码密码登录切换tabs选项卡标签栏标题栏 验证码登录模版 密码登录模版

    前端Vue自定义验证码密码登录切换tabs选项卡标签栏标题栏 验证码登录模版 密码登录模版, 请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13221 效果图如下: 实现代码如下: 使用方法 HTML代码实现部分 组件实现代码

    2024年02月11日
    浏览(44)
  • 用HTML、CSS和JavaScript实现鼠标可交互的3D太阳和月亮切换效果

    部分数据来源: ChatGPT  引言         太阳和月亮对于我们来说是一种常见的对比,这篇文章将介绍一个使用HTML、CSS和JavaScript创建的网页场景,能够把太阳和月亮切换展示给用户。这个场景能够让用户使用鼠标和滚轮与场景互动,带来更多的趣味和体验。 这里展示了HT

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包