HTML下拉框样式美化

article/2025/9/29 23:40:06

        在网页中,下拉框的样式最难美化,默认样式巨丑,好在现在已经有各种框架实现了下拉框的样式美化,主要思路都是通过JS代码将下拉框元素用更容易设置样式的div进行替换,再将对应选项及事件进行关联。

        最近一项目需要修改很久以前的页面,用户需求又需要美化下拉框样式,又不能引入第三方的框架,只好自己动手写了一个JS插件,实现下拉框的样式美化。

1、插件效果

        页面包含两个下拉框,一个3个选项,一个多个选项,一个选项内容较短,一个较长,页面代码如下:

    <form><div class="div-form"><div class="div-form-row"><span class="form-title">selected: </span><div class="form-input"><select name="s1" onchange="selectChange('1','2')"><option value="1">1111</option><option value="2" selected>2222</option><option value="3">3333</option></select></div></div><div class="div-form-row"><span class="form-title">select time zone: </span><div class="form-input"><select name="s2"><option value="1">(GMT-12:00) International Date Line West</option><option value="2">(GMT-11:00) Midway Island, Samoa</option><option value="3">(GMT-10:00) Hawaii</option><option value="4">(GMT-09:00) Alaska</option><option value="5">(GMT-08:00) Pacific Time, Tijuana</option><option value="6">(GMT-07:00) Arizona, Mazatlan</option><option value="7">(GMT-07:00-1) Chihuahua, La Paz</option><option value="8">(GMT-07:00-2) Mountain Time</option><option value="9">(GMT-06:00) Central America</option><option value="10">(GMT-06:00-1) Central Time</option><option value="11" selected>(GMT-06:00-2) Guadalajara, Mexico City, Monterrey</option><option value="12">(GMT-06:00-3) Saskatchewan</option><option value="13">(GMT-05:00) Bogota, Lima, Quito</option><option value="14">(GMT-05:00-1) Eastern Time</option><option value="15">(GMT-05:00-2) Indiana</option><option value="16">(GMT-04:00) Atlantic Time</option><option value="17">(GMT-04:00-1) Caracas, La Paz</option><option value="18">(GMT-04:00-2) Santiago</option><option value="19">(GMT-03:30) Newfoundland</option></select></div></div></div></form>

        未引入插件时,页面效果如下图所示:

        引入插件js和样式:

 <script src="select.js"></script><link rel="stylesheet" href="select.css">

        引入插件后,页面效果如下图:

        主要变化是整个下拉框使用边框包裹,下拉框展开和收起状态右侧箭头方向改变,选项列表设置了最高高度,超过高度出现滚动条,选中的选项自定背景色展示。

2、实现步骤

        首先在页面加载事件处理方法中添加方法进行下拉框的渲染动作:

    win.addListener(win, 'load', function () {renderSelects();});

        再来看 renderSelects()方法:

    win.renderSelects = function (className) {var selectList;if (typeof className != "string" || className.trim().length == 0) {selectList = document.querySelectorAll('select');} else {selectList = document.getElementsByClassName(className);}for (var i = 0; i < selectList.length; i++) {renderOneSelect(selectList[i]);}}

        此方法主要将页面中的下拉框通过选择器选取出来,再循坏调用单个的渲染方法进行渲染。此方法可以传入下拉框的样式类名,传入后选择器匹配的下拉框才会进行自定义样式渲染,未传入参数时页面内全部的下拉框都会进行渲染。

        再看单个下拉框的渲染 renderOneSelect(el),这里的el是单个的下拉框元素。先添加一个临时的段落元素pTemp,然后用此段落元素,与下拉框进行替换,占住下拉框原来的位子,等待div构造的下拉框结构拼接好后再将pTemp替换掉:

 renderOneSelect(el){var pTemp = document.createElement("p");el.replaceWith(pTemp);var divSelect = document.createElement("div"); //div构造的下拉框结构// ... 一系列构造过程pTemp.replaceWith(divSelect); //用构造好的div替换掉 pTemp} 

        用div构造的下拉框实际的元素结构如下图所示:

        整个下拉框用div.div-select包裹,原有下拉框select元素放到div.div-select内,其后添加div.div-options,div.div-options内部包含了两个div,第一个div.div-selected,用于展示下拉框当前选中的选项,第二个用于展示所有的下拉框选项,单个选项用div.div-option展示,当前选中的选项添加 option-selected 样式,与其他选项区别展示。选项的内容使用span元素包裹展示,用于控制长度,超过长度出现省略号,添加title,当鼠标悬停时展示完整的选项内容。

        div元素构造好之后就是给各元素添加事件处理了。

        div.div-select添加click事件处理,点击时进行选项列表的展开和收起操作:

   selectClick = function (el) {if (el.hasClass("select-open")) {el.removeClass("select-open")} else {el.addClass("select-open");}}

        div.div-select添加blur事件处理,失去焦点时收起选项列表:

    selectBlur = function (el) {if (el.hasClass("select-open")) {el.removeClass("select-open")}}

        div.div-option添加click事件处理,点击时选中该选项,同步设置原有select选项的选中状态,设置原有select的selectIndex,调用原有select的onchange方法:

 optionClick = function (el) {var _value = el.get("value");var select = el.parentElement.parentElement.parentElement.children[0];var originIndex = select.selectedIndex;var optionLength = select.children.length;for (var i = 0; i < optionLength; i++) {if (select.children[i].get("value") == _value) {select.children[i].set("selected", "");} else {select.children[i].remove("selected");}}var selected = el.parentElement.parentElement.children[0];selected.innerHTML = el.innerHTML;var newIndex = 0;for (var i = 0; i < el.parentElement.children.length; i++) {var tempEl = el.parentElement.children[i];tempEl.removeClass("option-selected");if (tempEl.get("value") == _value && tempEl.innerHTML == el.innerHTML) {newIndex = i;}}el.addClass("option-selected");//设置下拉框 selectedIndex 并触发onchange事件if (originIndex != newIndex) {select.selectedIndex = newIndex;eval(select.get("onchange"));}

3、其他问题

        实际项目中,个别页面个别select的选中状态是通过js设置selectedIndex指定的,渲染代码不能通过option的selected参数获取选中状态,就不能正确的渲染选中状态,此时需要在下拉框完成渲染后,调用一个根据selectedIndex渲染选中状态的方法:

   HTMLElement.prototype.renderSelected = function () {var ele = this;if (this.nodeName == "SELECT") {var index = ele.selectedIndex;var divOptions = ele.parentElement.children[1];if (!!divOptions && divOptions.nodeName == "DIV" && divOptions.hasClass("div-options") && index >= 0) {divOptions.children[0].innerHTML = divOptions.children[1].children[index].innerHTML;divOptions.children[1].children[index].addClass("option-selected");}}};

        还有的页面,下拉框的选项列表是通过异步方法动态获取的,在页面onload方法中执行渲染时,选项列表还是空的,渲染完成后可能选项列表才获取到,这种情况就只能手动的在异步方法完成后调用渲染方法。

        代码下载:https://download.csdn.net/download/evanyanglibo/87490754


http://chatgpt.dhexx.cn/article/dRmFn6Fl.shtml

相关文章

VUE学习(二):修改下拉框样式

目录 前言 一、ElementUI文档 二、代码实现 1.el-select选择器 2.设置样式 拓展阅读 前言 在开发中有时需要给某些下拉框选项设置特定的样式&#xff0c;如字体大小&#xff0c;字体颜色&#xff0c;间距等。 一、ElementUI文档 为了实现给特定下拉框设置样式的效果&am…

win10升级后蓝牙不见了,设备管理器里没有,多了个串行控制器里的未知USB设备?...

win10更新后&#xff0c;蓝牙功能不见了&#xff0c;也没有打开的选项&#xff0c;设备管理器里也没有&#xff0c;多了个未知USB设备&#xff0c;重启无效&#xff0c;重装蓝牙驱动无效&#xff0c;BIOS中的Bluetooth是开的。 试了网上能找到的所有方法&#xff0c;包括更新wi…

设备管理器出现“未知USB设备”同时蓝牙不可用的解决方法

很莫名其妙地&#xff0c;刚才还在使用蓝牙鼠标和蓝牙键盘&#xff0c;离开一会儿后重新解锁进入桌面&#xff0c;蓝牙就彻底不见了。打开设备管理器&#xff0c;里面的蓝牙图标不见了&#xff0c;同时通用串行总线控制器中出现了一个未知USB设备。 查阅后找到这篇博文&#xf…

未知usb设备(设备描述请求失败)_HomePod mini?电源线同样不可拆卸:但或能用USB-C移动电源供电...

尽管在技术规格中没有详细说明&#xff0c;但外媒 MacRumors 可以确认新款 HomePod mini 具有不可拆卸的电源线&#xff0c;该电源线的末端带有 USB-C 接口&#xff0c;可与包装盒中随附的 20W 电源适配器一起使用。 改用 USB-C 后&#xff0c;‌HomePod mini‌ 可以由更广泛的…

未知USB设备(设备描述符请求失败)是什么?

未知USB 设备(设备描述符请求失败)是什么&#xff1f; 参考解决方案&#xff1a;Win10一个USB设备描述符请求失败解决方法 恕我直言&#xff0c;对我们没有什么用&#xff0c;我们需要的是不用插拔usb也能让错误消失

蓝牙变成“未知USB设备”的解决方法

如图。原因是主板积累的静电影响了板载蓝牙的功能。 解决方法&#xff1a; 关机&#xff0c;拔掉电源&#xff0c;长按电源键20秒。听到咔嚓一声动静后即可。 重启即灵。

arduino nano ble 33出现未知USB设备(设备描述符请求失败)解决方法

1情况描叙&#xff1a; 开发板上电正常&#xff0c;下载测试示例测试功能正常。随后在下载自己编写的程序后&#xff0c;开发板出现了电脑无法识别USB设备&#xff0c;打开设备管理器发现如下异常 2解决办法 查询网上资料&#xff0c;大多是建议更新驱动&#xff0c;操作后发现…

win10检查更新后,蓝牙没了,卸载usb也没有用,蓝牙 未知usb设备 设备描述符请求失败

最后解决方案&#xff1a; 长按电源键30s放电&#xff1b; 将bios的所有设置恢复默认 然后就有了蓝牙

一问解决设备管理器里面提示:未知usb设备(设备描述符请求失败) 或者是“Unknown USB Device(Device Descriptor Request Sailed)”错误

哈喽&#xff01;大家好&#xff0c;我是IT技术猿猴&#xff0c;最爱海贼王&#x1f49e;&#x1f49e;&#x1f49e; 是一位爱好技术的【技术宅男】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; &#x1f49e;&#x1f49e;&#x1f49e; 如果有对技术感兴趣的宅友&a…

xps13蓝牙消失,设备管理器中出现“未知USB设备(设备描述符请求失败)”的问题

现象 在老款的xps13笔记本中遇到了蓝牙消失的情况&#xff0c;系统设置中没有蓝牙选项&#xff0c;在设备管理器中蓝牙直接消失&#xff0c;在通用串行总线控制器中出现了一个新的“未知USB设备&#xff08;设备描述符请求失败&#xff09;”。 无论是win10自带的系统&#xf…

笔记本电脑蓝牙忽然消失,设备管理器有未知USB设备描述符请求失败

Windows更新完几个小时后&#xff0c;突然蓝牙设备&#xff08;键盘、耳机&#xff09;不管用&#xff0c;检查发现是笔记本电脑的蓝牙模块消失。 表现是右下角图标里蓝牙标志不见&#xff0c;设置里蓝牙部分没有打开的开关&#xff0c;winXM打开设备管理器也没有蓝牙设备。 …

【一】win10蓝牙不见了,设备管理器里没有,多了个串行控制器里的未知USB设备

参考链接: win10升级后蓝牙不见了&#xff0c;设备管理器里没有&#xff0c;多了个串行控制器里的未知USB设备&#xff1f; win10更新后&#xff0c;蓝牙功能不见了&#xff0c;也没有打开的选项&#xff0c;设备管理器里也没有&#xff0c;多了个未知USB设备&#xff0c;重启…

电脑更新后,设备管理器未知USB设备,并且蓝牙无法使用

昨天&#xff0c;就是电脑更新了一下&#xff0c;午休起来&#xff0c;就发现无线鼠标无法移动&#xff0c;我以为是鼠标没电了&#xff0c;就换了新电池&#xff0c;结果还是一样连不起蓝牙。于是找了很多办法&#xff0c;终于找到问题的正解。 具体情况是这样的&#xff1a; …

windows10自动更新后,设备管理器蓝牙消失“未知USB设备”

以前也遇到同样的状况&#xff0c;进入bios&#xff0c;关闭wireless lan选项&#xff0c;然后重启&#xff0c;接着重新打开wireless lan选项&#xff0c;再次重启后就回来了&#xff0c;但是这次我使用老办法却不管用。 这次我直接在设备管理器里卸载了未知设备&#xff0c;重…

stlink 未知usb设备 设备描述符请求失败

一般是STLINK烧了&#xff0c;可以用STM32的串口下载程序&#xff1a; 只可以用UAART_1&#xff1a;PA9,PA10 需要软件&#xff1a;FlyMcu ① PA9:为TX&#xff0c;要接CH340的RX PA10:为RX&#xff0c;要接CH340的TX ② 再给STM32通电3.3V ③ 设置相同相同波特率&…

未知USB设备(设备描述符请求失败)解决方法

问题如图&#xff1a; 第一步: windows键r键 -》输入&#xff1a;service.msc &#xff08;感谢评论区小伙伴的指出&#xff0c;这里应该输入的是services.msc&#xff09; 第二步&#xff1a; 在服务窗口中找到Plug and Play服务&#xff0c;双击Plug and Play&#xff0c;…

未知usb设备设备描述符请求失败怎么解决

出现未知daousb设备设备描述符请求失du败解决办zhi法如下&#xff1a; 1、按下WindowsR打开【运行】&#xff1b; 2、在版运行的权输入框中输入&#xff1a;services.msc 按下回车键打开【服务】&#xff1b; 2、在服务中找到Plug and Play服务&#xff1b; 3、将服务关闭&…

未知USB设备(设备描述符请求失败)解决方法之一

前言 网上很多帖子讲述了出现未知USB设备的处理情况。这里给大家提供一种其他的可能性&#xff0c;这是大部分帖子里都没讲到的。 解决方案 将线插到电脑上其他USB口上&#xff0c;先排除是不是电脑USB口的问题&#xff08;如果电脑是台式机&#xff0c;尝试插机箱背面的USB口…