
html原生的
自定义下拉框通常由一个隐藏的原生
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<!-- 第一个自定义下拉框实例 -->
<div class="box" id="one">
<!-- 隐藏的原生select,用于存储数据和初始值 -->
<select class="vodiapicker">
<option>Select one</option>
<option value="en" class="test" data-thumbnail="images/3.png">English</option>
<option value="au" data-thumbnail="images/3.png">English (AU)</option>
</select>
<!-- 自定义下拉框的显示部分 -->
<div class="lang-select">
<!-- 显示当前选中项的按钮 -->
<button class="btn-select" value=""></button>
<!-- 模拟下拉列表的容器 -->
<div class="b">
<ul class="custom-options"></ul> <!-- 注意:将id="a"改为class="custom-options"以避免ID重复 -->
</div>
</div>
</div>
<!-- 第二个自定义下拉框实例 -->
<div class="box" id="two">
<select class="vodiapicker">
<option>Select one</option>
<option value="fr" class="test" data-thumbnail="images/3.png">French</option>
<option value="ca" data-thumbnail="images/3.png">French (CA)</option>
</select>
<div class="lang-select">
<button class="btn-select" value=""></button>
<div class="b">
<ul class="custom-options"></ul> <!-- 注意:将id="a"改为class="custom-options"以避免ID重复 -->
</div>
</div>
</div>关键点说明:
CSS负责隐藏原生
.vodiapicker {
display: none; /* 隐藏原生select */
}
.custom-options { /* 对应修改后的类名 */
padding-left: 0px;
margin: 0; /* 移除默认外边距 */
}
.custom-options img,
.btn-select img {
width: 18px;
vertical-align: middle; /* 图像与文本对齐 */
}
.custom-options li {
list-style: none;
padding: 5px; /* 统一内边距 */
cursor: pointer; /* 鼠标悬停显示手型 */
}
.custom-options li:hover {
background-color: #f4f3f3;
}
.custom-options li img {
margin-right: 5px; /* 图片右侧间距 */
}
.custom-options li span,
.btn-select li span {
margin-left: 10px; /* 文本左侧间距 */
}
/* 下拉列表容器 */
.b {
display: none; /* 初始隐藏 */
width: 100%;
max-width: 350px;
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 5px;
position: absolute; /* 使其浮动在其他内容之上 */
background-color: #fff; /* 背景色 */
z-index: 1000; /* 确保在最上层 */
}
/* 按钮样式 */
.btn-select {
margin-top: 10px;
width: 100%;
max-width: 350px;
height: 34px;
border-radius: 5px;
background-color: #fff;
border: 1px solid #ccc;
text-align: left; /* 文本左对齐 */
padding: 0 10px; /* 内边距 */
cursor: pointer;
display: flex; /* 使用flex布局使内容居中或对齐 */
align-items: center;
}
.btn-select li {
list-style: none;
float: left; /* 原始代码中的float,这里可以结合flexbox优化 */
padding-bottom: 0px;
}
.btn-select:hover {
background-color: #f4f3f3;
border: 1px solid transparent;
box-shadow: inset 0 0px 0px 1px #ccc;
}
.btn-select:focus {
outline: none;
}
.lang-select {
/* margin-left: 50px; 根据实际布局调整 */
position: relative; /* 为下拉列表的绝对定位提供上下文 */
}CSS注意事项:
jQuery是实现自定义下拉框功能的核心。为了解决多实例冲突,关键在于确保所有操作都限定在当前被点击或操作的下拉框实例内。
CA.LA
第一款时尚产品在线设计平台,服装设计系统
86
查看详情
$(function() {
// 1. 初始化每个自定义下拉框
$(".box").each(function() {
let langArray = []; // 使用let确保langArray是局部变量,避免不同实例间混淆
const $currentBox = $(this); // 缓存当前.box元素
$currentBox.find(".vodiapicker option").each(function() {
const img = $(this).attr("data-thumbnail");
const text = this.innerText;
const value = $(this).val();
const item =
'<li>@@##@@<span>' + text + "</span></li>";
langArray.push(item);
});
// 填充自定义列表
$currentBox.find(".custom-options").html(langArray); // 对应修改后的类名
// 设置按钮初始值
$currentBox.find(".btn-select").html(langArray[0]);
$currentBox.find(".btn-select").attr("value", langArray[0] ? $(langArray[0]).find("img").attr("value") : ""); // 确保设置正确的value
});
// 2. 全局点击事件:点击外部区域关闭所有打开的下拉框
$(document).click(function(event) {
// 如果点击的不是 .btn-select 按钮,则检查并关闭所有打开的下拉框
if (!$(event.target).closest("button.btn-select").length && !$(event.target).closest(".b").length) {
$(".box").each(function() {
const $dropdownList = $(this).find(".b");
if ($dropdownList.is(':visible')) {
$dropdownList.toggle();
}
});
}
});
// 3. 选项点击事件:选择一个选项并关闭当前下拉框
$(".custom-options li").click(function() { // 对应修改后的类名
const $clickedLi = $(this);
const img = $clickedLi.find("img").attr("src");
const value = $clickedLi.find("img").attr("value");
const text = $clickedLi.text(); // 获取li的文本内容,更简洁
const item =
'<li>@@##@@<span>' + text + "</span></li>";
// 找到当前下拉框所属的.lang-select容器
const $parentLangSelect = $clickedLi.parents("div.lang-select");
// 更新按钮内容和值
$parentLangSelect.find(".btn-select").html(item);
$parentLangSelect.find(".btn-select").attr("value", value);
// 关闭当前下拉列表
$parentLangSelect.find(".b").toggle();
});
// 4. 按钮点击事件:切换下拉框的显示/隐藏状态,并关闭其他已打开的下拉框
$(".btn-select").click(function(event) {
event.stopPropagation(); // 阻止事件冒泡到document,防止立即关闭
const $currentBtn = $(this);
const $currentLangSelect = $currentBtn.parents("div.lang-select");
const $currentDropdown = $currentLangSelect.find(".b");
// 遍历所有下拉框,关闭非当前点击的下拉框
$(".box").each(function() {
const $otherLangSelect = $(this).find(".lang-select");
const $otherDropdown = $otherLangSelect.find(".b");
// 如果是其他下拉框且它当前是可见的,则关闭它
if (!$otherLangSelect.is($currentLangSelect) && $otherDropdown.is(':visible')) {
$otherDropdown.toggle();
}
});
// 切换当前下拉框的显示状态
$currentDropdown.toggle();
});
// 5. 存储和恢复选中状态 (可选功能,原代码中存在,此处保留但需完善)
// 注意:原代码中的langArray是局部变量,不能直接用于全局的localStorage操作。
// 若需实现此功能,应将选中值直接存入localStorage,并在初始化时根据值恢复。
/*
var sessionLang = localStorage.getItem("lang");
if (sessionLang) {
// 假设您需要根据sessionLang找到对应的item并设置
// 这需要更复杂的逻辑来匹配所有.box中的选项
}
*/
});jQuery逻辑详解:
通过上述HTML结构、CSS样式和jQuery逻辑的组合,我们成功地创建了带有图片显示的自定义下拉框组件,并解决了多实例独立操作时的交互冲突问题。
关键改进点和最佳实践:
通过遵循这些原则,您可以构建出更加健壮、用户体验更佳的自定义下拉框组件,并轻松管理页面上的多个实例。
以上就是使用jQuery创建带图片下拉框:解决多实例交互冲突问题的详细内容,更多请关注其它相关文章!
# 多个
# 网店网站推广营销
# seo优化师属于销售吗
# 贵州传统seo优化内容
# 线下seo
# 南宁seo网络推广费用
# 马鞍山企业营销推广中心
# 建材网站推广公司
# 合理的营销推广模式
# 莞城企业网站推广费用
# 抖音seo价钱如何
# 机上
# 新和
# 选择器
# 解决了
# 使其
# css
# 遍历
# 这是
# 自定义
# 下拉框
# css样式
# 作用域
# ai
# session
# 事件冒泡
# js
# html
# jquery
# java
# javascript
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
智慧职教mooc平台登录网址 智慧职教mooc官网直达
VS Code中的Tailwind CSS IntelliSense插件使用技巧
TikTok网页版入口快速访问 TikTok官网账号登录方法
C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较
漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口
《下一站江湖2》独孤剑诀习得方法
《U校园》学生登录入口2025
微信网页版在线登录 微信网页版在线使用入口
PHP安全加载非公开目录图片与动态内容类型处理指南
@Team是什么?揭秘团队含义
手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】
家里的小飞虫总是不断,用什么方法可以彻底根除?
风车动漫官网首页入口登录 风车动漫在线观看正版地址
word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法
mysql中外键约束如何使用_mysql FOREIGN KEY操作
《雷电模拟器》自动点击设置方法
《下一站江湖2》风神腿获取攻略
C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏
在Django单元测试中优雅处理信号:基于环境的条件执行策略
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
百度网盘如何设置上传限额
在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示
sublime text 4如何安装_最新版sublime下载与汉化教程
Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】
向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法
实现二叉树的层序插入:基于树大小的路径导航
《下一站江湖2》心法融合技巧
J*aScript实现下拉菜单驱动的动态表格数据展示
steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明
Eclipse开发J*a快速入门
Apple Music无故扣费引质疑
《爱南宁》认证电动车方法
win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】
哔哩哔哩在线观看入口 B站官网免费进入
如何在mysql中比较InnoDB和MyISAM区别
《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐
Django模型动态关联检查:高效管理复杂关系
Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例
2025SNH48年度青春盛典门票价格及购买方式
iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】
126手机126邮箱登录_126邮箱手机登录入口官网
如何在CSS中设置背景图像:一个全面指南
键盘声音异常怎么回事_键盘异响怎么处理
b站网页版入口 哔哩哔哩官方网站直接进入
《procreate》绘制渐变效果教程
word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法
跨语言测试实践:使用Python Selenium测试现有J*a Web项目
mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法
解决jQuery多计算器输入字段冲突的教程
教资成绩怎么查询
2025-10-07
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。