JS+DIV+CSS实现仿表单下拉列表效果

下面是JS+DIV+CSS实现仿表单下拉列表效果的完整攻略:

一、实现思路

  1. 在HTML中定义一个表单元素
  2. 使用CSS美化表单元素的样式
  3. 使用JavaScript控制下拉列表的显示与隐藏,并将选中的值显示到表单元素中

二、具体实现步骤

1. HTML结构

在HTML中定义一个表单元素,并使用div元素模拟下拉列表的选项:

<div class="dropdown">
  <input type="hidden" name="city">
  <div class="dropdown-menu">
    <div class="dropdown-item" data-value="bj">北京</div>
    <div class="dropdown-item" data-value="sh">上海</div>
    <div class="dropdown-item" data-value="gz">广州</div>
    <div class="dropdown-item" data-value="sz">深圳</div>
  </div>
</div>

其中,dropdown类名用于控制下拉列表的样式,dropdown-menu类名用于控制下拉列表选项的样式,dropdown-item类名用于控制每个选项的样式。

input元素的type属性为hidden,用于隐藏输入框,实际表单值将通过JavaScript获取选中的值进行赋值。

2. CSS样式

通过CSS设置表单元素的外观并控制下拉列表的显示与隐藏,以下是dropdowndropdown-menu的样式:

.dropdown {
  position: relative;
  width: 120px;
  height: 26px;
  border-radius: 3px;
  border: 1px solid #ccc;
}

.dropdown:hover {
  border-color: #888;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  display: none;
  z-index: 999;
  width: 100%;
  border: 1px solid #ccc;
  border-radius: 3px;
  background-color: #fff;
}

.dropdown-menu.show {
  display: block;
}

其中,dropdown的样式设置了宽度、高度、边框样式及圆角效果,并且鼠标移动到表单上时会改变边框的颜色。

dropdown-menu的样式设置了绝对定位,隐藏选项列表,同时设置了z-index属性以保证下拉列表在其他元素上面。同时还设置了边框、圆角以及背景颜色。在选中表单元素并且鼠标移动到下拉列表时,会显示出选项列表,这个效果通过为dropdown-menu添加show类名来实现。

以下是dropdown-item的样式:

.dropdown-item {
  padding: 5px;
  cursor: pointer;
}

.dropdown-item:hover {
  background-color: #f5f5f5;
}

所有选项都共用同一个类名,并且设置了内边距和鼠标样式。当鼠标移动到选项上时,该选项的背景颜色会发生改变。

3. JavaScript交互

在JavaScript中,通过添加事件监听器来控制下拉列表的显示与隐藏,并且在选中某个选项时,将该选项的值赋值给表单元素。

var dropdown = document.querySelector('.dropdown');
var input = dropdown.querySelector('input[type=hidden]');
var menu = dropdown.querySelector('.dropdown-menu');

// 显示下拉列表
function showMenu() {
  menu.classList.add('show');
}

// 隐藏下拉列表
function hideMenu() {
  menu.classList.remove('show');
}

// 选中某个选项
function selectItem(item) {
  input.value = item.dataset.value;
  dropdown.querySelector('.dropdown-value').textContent = item.textContent;
  hideMenu();
}

// 事件监听
dropdown.addEventListener('click', function() {
  if (menu.classList.contains('show')) {
    hideMenu();
  } else {
    showMenu();
  }
});

menu.addEventListener('click', function(e) {
  if (e.target.classList.contains('dropdown-item')) {
    selectItem(e.target);
  }
});

document.addEventListener('click', function(e) {
  if (!dropdown.contains(e.target)) {
    hideMenu();
  }
});

首先通过querySelector方法获取表单元素、下拉列表及选项元素。在showMenuhideMenu方法中,通过添加/移除show类名来控制下拉列表的显示与隐藏。在选中某个选项时,将该选项的值赋值给表单元素并将选项的文本内容赋值给下拉列表的显示区域,然后再隐藏下拉列表。

最后通过事件监听器来实现以下功能:

  • 点击表单时显示/隐藏下拉列表
  • 点击选项时选中该选项并隐藏下拉列表
  • 点击页面中的其他任意位置时隐藏下拉列表

4. 示例1

以下是一个简单的示例,实现了对性别的选择:

<div class="dropdown">
  <input type="hidden" name="gender">
  <div class="dropdown-value">请选择性别</div>
  <div class="dropdown-menu">
    <div class="dropdown-item" data-value="male">男</div>
    <div class="dropdown-item" data-value="female">女</div>
  </div>
</div>
.dropdown {
  position: relative;
  width: 120px;
  height: 26px;
  border-radius: 3px;
  border: 1px solid #ccc;
}

.dropdown:hover {
  border-color: #888;
}

.dropdown-value {
  padding: 5px;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  display: none;
  z-index: 999;
  width: 100%;
  border: 1px solid #ccc;
  border-radius: 3px;
  background-color: #fff;
}

.dropdown-menu.show {
  display: block;
}

.dropdown-item {
  padding: 5px;
  cursor: pointer;
}

.dropdown-item:hover {
  background-color: #f5f5f5;
}
var dropdown = document.querySelector('.dropdown');
var input = dropdown.querySelector('input[type=hidden]');
var menu = dropdown.querySelector('.dropdown-menu');

function showMenu() {
  menu.classList.add('show');
}

function hideMenu() {
  menu.classList.remove('show');
}

function selectItem(item) {
  input.value = item.dataset.value;
  dropdown.querySelector('.dropdown-value').textContent = item.textContent;
  hideMenu();
}

dropdown.addEventListener('click', function() {
  if (menu.classList.contains('show')) {
    hideMenu();
  } else {
    showMenu();
  }
});

menu.addEventListener('click', function(e) {
  if (e.target.classList.contains('dropdown-item')) {
    selectItem(e.target);
  }
});

document.addEventListener('click', function(e) {
  if (!dropdown.contains(e.target)) {
    hideMenu();
  }
});

5. 示例2

以下是一个扩展的示例,实现了对城市的选择:

<div class="dropdown">
  <input type="hidden" name="city">
  <div class="dropdown-value">请选择城市</div>
  <div class="dropdown-menu">
    <div class="dropdown-header">ABCD</div>
    <div class="dropdown-item" data-value="bj">北京</div>
    <div class="dropdown-item" data-value="cq">重庆</div>
    <div class="dropdown-item" data-value="cd">成都</div>
    <div class="dropdown-header">EFGH</div>
    <div class="dropdown-item" data-value="fs">佛山</div>
    <div class="dropdown-item" data-value="gz">广州</div>
    <div class="dropdown-item" data-value="wh">武汉</div>
    <div class="dropdown-header">IJKL</div>
    <div class="dropdown-item" data-value="jn">济南</div>
    <div class="dropdown-item" data-value="ly">洛阳</div>
    <div class="dropdown-item" data-value="lz">兰州</div>
    <div class="dropdown-header">MNOP</div>
    <div class="dropdown-item" data-value="sh">上海</div>
    <div class="dropdown-item" data-value="sz">深圳</div>
    <div class="dropdown-header">QRST</div>
    <div class="dropdown-item" data-value="tj">天津</div>
    <div class="dropdown-header">UVWX</div>
    <div class="dropdown-item" data-value="xa">西安</div>
    <div class="dropdown-item" data-value="xm">厦门</div>
  </div>
</div>
.dropdown {
  position: relative;
  width: 120px;
  height: 26px;
  border-radius: 3px;
  border: 1px solid #ccc;
}

.dropdown:hover {
  border-color: #888;
}

.dropdown-value {
  padding: 5px;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  display: none;
  z-index: 999;
  width: 180px;
  border: 1px solid #ccc;
  border-radius: 3px;
  background-color: #fff;
}

.dropdown-menu.show {
  display: block;
}

.dropdown-header {
  padding: 3px 5px;
  font-weight: bold;
  color: #999;
}

.dropdown-item {
  padding: 5px;
  cursor: pointer;
}

.dropdown-item:hover {
  background-color: #f5f5f5;
}
var dropdown = document.querySelector('.dropdown');
var input = dropdown.querySelector('input[type=hidden]');
var menu = dropdown.querySelector('.dropdown-menu');
var headers = menu.querySelectorAll('.dropdown-header');

function showMenu() {
  menu.classList.add('show');
}

function hideMenu() {
  menu.classList.remove('show');
}

function selectItem(item) {
  input.value = item.dataset.value;
  dropdown.querySelector('.dropdown-value').textContent = item.textContent;
  hideMenu();
}

dropdown.addEventListener('click', function() {
  if (menu.classList.contains('show')) {
    hideMenu();
  } else {
    showMenu();
  }
});

menu.addEventListener('click', function(e) {
  if (e.target.classList.contains('dropdown-item')) {
    selectItem(e.target);
  }
});

document.addEventListener('click', function(e) {
  if (!dropdown.contains(e.target)) {
    hideMenu();
  }
});

// 添加头部字母索引
for (var i = 0; i < headers.length; i++) {
  var prev = headers[i].previousElementSibling;
  var next = headers[i].nextElementSibling;
  while (next && !next.classList.contains('dropdown-header')) {
    next.dataset.header = headers[i].textContent;
    next = next.nextElementSibling;
  }
  if (prev) {
    prev.dataset.header = headers[i].textContent;
  }
}

与示例1相比,这个示例添加了一个新的头部标题,用于将所有选项按字母进行分类并索引。这个示例中,需要单独处理每个头部元素和它下面的选项,将它们的data-header属性设置为该头部元素的文本内容。通过这种方式,处理好索引信息后,可以选择给所有选项添加相应的字母索引等附加功能。

三、总结

通过以上步骤和示例,我们可以简单地实现一个基于JS+DIV+CSS的仿表单下拉列表效果。可以根据具体需要,通过修改CSS样式、HTML结构和JavaScript代码等实现更多的交互效果和附加功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS+DIV+CSS实现仿表单下拉列表效果 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java序列化的作用是什么?

    Java序列化是指将Java对象转换为字节流的过程,以便将其存储在文件中、在网络上传输或将其传递给其他进程。Java序列化的作用是可以在不同的系统和平台之间传输对象,使其具有通用性和可重用性。 在Java中,我们可以使用Serializable接口将一个对象序列化为字节流,然后在需要时将其重新反序列化回到原始对象。以下是使用Java序列化的几个步骤: 实现可…

    Java 2023年5月11日
    00
  • 微信小程序 免费SSL证书https、TLS版本问题的解决办法

    针对“微信小程序 免费SSL证书https、TLS版本问题的解决办法”,我提供如下完整攻略。 什么是SSL证书和TLS版本 SSL证书可以理解为电子商务网站的身份证,用于证明网站的身份,并通过加密通讯来保护信息不被窃取。而TLS是SSL的升级版本,用于加密网络连接,并确保数据的完整性和机密性。 微信小程序使用SSL证书和TLS版本的必要性 微信小程序要求所有…

    Java 2023年5月23日
    00
  • springsecurity基于token的认证方式

    下面我将详细讲解一下“Spring Security基于Token的认证方式”的完整攻略。 什么是Token认证方式 Token认证方式,是一种基于令牌(Token)的身份认证方式。在客户端成功登录后,服务端会生成一个Token,这个Token会放到HTTP响应头中或者响应体中返回给客户端,客户端需要在后续的请求中携带该Token才能访问资源。 Token认…

    Java 2023年5月20日
    00
  • SpringBoot入坑笔记之spring-boot-starter-web 配置文件的使用

    SpringBoot入坑笔记之spring-boot-starter-web配置文件的使用 在Spring Boot中,我们可以使用spring-boot-starter-web依赖来快速构建Web应用程序。在本文中,我们将介绍如何使用spring-boot-starter-web依赖,并提供两个示例。 添加依赖 在pom.xml文件中添加以下依赖: &lt…

    Java 2023年5月15日
    00
  • maven下载依赖失败问题及解决

    下面我将为您提供一份“maven下载依赖失败问题及解决”的详细攻略。 问题描述 在使用maven构建项目时,有时候会遇到下载依赖失败的问题。常见的问题包括: 网络连接问题,导致无法从中央仓库下载依赖 依赖库的版本问题,某些依赖库有可能被废弃或者过时 仓库不稳定或者无法访问 解决方法 针对上述问题,我们可以采取以下措施解决: 1. 检查网络连接 网络连接不畅或…

    Java 2023年5月20日
    00
  • 创建一个空的IBM DB2 ECO数据库的方法

    创建一个空的 IBM DB2 ECO 数据库需要按照以下步骤进行: 步骤一:打开 IBM DB2 数据库控制台 首先需要在 IBM DB2 数据库控制台中打开一个空的命令行窗口。在控制台菜单栏选择“工具”->“命令行窗口”,或者使用快捷键“Alt+F2”打开空的命令行窗口。 步骤二:连接到 IBM DB2 数据库实例 在打开的命令行窗口中输入以下命令,…

    Java 2023年6月15日
    00
  • 高价值Java多线程面试题分析

    高价值Java多线程面试题分析攻略 1. 多线程基础知识 在面试过程中,多线程基础知识往往是被考查的重点。这里列举一些常见的面试题: 如何创建线程? 线程的状态有哪些? 线程安全是什么? synchronized和ReentrantLock的区别? wait()和sleep()的区别? volatile关键字的作用? 对于这些问题,我们要明确掌握线程的基本概…

    Java 2023年5月19日
    00
  • 常见的垃圾收集器算法有哪些?

    常见的垃圾收集器算法有哪些? 在大部分编程语言中,动态内存分配是必不可少的。为了防止内存泄漏,需要进行垃圾回收(Garbage Collection,简称GC),即在进行垃圾回收时收集并释放不再需要使用的存储器资源,在内存使用过多而导致程序出现异常时,垃圾回收是很重要的。而垃圾回收主要有2类算法 — 标记-清扫(Mark and Sweep)和复制式(Cop…

    Java 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部