Js模拟下拉框(select-option)的实现

js模拟下拉框

今天想给大家分享一下之前自己做的一个js模拟下拉框,所有select-option中我能发现的操作,都在我的代码中将其实现,希望对大家有所帮助。如果select中还有一些本人未实现的希望大家在评论区指出。话不多说,直入主题。

  1. 首先是布局,很多时候布局也会对js的实现造成影响,所以布局一定要写好
div id = "box">
	<p></p>
	<ul>
	    <li class = "active">寒冰射手 艾希</li>
	    <li>德玛西亚之力 盖伦</li>
	    <li>无极剑圣 易</li>
	    <li>流浪法师 瑞兹</li>
	    <li>战争女神 希维尔</li>
	    <li>德邦总管 赵信</li>
	</ul>
</div>

我在这里用的是ul>li进行布局,并用一个div将其包裹,p标签是显示选择的li中的文本。

以下是style样式:

<style>
   *{margin:0; padding:0;}
    li{list-style:none;}
    #box{margin:50px 0 0 50px;}
    #box p{width:202px; height:30px; border:1px solid #999;  padding-left:10px; font:16px/30px ""; box-sizing:border-box;}
    #box p:hover{cursor:default;}
    #box ul{display:none; border:1px solid rgb(47, 140, 245);}
    #box ul li{width:200px; height:30px; padding-left:10px; font:16px/30px ""; box-sizing:border-box;}
    #box ul li:hover{cursor:default;}
    #box ul li.active{background:rgb(0, 153, 255); color:#fff;}
</style>

浏览器显示结果如下:
在这里插入图片描述在这里插入图片描述
p标签里默认存放的是下拉框中的第一条,默认ul>li是不显示的。
布局就说到这里,本来不想多说关于布局,但是还是放出来希望对大家有所帮助。

  1. 然后我们开始说js部分的实现,我会将其分成一个个部分来阐述如何实现。

(1)第一步,不用多说肯定是要获取元素。这里需要获取的元素为pulli

//获取元素
    var op = document.querySelector("p");
    var oul = document.querySelector("ul");
    var oli = document.querySelectorAll("li");

(2)第二步,将初始效果显示出来,如上图所示

// 定义index,indexC的初始值为0
	var index = 0, indexC = 0;
//把li的第一个显示在p标签内
	op.innerHTML = oli[0].innerHTML;
    oli[indexC].className = "active";	
    //这里索引用哪个都可以,要与后续保持一致即可

这里为何定义需要定义两个索引,后面涉及到的时候再说。

(3)给p添加点击事件

op.onclick = function (eve) {
	var e = eve || window.event;
	//解除冒泡
	stopBubble(e);
	//改变p边框的样式
	op.style.border = "2px solid rgb(47, 140, 245)";
	op.style.borderRadius = "2px";

[注意] 我直接按照我的思路往下阐述(代码顺序自行把控),若是使用我的代码注意补齐**{}**等符号,很多注释都在代码中有所体现。

-----在点击p标签的同时,也会影响到ul的显示隐藏,而ul的显示隐藏,不仅仅是点击p,点击ul和点击document以及回车都会对其的显示隐藏有影响。
-----首先点击p标签激活下拉框,显示ul。之后可以继续点击pul,按回车键隐藏ul。此时下拉框仍处于激活状态。
-----只有点击了document的时候才会阻止所有可以对p中元素改变的操作。
(我在点击的时候改变了边框样式,这样就好判断下拉框是否处于激活状态)
下面我定义了两个状态ab,分别对应非激活状态激活状态。当为0时,点击显示、为1时点击隐藏。

var a = 0, b = 0;
//定义a,b两个状态。当a、b为0状态时,使ul显示。 b = 1时使ul消失。
if (a == 0 || b == 0) {
   oul.style.display = "block";
    a = 1;
    b = 1;
} else if (b == 1) {
    oul.style.display = "none";
    b = 0;
}

(4)当ul显示的时候,首先我们可以通过滑动鼠标,改变li样式,表示当前鼠标所在的li,滑动鼠标的时候,仅仅改变li的样式。只有当鼠标按下的时候才会将当前选中的li的元素在p中显示。(激活状态

for (var i = 0; i < oli.length; i++) {
    //添加索引
    oli[i].index = i;
    //给li添加鼠标移动事件
    oli[i].onmousemove = function () {
        for (var j = 0; j < oli.length; j++) {
            //清除所有样式
            oli[j].className = "";
        }
        //给当前的li添加类名“active”
        this.className = "active";
        
        //点击li使点击的li的内容显示在p中,并使ul消失,状态为b = 0;
        this.onclick = function (eve) {
            var e = eve || window.event;
            stopBubble(e);
            oul.style.display = "none";
            b = 0;
            op.innerHTML = this.innerHTML;
            this.className = "active";
            indexC = index;		//tips:
        }
        //将点击的li的索引返回,之后会需要再次使用鼠标移动改变的li的索引,所以要将index返回出来。在后面需要使用的时候可以获取到
        return index = this.index;
    }
}

tips:
1.这里为何要将index的值赋给indexC呢,因为我们在点击li的时候,ul隐藏,当我们再次点击p显示ul的时候,具有样式的li的元素还是得保证和p中的元素一致。
2.那么肯定有人有疑惑,为什么不将li的索引直接设置为indexC,而偏偏要多此一举多设置一个index呢。
因为会有这样一个问题,一开始index为0,对应显示的是寒冰射手,如果你将鼠标移动至德玛西亚之力不通过点击li使其消失。而直接点击document,这时候p获取的是寒冰射手indexC=0,而此时li的样式设置给了德玛西亚之力,这时候你再次点击p,显示的是寒冰li选中的却是德玛.会出现这样一个问题。

//封装的解决事件冒泡的兼容处理
function stopBubble(e){
	if(e.stopPropagation){
	        e.stopPropagation();
	    }else{
	        e.cancelBubble = true;
	    }
	}

(5)继续分析点击doocument,停止一切对p改变的操作(非激活状态

//点击document,改变ul,p的样式并将a的状态赋值为0。
document.onclick = function () {
    oul.style.display = "none";
    op.style.border = "1px solid #999";
    for (var j = 0; j < oli.length; j++) {
            //清除所有样式
            oli[j].className = "";
        }
    oli[indexC].className = "active";
    //获取到点击document隐藏时,p中显示的是indexC的索引
    index = indexC;
    //如果是点击li的话,会将li的index赋给indexC,若点击document则表示,未改变实际的li。
    //li的样式应该还是在p元素对应的li上,所以将indexC再赋给li的索引index
    a = 0;
}

以上代码都是在点击p的事件中的。

[提示]: 大家可以这么理解:
indexC的索引是p元素显示的选中的对应的li的索引,在p中要显示你要展示的li,那么就将此liindex赋值给indexC
index的索引则是具有样式的li,并非是点击选中的li的索引。因为鼠标滑动只改变样式,并没有将滑动的时候具有样式的li的值显示在p中。
设置indexindexC就是为了解决:鼠标移动改变的li并不就是要显示的在p中的li。用这俩索引将只具有鼠标样式的li,和实际被选中的li区别出来。保证不会相互造成影响。
index改变li的样式,如果要将当前具有样式的li显示在p标签中,就将index赋值给indexC
点击p显示ul的时候将indexC赋值给index,使与p的属性相同的li添加样式。

(6)接下来就是键盘的上下键、回车键操作,改变li的样式和p的显示
上面说的有俩状态,为什么要说到会有激活状态非激活转态,在键盘事件中就会有所体现。
----非激活状态,不能通过键盘改变

document.onkeydown = function (eve) {
//a的值为0时,表示点击document使ul消失,不能执行键盘事件
    if (a == 0) {
        index = indexC;
        document.onkeydown = null;

----激活状态,ul不论是显示还是隐藏,都可以使用键盘操作ul的显示、p标签中元素的改变。
①上键

} else if (a == 1 || b == 1 || b == 0) {  
//当状态为三者任意一个的时候可以执行键盘事件
//a为非激活状态,b为激活状态,1为显示,0为隐藏
       var e = eve || window.event;
        var code = e.keyCode || e.which;
        //当按下↑时,改变索引
        if (code == 38) {
            if (index == 0) {
                index = 0;	//当index为0时,点击↑,index一直为0
            } else {
                index--;
            }
            for (var i = 0; i < oli.length; i++) {
                oli[i].className = "";
            }
            //将通过↑选择的li的类名设置为“active”,并将li的内容显示在p中
            oli[index].className = "active";
            indexC = index;
            op.innerHTML = oli[indexC].innerHTML;
        }

indexindexC的关系前面说过了,这里就不再阐述。其他一些注释代码中有体现,code == 40code==38的思路是一致的,就直接上代码
②下键

    if (code == 40) {
        if (index == oli.length - 1) {
            index = oli.length - 1;
        } else {
            index++;
        }
        for (var i = 0; i < oli.length; i++) {
            oli[i].className = "";
        }
        oli[index].className = "active";
        indexC = index;
        op.innerHTML = oli[index].innerHTML;
    }

③回车键

//按下回车,ul消失,状态b赋为0;并将li的内容显示在p中
     if (code == 13) {
     //a为非激活状态,b为激活状态,0为隐藏,1为显示
          if(a == 0 || b == 0){
              oul.style.display = "block";
              a = 1;
              b = 1;
          }else if(a == 1){
              oul.style.display = "none";
              b = 0;
          }
          op.innerHTML = oli[indexC].innerHTML;
          indexC = index;
      }

处于激活状态,回车键可以控制ul的显示隐藏,上下键可以控制li索引index的改变,同时改变indexC改变p标签中的显示。

以上就是我使用js模拟下拉框的实现。希望对大家有所帮助,有何不正确或者有更好的思路,希望可以告知。谢谢!

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用 JavaScript 操作 DOM 元素来模拟下框的下操作。 首先,你需要在 HTML 中设置一个下框元素,比如: ```html <select id="mySelect"> <option value="option1">Option 1</option> <option value="option2">Option 2</option> <option value="option3">Option 3</option> </select> ``` 然后,你可以使用 JavaScript 来获取这个元素,并通过修改它的 `size` 属性来控制下框的下与否。 ```javascript // 获取下框元素 var selectElement = document.getElementById("mySelect"); // 下框下 selectElement.size = selectElement.length; // 下框收起 selectElement.size = 1; ``` 你也可以使用其他方法来模拟下框的下操作,比如通过修改它的 `display` 属性来显示或隐藏选项列表。 ```javascript // 获取下框的选项列表 var optionsList = selectElement.options; // 下框下 optionsList.style.display = "block"; // 下框收起 optionsList.style.display = "none"; ``` 希望这能帮到你。 ### 回答2: 下框是网页开发中常见的交互元素,通过js模仿下框的下操作可以实现自定义的下框效果。 首先,我们需要通过HTML创建一个包含下选项的容器,一般使用`<select>`标签来创建下框。然后,使用`<option>`标签来定义下选项,其中的`value`属性用于表示选项的值,`text`标签内的内容表示选项的显示文本。 接下来,我们可以使用js实现框的下效果。我们可以监听鼠标或键盘事件,当用户点击下框时触发事件。在事件处理函数中,我们可以通过操作下框的`class`属性或样式来实现框的显示与隐藏。 例如,我们可以为下框容器添加一个类名为`active`,并为该类名设置一个样式,将下框的`display`属性设置为`block`,即可将下框展示出来。反之,将该类名移除或`display`属性设置为`none`,则可以隐藏下框。 同时,我们还需要监听下选项的点击事件。当用户选择某个选项时,可以在事件处理函数中获取选项的值,并将其设置到下框的显示文本中,以及将其隐藏。这样,就完成了下框的选择操作。 最后,我们可以根据需求添加一些额外的功能,如通过设置`disabled`属性来禁用某些选项,或使用`filter`方法实现框的搜索功能等。 总结起来,通过HTML创建下框容器,使用js监听事件实现框的展开与隐藏,以及监听选项点击事件实现选项的选择,可以实现js模仿下框的下操作。 ### 回答3: 下框是网页开发中常见的交互组件,可以提供多个选项供用户选择。使用JavaScript模仿下框的下操作可以通过以下步骤实现。 1. 创建一个HTML结构,包含一个按钮和一个隐藏的选项列表。例如: ```html <button id="dropdown-btn">下选项</button> <ul id="dropdown-list" style="display: none;"> <li>选项1</li> <li>选项2</li> <li>选项3</li> </ul> ``` 2. 使用JavaScript代码获取按钮和选项列表的引用,并设置按钮的点击事件。例如: ```javascript var dropdownBtn = document.getElementById('dropdown-btn'); var dropdownList = document.getElementById('dropdown-list'); dropdownBtn.addEventListener('click', function() { if (dropdownList.style.display === 'none') { dropdownList.style.display = 'block'; } else { dropdownList.style.display = 'none'; } }); ``` 3. 在点击按钮时切换选项列表的显示状态。当选项列表的display属性为none时,隐藏列表;当display属性为block时,显示列表。 4. 可以根据需要添加其他交互效果,比如鼠标移入移出时改变样式,点击选项时执行相应的操作等。 通过以上步骤,可以实现一个简单的JavaScript模仿下框的下操作。当点击按钮时,选项列表将显示或隐藏,提供用户选择的交互功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值