当前位置:网站首页>【js组件】自定义select
【js组件】自定义select
2022-07-06 23:26:00 【KatyLight】


单个HTML页面直接运行。
下面是代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body{
background-color: black;
color: white;
}
.KatyLight-select {
position: relative;
width: 200px;
display: inline-block;
text-align: center;
user-select: none;
color: #3b5b65;
font-size: .8rem;
}
.KatyLight-select > .title {
padding: .5rem 1rem;
background-color: transparent;
display: block;
box-shadow: inset 0 0 0 2px #96e4ff;
color: #96e4ff;
}
.KatyLight-select > .title:empty::after{
content: '请选择';
color: #3b5b65;
}
.KatyLight-select > .KatyLight-select-list {
display: none;
}
.KatyLight-select.active > .KatyLight-select-list {
display: block;
}
.KatyLight-select-list > ul {
list-style: none;
margin: 0;
position: absolute;
top:.5rem;
padding-inline-start: 0;
left: 0;
width: 100%;
box-shadow: inset 0 0 0 2px #96e4ff;
}
.KatyLight-select-list > ul > li {
padding:.5rem 0;
}
.KatyLight-select-list {
position: relative;
}
.KatyLight-select-list > ul > li:hover{
color: #96e4ff;
}
.KatyLight-select-list > ul > li.active {
color: #96e4ff;
background-color: #96e4ff22;
}
.KatyLight-select > .del {
position: absolute;
right: 1rem;
top: .5rem;
z-index: 22;
height: 2rem;
width: 2rem;
}
.KatyLight-select > .del.active {
display: block;
}
.KatyLight-select > .del {
display: none;
color: white;
}
.KatyLight-select > .del::after {
content: 'x';
}
</style>
</head>
<script>
class KatyLightSelect {
constructor(params) {
this.target = params.target
this.data = params.data
this.title = this.target.querySelector('.title')
this.del = this.target.querySelector('.del')
this.ul = this.target.querySelector('ul')
this.active = false
this.cIndex = -1
this.outClickZ = this.outClick.bind(this)
document.addEventListener('click', this.outClickZ)
this.del.dataset.del = '1'
this.title.dataset.title = '1'
this.domCreate()
}
domCreate() {
this.li = []
for (let i = 0; i < this.data.length; i++) {
let li = document.createElement('li')
li.dataset.index = i.toString()
li.dataset.option = 'K'
li.innerText = this.data[i].label
this.ul.append(li)
this.li.push(li)
}
}
titleTrigger() {
this.view(!this.active)
}
view(t) {
this.active = t
if (t) {
this.target.classList.add('active')
} else {
this.target.classList.remove('active')
}
}
getVal() {
if (this.cIndex === -1) {
return ''
} else {
return this.data[this.cIndex].value
}
}
delTrigger() {
this.choose(-1)
}
outClick(e) {
if (!this.target.contains(e.target)) {
this.view(false)
} else {
if (e.target.dataset.option) {
this.choose(parseInt(e.target.dataset.index))
this.view(false)
} else if (e.target.dataset.title) {
this.titleTrigger()
} else if (e.target.dataset.del) {
this.delTrigger()
}
}
}
choose(ii) {
if (this.cIndex !== -1) {
this.li[this.cIndex].classList.remove('active')
}
this.cIndex = ii
if (this.cIndex !== -1) {
this.li[this.cIndex].classList.add('active')
this.title.innerText = this.data[this.cIndex].label
this.del.classList.add('active')
} else {
this.title.innerText = ''
this.del.classList.remove('active')
}
}
}
window.onload = () => {
let zz = new KatyLightSelect({
target: document.querySelector('.KatyLight-select'),
data: [
{ label: 'a1', value: 'b1' },
{ label: 'a2', value: 'b2' },
{ label: 'a3', value: 'b3' },
{ label: 'a4', value: 'b4 ' },
{ label: 'a5', value: 'b5' },
{ label: 'a6', value: 'b6' }
]
})
setTimeout(() => {
console.log(zz.getVal())
}, 1500)
}
</script>
<body>
<div class="KatyLight-select">
<span class="title"></span>
<span class="del"></span>
<div class="KatyLight-select-list">
<ul>
</ul>
</div>
</div>
</body>
</html>
边栏推荐
- DJ-ZBS2漏电继电器
- 【最佳网页宽度及其实现】「建议收藏」
- ScheduledExecutorService定时器
- 阿里云的神龙架构是怎么工作的 | 科普图解
- [opencv] image morphological operation opencv marks the positions of different connected domains
- Scheduledexecutorservice timer
- 拿到PMP认证带来什么改变?
- Auto. JS get all app names of mobile phones
- No experts! Growth secrets for junior and intermediate programmers and "quasi programmers" who are still practicing in Universities
- [736. LISP syntax parsing]
猜你喜欢
[email protected] Mapping relatio"/>Why JSON is used for calls between interfaces, how fastjson is assigned, fastjson 1.2 [email protected] Mapping relatio

Leetcode (417) -- Pacific Atlantic current problem

HarmonyOS第四次培训

Techniques d'utilisation de sublime

《二》标签

SQL injection HTTP header injection

How to choose an offer and what factors should be considered

K6EL-100漏电继电器

U++4 interface learning notes

高手勿进!写给初中级程序员以及还在大学修炼的“准程序员”的成长秘籍
随机推荐
sublime使用技巧
【QT】自定义控件-Loading
Window scheduled tasks
np. random. Shuffle and np Use swapaxis or transfer with caution
局部变量的数组初始化问题
【二叉树】二叉树寻路
背包问题(01背包,完全背包,动态规划)
What changes will PMP certification bring?
Mysql database (basic)
模拟线程通信
Why is the salary of test and development so high?
2. Overview of securities investment funds
QT simple layout box model with spring
做自媒体,有哪些免费下载视频剪辑素材的网站?
与利润无关的背包问题(深度优先搜索)
SQL injection HTTP header injection
人体传感器好不好用?怎么用?Aqara绿米、小米之间到底买哪个
Array initialization of local variables
DFS,BFS以及图的遍历搜索
Dynamically generate tables