通过JavaScriptcssH5 实现简单的tab栏的切换和复用
Posted 小余努力搬砖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JavaScriptcssH5 实现简单的tab栏的切换和复用相关的知识,希望对你有一定的参考价值。
目录
一、效果展示
二、实现的大致原理
1.我们先通过css 和h5布局得到最基本的tab栏样式(有代码参考)
2.在获得样式,给我们所需要点击的目标设置监听事件,在获取节点,设置一个自定义的节点属性index,通过它在获取点击出现样式的节点,在经过寻找元素,设置全取消,点击相应的节点出现的效果。这里获取节点方式,都是通过点击元素获取父元素,在获得子元素,同级获得兄弟元素,在获取兄弟元素的子元素(笼统的解释,细节部分看代码段的解释)
三、H5的布局
没有特殊的地方,都是基本的写法,只要给定一定的选择器就可以了
<div class="tab">
<div class="nav">
<a href="javascript:;" class="hover">公司新闻</a>
<a href="javascript:;">公司动态</a>
<a href="javascript:;">行业新闻</a>
</div>
<div class="nav_con">
<div>内容</div>
<div>动态</div>
<div>行业</div>
</div>
</div>
<div class="tab">
<div class="nav">
<a href="javascript:;" class="hover">大学</a>
<a href="javascript:;">中学</a>
<a href="javascript:;">小学</a>
</div>
<div class="nav_con">
<div>大学内容</div>
<div>中学内容</div>
<div>小学内容</div>
</div>
</div>
四、CSS样式
为了得到视屏中的样式,需要设置最基本的效果,通过浮动,是元素在同一行,浮动会脱离文档流,可以给a标签设置宽高,可以设置一些外边距,使得好看一些。注意设置出现内容的消失,我们默认只出现第一个。
a
text-decoration: none;
width: 180px;
height: 30px;
line-height: 30px;
text-align: center;
color: #666;
float: left;
margin-right: 15px;
.nav a
background-color: beige;
.nav a.hover
background-color: blue;
.nav_con div:first-child~div
display: none;
.nav::after
content: '';
display: block;
clear: both;
.nav_con
margin-bottom: 50px;
五、JS代码内容
按照顺序来,流程如下
获取元素
通过委派给父亲添加监听事件
先获得当前的父节点,在通过父节点获得所有的子节点
设置排他思想
给每一个子节点加上一个自定义属性 index
获取当前被点击的nav a上面的属性index
获取当前元素的父级元素,在获得父级的兄弟,在找到子元素
当前nav_con 显示内容
当前节点获得hover样式
let navNodes = document.querySelectorAll('.nav');
for(let i=0;i<navNodes.length;i++)
//通过委派给父亲添加监听事件
navNodes[i].addEventListener('click',function(e)
//先获得当前的父节点,在通过父节点获得所有的子节点
let navs = e.target.parentNode.children;
//设置排他思想
for(let j=0;j<navs.length;j++)
navs[j].className='';
//给每一个子节点加上一个自定义属性 index
navs[j].setAttribute("index",j)
//获取当前被点击的nav a上面的属性index
let thisIndex = e.target.getAttribute("index");
//获取当前元素的父级元素,在获得父级的兄弟,在找到子元素
let nav_cons = e.target.parentNode.nextElementSibling.children;
for(let j=0;j<nav_cons.length;j++)
nav_cons[j].style.display = "none";
//当前nav_con 显示内容
nav_cons[thisIndex].style.display="block"
//当前节点获得hover样式
e.target.className = "hover"
)
六、完整代码
<!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>
a
text-decoration: none;
width: 180px;
height: 30px;
line-height: 30px;
text-align: center;
color: #666;
float: left;
margin-right: 15px;
.nav a
background-color: beige;
.nav a.hover
background-color: blue;
.nav_con div:first-child~div
display: none;
.nav::after
content: '';
display: block;
clear: both;
.nav_con
margin-bottom: 50px;
</style>
</head>
<body>
<div class="tab">
<div class="nav">
<a href="javascript:;" class="hover">公司新闻</a>
<a href="javascript:;">公司动态</a>
<a href="javascript:;">行业新闻</a>
</div>
<div class="nav_con">
<div>内容</div>
<div>动态</div>
<div>行业</div>
</div>
</div>
<div class="tab">
<div class="nav">
<a href="javascript:;" class="hover">大学</a>
<a href="javascript:;">中学</a>
<a href="javascript:;">小学</a>
</div>
<div class="nav_con">
<div>大学内容</div>
<div>中学内容</div>
<div>小学内容</div>
</div>
</div>
<script>
let navNodes = document.querySelectorAll('.nav');
for(let i=0;i<navNodes.length;i++)
//通过委派给父亲添加监听事件
navNodes[i].addEventListener('click',function(e)
//先获得当前的父节点,在通过父节点获得所有的子节点
let navs = e.target.parentNode.children;
for(let j=0;j<navs.length;j++)
navs[j].className='';
//给每一个子节点加上一个自定义属性 index
navs[j].setAttribute("index",j)
//获取当前被点击的nav a上面的属性index
let thisIndex = e.target.getAttribute("index");
//获取当前元素的父级元素,在获得父级的兄弟,在找到子元素
let nav_cons = e.target.parentNode.nextElementSibling.children;
for(let j=0;j<nav_cons.length;j++)
nav_cons[j].style.display = "none";
//当前nav_con 显示内容
nav_cons[thisIndex].style.display="block"
//当前节点获得hover样式
e.target.className = "hover"
)
</script>
</body>
</html>
多线程async&await
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了。但.net 4.5为我们带来了async&await,使得实现多线程的写法更简单,更优美,更符合线性思维。
下面通过一个例子来演示通过Task和async&await分别如何实现,并且最后还附上代码执行顺序图。
使用Task实现
如下代码:
1 #region 使用Task实现 2 static void TestByTask() 3 { 4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 5 var task = Task.Factory.StartNew<string>(() => 6 { 7 return GetNameByTask(); 8 }); 9 Console.WriteLine("get another thread result,result:" + task.Result); 10 Console.WriteLine("main thread completed!"); 11 } 12 13 static string GetNameByTask() 14 { 15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 16 return "mcgrady"; 17 } 18 #endregion
输出结果:
使用async&await实现
假如使用async&await如何实现呢,如下代码:
1 #region 使用async&await实现 2 static async void TestByAsyncAwait() 3 { 4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 5 var name = GetNameByAsyncAwait(); 6 7 Console.WriteLine(string.Format("get another thread result,result:{0}", await name)); 8 Console.WriteLine("main thread completed!"); 9 } 10 11 static async Task<string> GetNameByAsyncAwait() 12 { 13 return await Task.Factory.StartNew<string>(() => 14 { 15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 16 return "mcgrady"; 17 }); 18 } 19 #endregion
输出结果:
输出结果跟使用Task相同。
代码执行流程如下图:
完整代码:
1 namespace ConsoleApplication25 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //1,使用task实现 8 //TestByTask(); 9 10 //2,使用async&await实现 11 TestByAsyncAwait(); 12 13 Console.ReadKey(); 14 } 15 16 #region 使用Task实现 17 static void TestByTask() 18 { 19 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 20 var task = Task.Factory.StartNew<string>(() => 21 { 22 return GetNameByTask(); 23 }); 24 Console.WriteLine("get another thread result,result:" + task.Result); 25 Console.WriteLine("main thread completed!"); 26 } 27 28 static string GetNameByTask() 29 { 30 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 31 return "mcgrady"; 32 } 33 #endregion 34 35 #region 使用async&await实现 36 static async void TestByAsyncAwait() 37 { 38 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 39 var name = GetNameByAsyncAwait(); 40 41 Console.WriteLine(string.Format("get another thread result,result:{0}", await name)); 42 Console.WriteLine("main thread completed!"); 43 } 44 45 static async Task<string> GetNameByAsyncAwait() 46 { 47 return await Task.Factory.StartNew<string>(() => 48 { 49 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 50 return "mcgrady"; 51 }); 52 } 53 #endregion 54 } 55 }
以上是关于通过JavaScriptcssH5 实现简单的tab栏的切换和复用的主要内容,如果未能解决你的问题,请参考以下文章
太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!