通过JavaScriptcssH5 实现简单的tab栏的切换和复用

Posted 小余努力搬砖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JavaScriptcssH5 实现简单的tab栏的切换和复用相关的知识,希望对你有一定的参考价值。

目录

一、效果展示

二、实现的大致原理

三、H5的布局

四、CSS样式

五、JS代码内容

六、完整代码


一、效果展示

二、实现的大致原理

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 }
View Code

 

以上是关于通过JavaScriptcssH5 实现简单的tab栏的切换和复用的主要内容,如果未能解决你的问题,请参考以下文章

TA养成之路unity·shader(一)

太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!

太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!

实现一个简单的表单排序

访问:如何在相关表中自动创建记录

chatGPT持续火热一路狂飙,简单了解下TA的功能和示例代码吧