原生select框

Demo:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">

		*{
			padding: 0;
			margin: 0;
		}

		body{
			width: 100vw;
			height: calc(100vh - 20px);
		}

		div.select select{
			display: none;
		}

		div.select-box{
			width: 200px;
			margin: 20px 20px;
		}

		div.select-head{
			position: relative;
			height: 30px;
			width: 100%;
			display: flex;
			border: solid 1px #000;
			align-items: center;
			cursor: pointer;
		}

		div.select-head span{
			font-size: 16px;
			margin-left: 5px;
			color: #AAA;
		}

		div.select-head span.fill{
			color: #000;
		}

		div.select-head i{
			position: absolute;
			height: 16px;
			width: 16px;
			right: 5px;
			background-image: url(./arrow.png);
			background-size: 16px auto;
		}

		div.select-body{
			display: none;
			width: 100%;
			border: solid 1px #000;
			border-top: none;
		}

		div.search-input{
			position: relative;
			height: 40px;
		}

		div.search-input input{
			height: 30px;
			width: 150px;
			margin: 5px 8px;
			text-indent: 10px;
			padding-right: 30px;
		}

		div.search-input i{
			position: absolute;
			display: block;
			height: 20px;
			width: 20px;
			top: 12px;
			right: 15px;
			background-image: url(./search-normal.png);
			background-size: 20px 20px;
			cursor: pointer;
		}

		div.search-input i:hover{
			background-image: url(./search-active.png);
		}

		div.value-body{
			max-height: 150px;
			overflow: auto;
		}

		div.value-body li{
			display: flex;
			height: 24px;
			padding: 5px 5px;
			font-size: 14px;
			align-items: center;
			cursor: pointer;
		}

		div.value-body li:hover,li.active{
			background-color: #F5F6FA;
		}

		div.value-body li.none,div.none{
			display: none;
		}

		div.value-body div{
			text-align: center;
			height: 30px;
			line-height: 30px;
			color: #AAA;
		}
	</style>
	<script type="text/javascript">
		window.onload = function () {
			//清空select的value
			document.querySelector('div.select>select').value = ''

			/**
			 * 点击自定义的select框开启或收回选择框
			 */
			document.querySelector('div.select-head').onclick = function () {
				//清空输入框内容
				document.querySelector('div.search-input>input').value = ''

				document.querySelectorAll('div.value-body>li').forEach( function(element, index) {
					if (element.classList.contains('active')) {
						element.classList = 'active'
					}else {
						element.classList = ''
					}
				});

				document.querySelector('div.value-body>div').classList = 'none'

				var select_body = document.querySelector('div.select-body')
				if (select_body.style.display == 'block') 
					select_body.style.display = 'none'
				else 
					select_body.style.display = 'block'
			};

			/**
			 * 点击空白处关闭select框
			 */
			document.onclick = function (argument) {
				if(!argument.target.classList.contains('s')){
					var select_body = document.querySelector('div.select-body')
					if (select_body.style.display == 'block') 
						select_body.style.display = 'none'
				}
			}

			/**
			 * 自定义的select的选值功能
			 */
			document.querySelectorAll('div.value-body>li').forEach( function(element, index) {
				element.onclick = function () {
					//初始化下样式
					document.querySelectorAll('div.value-body>li').forEach( function(element, index) {
						element.classList = ''
					});
					element.classList = 'active'
					//更新select框的value和自定义的select框的value
					var data_value = element.getAttribute('data-value')
					var select_head_span = document.querySelector('div.select-head>span')
					document.querySelector('div.select>select').value = data_value
					select_head_span.innerHTML = data_value
					if(!select_head_span.classList.contains('fill'))
						select_head_span.classList = 'fill'

					//关闭select-body
					document.querySelector('div.select-body').style.display = 'none'
				}
			});

			/**
			 * 搜素功能实现
			 */
			document.querySelector('div.search-input>input').oninput = function () {
				var input_value = document.querySelector('div.search-input>input').value
				if(input_value == '') {
					document.querySelectorAll('div.value-body>li').forEach( function(element, index) {
						if (element.classList.contains('active')) {
							element.classList = 'active'
						}else {
							element.classList = ''
						}
					});
				}else{
					document.querySelectorAll('div.value-body>li').forEach( function(element, index) {
						if(element.getAttribute('data-value').indexOf(input_value) == -1){
								if (element.classList.contains('active')) {
									element.classList += ' none'
								}else {
									element.classList = 'none'
								}
						}else {
							if(element.classList.contains('none')) {
								document.querySelectorAll('div.value-body>li').forEach( function(element, index) {
									if (element.classList.contains('active')) {
										element.classList = 'active'
									}else {
										element.classList = ''
									}
								});
							}
						}
					});
				}
				//记一下结果数量
				var length = 0
				document.querySelectorAll('div.value-body>li').forEach( function(element, index) {
					if (!element.classList.contains('none')) length++
				});
				
				if (length == 0) {
					document.querySelector('div.value-body>div').classList = ''
				}else{
					document.querySelector('div.value-body>div').classList = 'none'
				}
			}
		};
	</script>
</head>

关注我的微信公众号【前端基础教程从0开始】,加我微信,可以免费为您解答问题。回复“1”,拉你进程序员技术讨论群。回复“小程序”,领取300个优秀的小程序开源代码+一套入门教程。回复“领取资源”,领取300G前端,Java,微信小程序,Python等资源,让我们一起学前端。

<body>
	<div class="select">
		<select name="select-name">
			<option value="" disabled="true">请选择</option>
			<option value="选择1">选择1</option>
			<option value="选择2">选择2</option>
			<option value="选择3">选择3</option>
			<option value="选择4">选择4</option>
			<option value="选择5">选择5</option>
			<option value="选择6">选择6</option>
			<option value="选择7">选择7</option>
			<option value="选择8">选择8</option>
			<option value="选择9">选择9</option>
			<option value="选择10">选择10</option>
		</select>
		<div class="s select-box">
			<div class="s select-head">
				<span class="s">请选择</span>
				<i class="s"></i>
			</div>
			<div class="s select-body">
				<div class="s search-input">
					<input class="s" type="text" placeholder="搜索">
					<i class="s"></i>
				</div>
				<div class="s value-body">
					<li data-value="选择1">选择1</li>
					<li data-value="选择2">选择2</li>
					<li data-value="选择3">选择3</li>
					<li data-value="选择4">选择4</li>
					<li data-value="选择5">选择5</li>
					<li data-value="选择6">选择6</li>
					<li data-value="选择7">选择7</li>
					<li data-value="选择8">选择8</li>
					<li data-value="选择9">选择9</li>
					<li data-value="选择10">选择10</li>
					<div class="none">暂无匹配选项</div>
				</div>
			</div>
		</div>
	</div>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用原生 JavaScript 实现树形选择的示例代码: HTML: ```html <div id="tree-select"> <select id="tree-select-options"> <option value="">请选择</option> </select> </div> ``` JavaScript: ```js var treeData = [ { id: 1, label: "节点1", children: [ { id: 11, label: "节点1-1", children: [ { id: 111, label: "节点1-1-1", }, { id: 112, label: "节点1-1-2", }, ], }, { id: 12, label: "节点1-2", }, ], }, { id: 2, label: "节点2", children: [ { id: 21, label: "节点2-1", }, { id: 22, label: "节点2-2", }, ], }, ]; var selectOptions = document.getElementById("tree-select-options"); function generateTreeSelectOptions(data, level) { for (var i = 0; i < data.length; i++) { var option = document.createElement("option"); option.value = data[i].id; option.text = " ".repeat(level) + data[i].label; selectOptions.appendChild(option); if (data[i].children) { generateTreeSelectOptions(data[i].children, level + 1); } } } generateTreeSelectOptions(treeData, 0); ``` 该示例代码中,首先定义了一个树形数据 `treeData`,其中每个节点包含 `id` 和 `label` 属性,以及可能存在的 `children` 子节点。然后在 HTML 中定义了一个 `select` 元素,用于展示树形选择。 接下来,在 JavaScript 中定义了一个 `generateTreeSelectOptions` 函数,用于生成树形选择的选项。该函数接受两个参数:树形数据 `data` 和当前节点的层级 `level`。函数使用循环遍历树形数据,将每个节点作为一个选项添加到 `select` 元素中,并通过递归调用自身生成子节点的选项。 最后,在主函数中调用 `generateTreeSelectOptions` 函数,传入树形数据和初始层级 0。这样就可以生成一个树形选择了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值