先附上效果图和代码:
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" >content_1</div>
<div class="contents" >content_2</div>
<div class="contents" >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中,类的叠加效果。
我们知道,一个元素可以添加多个类名,同时会被多个类的样式层叠起来显示。
例如:
.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实现标签内容切换功能(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持亿速云。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。