不太擅长总结挺早的东西了,突然觉得都记录下来,小demo也比较简单,欢迎讨论指正。
之前 ui的设计稿选择框不想要默认样式,默认样式改起来也是太心塞,有的还改不了,所以干脆自己写了一个p模拟的选择框 先看效果吧:
代码实现不多,也都很简单,js部分是纯原声的所以不需要引用其他框架就可以用:
先html部分:
<!doctype html><html>
<head>
<meta charset="utf-8">
<title>p模拟select选择框</title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link href="css/customselect.css" rel="stylesheet" />
</head>
<body>
<p class="custom-select-box">
<p class="select-box mui-inline" style="width: 220px;">
<span id="fisrt" data-show="0">1</span>
<ul class="custom-option-box">
<li class="active"><span>1</span></li>
<li><span>2</span></li>
<li><span>3</span></li>
<li><span>4</span></li>
</ul>
</p>
</p>
<script src="js/customselect.js"></script>
</body></html>
css部分:
ul,li,p,span{
box-sizing: border-box;
}.select-box ul,
.select-box li {
list-style-type: none;
margin: 0;
padding: 0;
cursor: pointer;
background: #fff;
}.select-box {
width: 100%;
position: relative;
background: #fff;
}#fisrt {
display: block;
line-height: 40px;
width: 100%;
height: 40px;
padding: 0 15px;
padding-right: 20px;
border: 1px solid #ccc;
border-radius: 3px; /*white-space: nowrap;*/
overflow: hidden;
cursor: pointer;
}#fisrt.active {
border: 1px solid #f2c051;
}#fisrt::after {
content: "";
display: block;
position: absolute;
top: 18px;
right: 10px;
width: 0;
height: 0;
border: 5px solid transparent;
border-top-color: #000;
background: #fff;
}.custom-option-box {
display: none;
position: absolute;
left: 0;
top: 40px;
background: #fff;
border: 1px solid #ccc;
border-top-color: transparent;
z-index: 10000;
}.custom-option-box li {
display: block;
line-height: 30px;
padding: 0 15px;
z-index: 10000;
}.custom-option-box li:hover,
.custom-option-box li.active {
background: #f2c051;
}.custom-option-box span {
cursor: pointer;
}
js部分:(js部分有一点粗糙,现放上来,这两天会修改一下)
(function() {
ready(function() {
var option_box = document.getelementsbyclassname("custom-option-box")[0],
select_box = document.getelementsbyclassname("select-box")[0],
width;
option_box.style.display = "none"; //初始ul隐藏
width = select_box.offsetwidth; //select的宽度 默认 100%
option_box.style.width = width + "px"; //初始ul宽度
document.getelementbyid("fisrt").addeventlistener("click", function() {
var isshow = this.dataset.show;
if(isshow == 0) {
this.dataset.show = 1;
this.classlist.add("active");
this.nextelementsibling.style.display = "block"; //找到ul.son_ul显示
} else {
this.dataset.show = 0;
this.classlist.remove("active");
this.nextelementsibling.style.display = "none"; //找到ul.son_ul显示
}
},false);
var option = option_box.getelementsbytagname("li");
for(var i = 0; i < option.length; i++){
option[i].onclick = function(){
var fisrt = this.parentnode.previouselementsibling;
var siblings = getsiblings(this);
fisrt.innerhtml = this.childnodes[0].innertext;
fisrt.dataset.val = this.dataset.val;
this.classlist.add("active");
for(var i = 0;i<siblings.length;i++){
siblings[i].classlist.remove("active");
} this.parentnode.style.display = "none";
fisrt.dataset.show = 0;
fisrt.classlist.remove("active");
}
}
});
function ready (fn) {
if(document.addeventlistener){ //标准浏览器
document.addeventlistener('domcontentloaded',function(){ //注销时间,避免重复触发
document.removeeventlistener('domcontentloaded',arguments.callee,false);
fn();
//运行函数
},false);
}else if(document.attachevent){ //ie浏览器
document.attachevent('onreadystatechange',function(){
if(document.readystate=='complete'){
document.detachevent('onreadystatechange',arguments.callee);
fn();
//函数运行
}
});
}
}
function getsiblings (elm) {
var a = [];
var p = elm.parentnode.children;
for(var i = 0, pl = p.length; i < pl; i++) {
if(p[i] !== elm) a.push(p[i]);
}
return a;
}
})();
以上就是div模拟select选择框的示例代码分享的详细内容。