js + css实现标签内容切换功能(实例讲解)


Posted in Javascript onOctober 09, 2017

先附上效果图和代码:

js + css实现标签内容切换功能(实例讲解)

html 文档:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <script type="text/javascript" src="../js/tabs_function.js"></script>
 <script type="text/javascript">
  window.onload = function main() {
   Tabs(".list-item", ".contents", "list-item-checked", "contents-checked");

  }
 </script>
 <style type="text/css">
  #list-title {
   width: 318px;
   height: 56px;
   margin: 0;
   list-style-type: none;
   padding-left: 0;
  }

  .list-item {
   float: left;
   width: 100px;
   height: 50px;
   margin: 2px;
   line-height: 50px;
   font-size: 28px;
   text-align: center;
   border: 1px solid #000;
   cursor: pointer;
  }

  .list-item-checked {
   background-color: #70adff;
   color: #ffffff;
  }

  #content-box {
   position: relative;
   clear: both;
   width: 314px;
   height: 302px;
   margin: 0 2px;
  }

  .contents {
   position: absolute;
   left: 0;
   top: 0;
   width: 312px;
   height: 300px;
   margin: 0;
   font-size: 32px;
   line-height: 300px;
   text-align: center;
   border: 1px solid #000;
   z-index: 0;
   opacity: 0;
   visibility: hidden;
   -webkit-transition: all .5s;
   -moz-transition: all .5s;
   -ms-transition: all .5s;
   -o-transition: all .5s;
   transition: all .5s;
  }

  .contents-checked {
   z-index: 1;
   opacity: 1;
   visibility: visible;
  }
 </style>
</head>
<body>
<ul id="list-title">
 <li class="list-item list-item-checked">1</li>
 <li class="list-item">2</li>
 <li class="list-item">3</li>
</ul>
<div id="content-box">
 <div class="contents contents-checked" style="background-color: #c8ff40;">content_1</div>
 <div class="contents" style="background-color: #41ff6f;">content_2</div>
 <div class="contents" style="background-color: #ff82a0;">content_3</div>
</div>
</body>
</html>

js 文件:

/**
 * Created by Administrator on 2016/9/12.
 */

/*
 * tabs_name:用于触发事件的标签的类名;
 * contents_name:内容容器的类名;
 * tabs_checked_style:标签为选中状态时的样式;
 * contents_checked_style:内容容器为选中状态时的样式;
 *
 * classList.toggle();
 * 检查元素的类名列表中是否有指定的类名,如果有则移除,如果没有则添加;
 * */
function Tabs(tabs_name, contents_name, tabs_checked_style, contents_checked_style) {
 var tabs = document.querySelectorAll(tabs_name),
  contents = document.querySelectorAll(contents_name),
  e_mark = 0;
 for (var i = 0, len = tabs.length; i < len; i++) {
  tabs[i].num = i;
  tabs[i].onclick = function () {
   tabs[e_mark].classList.toggle(tabs_checked_style);
   tabs[this.num].classList.toggle(tabs_checked_style);
   contents[e_mark].classList.toggle(contents_checked_style);
   contents[this.num].classList.toggle(contents_checked_style);
   e_mark = this.num;
  };
 }
}

原理机制

关于css中,类的叠加效果。

我们知道,一个元素可以添加多个类名,同时会被多个类的样式层叠起来显示。

例如:

js + css实现标签内容切换功能(实例讲解)

js + css实现标签内容切换功能(实例讲解)

.list-item {
   float: left;
   width: 100px;
   height: 50px;
   margin: 2px;
   line-height: 50px;
   font-size: 28px;
   text-align: center;
   border: 1px solid #000;
   cursor: pointer;
  }

  .list-item-checked {
   background-color: #70adff;
   color: #ffffff;
  }

可以看到,第一个li的class属性中,有两个类名:.list-item 和 .list-item-checked。那么这个li元素就会同时拥有这个两个类的样式。

相比较,第二个和第三个li的class只有:.list-item。因此他们不会拥有 .list-item-checked 所设置的样式。

回到主题,标签切换,实际就是获取到元素,然后修改元素的样式。那么其中的元素样式就可以通过“classList”来控制元素的类名,从而修改样式。

简单介绍 classList 方法。

1. element.classList 只是获取到元素的类名列表。

2. element.clasList.add(value); 该方法是向元素的类名列表中添加指定的类名

3. element.classList.remove(value); 该方法是从元素的类名列表中删除指定的类名

4. element.classList.contains(value); 该方法是判断元素的类名列表中是否存在指定的类名;该方法会返回一个布尔值

5. element.classList.toggle(value); 该方法是判断元素的类名列表中是否存在指定的类名,如果存在,则删除该类名;如果不存在,则添加该类名

其中,“value”的值可以为一个变量或者字符串常量;

element.classList.add("class-name"); // 字符串
 element.classList.add(class_name); // 变量
 
 element.classList.remove(class_name);
 element.classList.contains(class_name); // true,false
 element.classList.toggle(class_name); // 有则删,无则添;

js 部分

e_mark = 0;
 for (var i = 0, len = tabs.length; i < len; i++) {
  tabs[i].num = i;
  tabs[i].onclick = function () {
   tabs[e_mark].classList.toggle(tabs_checked_style);
   tabs[this.num].classList.toggle(tabs_checked_style);
   contents[e_mark].classList.toggle(contents_checked_style);
   contents[this.num].classList.toggle(contents_checked_style);
   e_mark = this.num;
  };
 }

1. “e_mark” 的作用:

e_mark = 0;

初始的 “e_mark” 的值为“0”。表示“e_mark”指向的是当前被选中的元素为编号是“0”的那个元素。

2. “tabs[i].num=i” 的作用:

tabs[i].num = i;

在上层的for循环中,“i”的值其实就是“tabs”数组中各个元素的下标值。由于“onclick”等事件的匿名函数中无法直接获取到“i”的值。也就是说,当元素被点击时,触发的函数无法得知是“tabs”数组中的第几个元素被点击了,因为每一个元素都可能触发这个函数。但是,函数可以通过“this”来得知是哪一个元素被点击了,至于这个被点击的元素是第几个,可以通过这个被点击的元素的一个自定义值来获取。

我们在元素被点击之前,先给这些元素绑定一个编号:num(自定义值),那么就可以通过“this.num”来获取到这个元素的编号。也就知道这个元素是“tabs”数组中的第几个元素了。

3. 修改当前元素和更新元素的样式:

tabs[e_mark].classList.toggle(tabs_checked_style);
tabs[this.num].classList.toggle(tabs_checked_style); 

上面说到,“e_mark” 为当前元素的编号,而“this.num”为被点击及新选中的元素的编号。

那么当元素被点击时,需要做两件事:1.把当前被选中的元素的样式还原到普通的样式,2.将被点击的元素的样式修改为被选中时的样式。

结合classList的方法,我们知道:.list-item-checked 为被选中时追加的样式,选中的元素只需添加这个类名即可,而未被选中的元素则移除这个类名。

以上这篇js + css实现标签内容切换功能(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
Oct 22 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
用js读写cookie的简单方法(推荐)
Aug 08 Javascript
轻松掌握JavaScript策略模式
Aug 25 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
mpvue写一个CPASS小程序的示例
Sep 04 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
May 12 Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
Jan 15 Javascript
四十九个javascript小知识实用技巧
Nov 20 Javascript
jQuery ajax调用webservice注意事项
Oct 08 #jQuery
js用类封装pop弹窗组件
Oct 08 #Javascript
利用js编写网页进度条效果
Oct 08 #Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
Oct 08 #Javascript
JS动态修改网页body的背景色实例代码
Oct 07 #Javascript
JS实现简单表格排序操作示例
Oct 07 #Javascript
javascript数组定义的几种方法
Oct 06 #Javascript
You might like
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
简单的JS多重继承示例
2008/03/13 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
python处理cookie详解
2014/02/07 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
django模板结构优化的方法
2019/02/28 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
tensorflow如何批量读取图片
2019/08/29 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
python设置环境变量的作用整理
2020/02/17 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
智能旅行箱:Horizn Studios
2018/04/30 全球购物
课程设计的心得体会
2014/09/03 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
公司职员入党自传书
2015/06/26 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL
 Python 中 logging 模块使用详情
2022/03/03 Python