<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
* {
margin: 0;
padding: 0;
list-style: none;
}
.box {
border: 1px solid #333;
box-sizing: border-box;
overflow: hidden;
}
.box>ul>li {
border: 1px solid #333;
font-size: 20px;
color: black;
}
.box>ol {
border: 1px solid #333;
}
.box>ol>li {
line-height: 260px;
text-align: center;
font-size: 50px;
color: black;
}
</style>
</head>
<body>
<div class="box">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<ol>
<li>1</li>
<li>2</li>
<li>3</li>
</ol>
</div>
</body>
<script type="text/javascript">
class Tabs {
constructor(ele, options = {}, callback = () => {}) {
if(options === null) {
options = {}
}
//this.ele = document.querySelectorAll(ele);
this.ele = document.querySelector(ele);
this.btnsBox = this.ele.querySelector("ul");
this.tabsBox = this.ele.querySelector("ol");
this.btns = this.ele.querySelectorAll("ul>li");
this.tabs = this.ele.querySelectorAll("ol>li");
this.default = {
tabBoxWidth: options.tabBoxWidth || '600px',
tabBoxHeight: options.tabBoxHeight || '300px',
tabHeight: options.tabHeight || '40px',
currentTabIndex: options.currentTabIndex || 0,
tabBtnActiveStyle: options.tabBtnActiveStyle || {
backgroundColor: 'skyblue'
},
tabBtnUnActiveStyle: options.tabBtnUnActiveStyle || {
backgroundColor: "orange"
}
}
this.currentIndex = this.default.currentTabIndex;
this.callback = callback;
this.initStyle();
this.initEvents();
}
initStyle() {
// 整个选项卡的宽高
this.ele.style.width = this.default.tabBoxWidth;
this.ele.style.height = this.default.tabBoxHeight;
// 选项卡按钮宽高和基础样式
this.btnsBox.style.width = this.default.tabBoxWidth;
this.btnsBox.style.height = this.default.tabHeight;
this.btnsBox.style.display = 'flex';
this.btnsBox.style.justifyContent = 'flex-start';
this.btnsBox.style.alignItems = 'center';
if(this.btns.length) {
const btnWidth = parseInt(parseInt(this.btnsBox.style.width) / this.btns.length);
this.btns.forEach((item, index) => {
item.style.width = btnWidth + 'px';
item.style.height = this.btnsBox.style.height;
item.style.lineHeight = this.btnsBox.style.height;
item.style.textAlign = 'center';
item.style.cursor = 'pointer';
if(index == this.default.currentTabIndex) {
for(let keys in this.default.tabBtnActiveStyle) {
item.style[keys] = this.default.tabBtnActiveStyle[keys];
}
} else {
for(let keys in this.default.tabBtnUnActiveStyle) {
item.style[keys] = this.default.tabBtnUnActiveStyle[keys];
}
}
});
}
// 卡片宽高和 基础样式
this.tabsBox.style.width = this.default.tabBoxWidth;
this.tabsBox.style.height = (
parseInt(this.default.tabBoxHeight) - parseInt(this.default.tabHeight)
) + 'px';
this.tabsBox.style.position = 'relative';
this.tabs.forEach((item, index) => {
item.style.position = 'absolute';
item.style.width = this.tabsBox.style.width;
item.style.height = this.tabsBox.style.height;
item.style.top = 0;
item.style.left = 0;
if(index == this.default.currentTabIndex) {
item.style.display = 'block';
} else {
item.style.display = 'none';
}
});
}
initEvents() {
this.btns.forEach((item, index) => {
item.addEventListener('click', () => {
this.btns.forEach((k, i) => {
for(let keys in this.default.tabBtnUnActiveStyle) {
this.btns[i].style[keys] = this.default.tabBtnUnActiveStyle[keys];
}
});
this.tabs.forEach((k, i) => {
this.tabs[i].style.display = 'none';
});
for(let keys in this.default.tabBtnActiveStyle) {
this.btns[index].style[keys] = this.default.tabBtnActiveStyle[keys];
}
this.tabs[index].style.display = 'block';
this.currentIndex = index;
this.callback(this.currentIndex);
});
});
}
}
let tab = new Tabs(".box", null, function(index) {
console.log(index);
});
console.log(tab);
</script>
</html>
ES6学习-封装tab选项卡
最新推荐文章于 2022-07-26 11:19:18 发布