原生JS实现Tab选项卡各种效果

前一段时间我写了几篇关于css属性的理解和用法方面的文章,今天就不分享css属性了,给大家分享一个我们在实际工作中用到比较多的一个效果——tab选项卡效果。首先,我们先来看看tab选项卡效果是什么样子,以qq新闻为例,有如下效果:

原生JS实现Tab选项卡各种效果

当鼠标滑动到相关的标题上时,标题对应的内容就会出现,这是Tab选项卡的滑动切换效果,Tab选项卡效果还包括延迟切换自动切换效果。今天就和大家一起来学习下Tab选项卡的这三种效果。

2.三种效果的公共代码

三种效果都是基于以下的公共的html结构和css样式:
原生JS实现Tab选项卡各种效果

在html代码中,使用两个p,分别用于包含标题和内容,标题的个数和内容的个数需要相同。详细的html代码和css代码如下所示:

html代码

登录后复制

css代码

*{    margin: 0;    padding: 0;    list-style: none;    font-size: 12px;    box-sizing: border-box;}.notice{    width: 302px;    height: 100px;    margin: 10px;    border: 1px solid #eee;    overflow: hidden;}.notice-title{    height: 26px;    background: #f7f7f7;}.notice-title li{    float: left;    width: 60px;    line-height: 26px;    text-align: center;    overflow: hidden;    background: #fff;    border-bottom: 1px solid #eee;    background: #f7f7f7;}.notice li a:link,.notice li a:visited{    text-decoration: none;    color: #000;}.notice li a:hover{    color: #f90;}.notice-title li.select{    background: #fff;    border-bottom-color: #fff;    border-left: 1px solid #eee;    border-right: 1px solid #eee;    font-weight: bold;}.notice-title li:first-child.select{    border-left: none;}.notice-title li:last-child.select{    border-right: none;}.notice-content .mod{    padding: 12px 5px;}.notice-content .mod ul{    width: 300px;    font-size: 0;}.notice-content .mod ul li{    display: inline-block;    width: 145px;    height: 25px;    line-height: 25px;    overflow: hidden;    text-overflow: ellipsis;    white-space: nowrap;}

登录后复制

3.滑过切换效果原理分析

滑动切换效果,顾名思义,就是当鼠标滑过的时候,显示标题下的内容。需要将当前标题的样式置为选中状态(增加标题选中的css样式,本例中是增加select样式类),同时将该标题下的内容置为显示,即设置样式display:block,而其他标题下的内容设置为隐藏,即设置样式display:none。详细的javascript代码如下所示:

function $(id) {    return typeof id==='string'? document.getElementById(id):id;}

登录后复制

//获取鼠标滑过或点击的标签和要切换内容的元素var titles = $('notice-title').getElementsByTagName('li'),    ps = $('notice-content').getElementsByTagName('p');if(titles.length != ps.length){  return;}// 遍历titles下的所有lifor(var i = 0; i < titles.length; i++) {  // 添加索引  titles[i].id = i;  titles[i].onmouseover = function () {    //清除所有title上的class,将所有的p设置为隐藏    for(var j=0; j<titles.length; j++) {      titles[j].className = '';      ps[j].style.display = 'none';    }    //设置当前li为高亮显示    this.className = 'select';    ps[this.id].style.display = 'block';  }}

登录后复制

如果需要实现点击切换的效果,只需要将onmouseover修改为onclick即可。

在浏览器中的效果如下所示:

原生JS实现Tab选项卡各种效果

当鼠标过相关标题的时候,标题中对应的内容则会显示出来。

4.延迟切换效果原理分析

延迟切换效果,顾名思义,就是鼠标滑动到标题上一定的时间后才显示标题下相关的内容,熟悉javascript的同学知道,我们可以使用setTimeout函数来达到延迟一定的时间,然后再将相关的标题和内容修改为显示与隐藏。其javascript代码与滑动切换效果相差不大,需要我们修改的是首先判断定时器timer是否存在,如果存在,需要清除定时器timer,否则就会出现多个定时器,导致切换效果紊乱,然后将修改标题样式和标题内容的代码放到setTimout函数中。

var timer = null;var list = $('notice-title').getElementsByTagName('li'),    ps = $('notice-content').getElementsByTagName('p');if(list.length != ps.length){  return;}for(var i = 0; i < list.length; i++) {  list[i].id = i;  list[i].onmouseover = function () {    var self = this;    //如果存在准备执行的定时器,立刻清除,只有当前停留时间大于500ms时才开始执行    if(timer) {      clearTimeout(timer);      timer = null;    }    //延迟半秒执行    timer = setTimeout(function () {      for(var j = 0; j < list.length; j++) {        list[j].className = '';        ps[j].style.display = 'none';      }      list[self.id].className = 'select';      ps[self.id].style.display = 'block';    }, 500)  }}

登录后复制

在浏览器中的效果如下:

原生JS实现Tab选项卡各种效果

当鼠标滑过标题的时候,总是间隔一定的时间后标题内容才出现。

5.自动切换效果原理分析

自动切换效果,顾名思义,就是选项卡可以自动切换。在javascript中,我们可以使用setInterval来实现这种效果。具体步骤如下:

默认第一个标题处于选中状态,第一个标题下的内容显示,同时给每一个标题设定id;

判断定时器是否存在,如果存在,则清除定时器;

利用setInterval函数,每隔一定的时间(本例中设定的时间是2s)执行函数autoPlay,在autoPlay函数中,改变显示标题的下标index,如果下标index的值大于等于标题的个数,则显示下标index的值置为0;

将标题的下标等于显示的下标index值增加selected类,同时将内容的下标等于显示下标index值设置为显示(display:block),其余的标题内容修改为隐藏(display:none);

//当前高亮显示的页签索引var index = 0;var timer = null;//获取所有的页签和要切换的内容var list = $('notice-title').getElementsByTagName('li'),    ps = $('notice-content').getElementsByTagName('p');//遍历每一个页签并且给他们绑定事件for(var i = 0; i = list.length) {    index = 0;  }  changeOption(index);}function changeOption(curIndex) {  // console.log(curIndex);  for(var j = 0; j < list.length; j++) {    list[j].className = '';    ps[j].style.display = 'none';  }  //高亮显示当前页签  list[curIndex].className = 'select';  ps[curIndex].style.display = 'block';  index = curIndex;}

登录后复制

在浏览器中的效果如下:

原生JS实现Tab选项卡各种效果

可以发现,选项卡可以间隔一定的时间自动切换。

6.写在最后

好了,今天给大家分享了Tab选项卡的三种切换效果,希望给大家起一个热身作用,掌握了Tab选项卡的原理,其滑动切换、延迟切换、自动切换的效果比较容易实现。

相关推荐:

jQuery移动端Tab选项卡效果实现方法

JavaScript插件Tab选项卡详解

关于JavaScript插件Tab选项卡效果分享

以上就是原生JS实现Tab选项卡各种效果的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786095.html

(0)
上一篇 2025年3月8日 17:39:43
下一篇 2025年3月7日 06:04:21

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js组合设计模式详解

    组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与…

    2025年3月8日
    200
  • JavaScript和Python 的数组去重解析

    “数组去重” 是实际应用中常用的操作,出现在面试题中的概率也很高,今天简述一下 python 和 javascript 中数组去重的方法,希望能帮助到大家。 python数组去重 >>> a = […

    2025年3月8日
    200
  • js控制文件拖拽及获取拖拽内容

    在用户拖拽文件到浏览器的某个元素上时,js可以监听到与拖拽相关的事件,并对拖拽结果进行处理,本文讨论下和拖拽文件相关的一些问题,不过没有处理太多关于兼容性的问题。 拖拽事件 js能够监听到拖拽的事件有drag、dragend、dragent…

    编程技术 2025年3月8日
    200
  • JS常用设计模式

    大型单页应用里,复杂度上升到一定程度时,没有适当的设计模式进行降耦,后续的开发也难以下手。而设计模式正是为了降耦而存在。 单例模式 单例模式的核心是确保只有一个实例,并且提供全局访问。 特点 满足“单一职责原则” : 使用代理模式,不在构造…

    编程技术 2025年3月8日
    200
  • javascript数据结构与算法详解

    请实现一个函数,输入一个整数,输出该数二进制表示1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。首先对于二进制1的求解,在这里,我们最应该想到的就是关于位运算的一些操作符。总共有五种运算,分别是:与(&a…

    编程技术 2025年3月8日
    200
  • JavaScript构造器详解

    对构造函数有很好的理解是你掌握javascript这门语言的重点。我们都知道javascript不像其他语言,它没有class关键字,但是它有跟function非常相似的构造函数。这篇文章我们一起来详细地了解javascript构造函数如何…

    编程技术 2025年3月8日
    200
  • plotly.js 绘图库入门教程分享

    本文主要和大家介绍了详解plotly.js 绘图库入门使用教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 Plotly 缘起 这两天想在前端展现数学函数图像,猜测应该有成熟的 js 库。…

    2025年3月8日
    200
  • 详解Nodejs模块载入运行原理

    使用nodejs,就不可避免地引用第三方模块,它们有些是nodejs自带的(例:http,net…),有些是发布在npm上的(例:mssql,elasticsearch…) 本篇章聚焦3个问题: Nodejs模块的加…

    2025年3月8日 编程技术
    200
  • Node.js中的Async和Await函数解析

    本文主要和大家介绍了node.js中的async和await函数的相关知识,你将学习如何使用node.js中的async函数(async/await)来简化callback或promise.非常不错,具有参考借鉴价值,需要的朋友可以参考下,…

    编程技术 2025年3月8日
    200
  • 线浏览PDF文件的几个实用js插件

    在web开发当中我们经常需要进行需要在线浏览PDf内容,在线嵌入动态pdf,传统的解决方法安装客户端PDF阅读器,如果是在谷歌是可以在线浏览的,因为他自身就带了一些插件,以前遇到这样的问题往往是费时又费力,本文主要给大家分享一系列使用jav…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论