一.html部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="menu">
<p>下拉菜单</p>
<span>html</span>
<ul>
<li class="active">html</li>
<li>css</li>
<li>js</li>
</ul>
</div>
</body>
</html>
二.css部分
#menu {
width: 200px;
height: 60px;
line-height: 30px;
margin: 20px auto;
text-align: center;
}
#menu p {
height: 30px;
line-height: 30px;
}
#menu span {
display: block;
width: 200px;
line-height: 30px;
border: solid 1px black;
}
#menu ul {
margin: 0;
padding: 0;
list-style: none;
overflow: auto;
border: solid 1px black;
border-top: none;
display: none;
width: 100%;
height: 90px;
}
#menu ul li {
width: 100%;
height: 30px;
}
#menu ul li.active {
background: #35f;
color: #fff;
}
三.JavaScript部分
1.初始化
var ospan = document.querySelector("#menu span");
var oul = document.querySelector('#menu ul');
var ali = document.querySelectorAll("#menu ul li");
var index = 0; //索引
var temporary = index; //临时存放索引
var state = 0; //ul转态 0为隐藏,1为显示
for (var i = 0; i < ali.length; i++) { //初始化li
ali[i].className = "";
}
ospan.innerHTML = ali[index].innerHTML; //显示默认选中的li内容
2.点击下拉列表主框
ospan.onclick = function (eve) { //点击显示ul
var e = eve || window.event;
stopBubble(e);
if (state == 0) {
for (var j = 0; j < ali.length; j++) {
ali[j].className = "";
}
ali[index].className = "active";
oul.style.display = "block"; //设置为显示
state = 1;
} else {
oul.style.display = "none";
state = 0;
}
}
3.点击ul内区域
for (let i = 0; i < ali.length; i++) { //点击下拉框内事件
ali[i].onmouseover = function () {
index = i;
for (var j = 0; j < ali.length; j++) {
ali[j].className = "";
}
ali[i].className = "active";
ospan.innerHTML = ali[i].innerHTML;
}
ali[i].onclick = function () {
ospan.innerHTML = ali[i].innerHTML;
index = i;
temporary = index; //选中li的索引赋值给临时索引
}
}
4.键盘事件
document.onkeydown = function (eve) { //键盘事件
if (state == 1) {
var e = eve || window.event;
var code = e.which || e.keyCode;
if (code == 38) { //方向键:上
if (index == 0) {
index = 0;
}
else {
index--;
ospan.innerHTML = ali[index].innerHTML;
}
for (var i = 0; i < ali.length; i++) {
ali[i].className = "";
}
ali[index].className = "active";
}
if (code == 40) { //方向键:下
if (index == 0) {
index = 0;
}
if (index < ali.length - 1) {
index++;
ospan.innerHTML = ali[index].innerHTML;
}
for (var i = 0; i < ali.length; i++) {
ali[i].className = "";
}
ali[index].className = "active";
}
if (code == 13) { //enter回车键
oul.style.display = "none";
state = 0;
ospan.innerHTML = ali[index].innerHTML;
temporary = index;
}
}
}
5.点击下拉框外区域
document.onclick = function () { //鼠标点击下拉框外事件
oul.style.display = "none"; //ul隐藏
state = 0; //状态码改为0
index = temporary; //临时存放索引
ospan.innerHTML = ali[index].innerHTML;
}
6.阻止冒泡
//阻止冒泡
function stopBubble(e) {
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
}
完整代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#menu {
width: 200px;
height: 60px;
line-height: 30px;
margin: 20px auto;
text-align: center;
}
#menu p {
height: 30px;
line-height: 30px;
}
#menu span {
display: block;
width: 200px;
line-height: 30px;
border: solid 1px black;
}
#menu ul {
margin: 0;
padding: 0;
list-style: none;
overflow: auto;
border: solid 1px black;
border-top: none;
display: none;
width: 100%;
height: 90px;
}
#menu ul li {
width: 100%;
height: 30px;
}
#menu ul li.active {
background: #35f;
color: #fff;
}
</style>
</head>
<body>
<div id="menu">
<p>下拉菜单</p>
<span>html</span>
<ul>
<li class="active">html</li>
<li>css</li>
<li>js</li>
</ul>
</div>
<script>
//阻止冒泡
function stopBubble(e) {
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
}
//下拉列表
var ospan = document.querySelector("#menu span");
var oul = document.querySelector('#menu ul');
var ali = document.querySelectorAll("#menu ul li");
var index = 0; //索引
var temporary = index; //临时存放索引
var state = 0; //ul转态 0为隐藏,1为显示
for (var i = 0; i < ali.length; i++) { //初始化li
ali[i].className = "";
}
ospan.innerHTML = ali[index].innerHTML; //显示默认选中的li内容
ospan.onclick = function (eve) { //点击显示ul
var e = eve || window.event;
stopBubble(e);
if (state == 0) {
for (var j = 0; j < ali.length; j++) {
ali[j].className = "";
}
ali[index].className = "active";
oul.style.display = "block"; //设置为显示
state = 1;
} else {
oul.style.display = "none";
state = 0;
}
}
document.onclick = function () { //鼠标点击下拉框外事件
oul.style.display = "none"; //ul隐藏
state = 0; //状态码改为0
index = temporary; //临时存放索引
ospan.innerHTML = ali[index].innerHTML;
}
for (let i = 0; i < ali.length; i++) { //点击下拉框内事件
ali[i].onmouseover = function () {
index = i;
for (var j = 0; j < ali.length; j++) {
ali[j].className = "";
}
ali[i].className = "active";
ospan.innerHTML = ali[i].innerHTML;
}
ali[i].onclick = function () {
ospan.innerHTML = ali[i].innerHTML;
index = i;
temporary = index; //选中li的索引赋值给临时索引
}
}
document.onkeydown = function (eve) { //键盘事件
if (state == 1) {
var e = eve || window.event;
var code = e.which || e.keyCode;
if (code == 38) { //方向键:上
if (index == 0) {
index = 0;
}
else {
index--;
ospan.innerHTML = ali[index].innerHTML;
}
for (var i = 0; i < ali.length; i++) {
ali[i].className = "";
}
ali[index].className = "active";
}
if (code == 40) { //方向键:下
if (index == 0) {
index = 0;
}
if (index < ali.length - 1) {
index++;
ospan.innerHTML = ali[index].innerHTML;
}
for (var i = 0; i < ali.length; i++) {
ali[i].className = "";
}
ali[index].className = "active";
}
if (code == 13) { //enter回车键
oul.style.display = "none";
state = 0;
ospan.innerHTML = ali[index].innerHTML;
temporary = index;
}
}
}
</script>
</body>
</html>