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日

相关文章

  • MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    让我来详细讲解一下“MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)”这篇文章的完整攻略。 标题 文章的标题是“MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)”,它包含了文章主要讲解的内容。在标题中,我们可以看到文章主要是讲解如何使用MyBatis进行自查询,使用递归实现N级联动效果,并且有两种实现方式。 简介 在文章的开头…

    Java 2023年5月19日
    00
  • SpringBoot +DynamicDataSource切换多数据源的全过程

    下面将为你介绍SpringBoot + DynamicDataSource切换多数据源的全过程。 1. 需求分析 在实际应用场景中,一个系统需要连接多个数据库的情况是十分常见的。SpringBoot + DynamicDataSource可以帮助我们方便地实现这一需求,通过对数据源进行动态切换,实现对多个数据库的访问。 2. 技术方案 SpringBoot是…

    Java 2023年5月20日
    00
  • Spring Boot异步线程间数据传递的四种方式

    下面让我来详细解释一下Spring Boot异步线程间数据传递的四种方式。 1. 使用CompletableFuture CompletableFuture是Java8中推出的异步编程API,可以很好的处理异步任务,同时也提供了一些方法来实现线程间的数据传递。 使用CompletableFuture来传递数据,主要有以下两个方法: CompletableFu…

    Java 2023年5月26日
    00
  • Java编程实现获取当前代码行行号的方法示例

    在讲解“Java编程实现获取当前代码行行号的方法示例”的完整攻略之前,我们先来了解一下所涉及的相关概念: 首先,所谓的行号(line number),就是指代码中每一行所对应的编号。在Java代码中,每个代码文件都有其独立的行号,而且每行都是有编号的。 其次,获取行号有两种常用的方法: 1.使用StackTraceElement类中的getLineNumbe…

    Java 2023年5月26日
    00
  • Spring Boot 启动、停止、重启、状态脚本

    Spring Boot启动、停止、重启、状态脚本的完整攻略 Spring Boot是一个非常流行的Java Web框架,它提供了许多方便的功能,如自配置、快速开发和易于部署。在本文中,我们将介绍如何编写Spring Boot的启动、停止、重启和状态脚本,并提供两个示例。 示例一:使用systemd编写脚本 systemd是一个Linux系统的初始化系统和服务…

    Java 2023年5月15日
    00
  • 常见的Java安全漏洞有哪些?

    常见的Java安全漏洞 Java在发展过程中,也出现了很多安全漏洞。下面是一些常见的Java安全漏洞: 1. SQL注入漏洞 SQL注入漏洞指的是攻击者利用应用程序中没有对用户输入的SQL语句参数进行验证或转义,从而在应用程序中执行恶意的SQL语句。 示例: 假设有一个查询用户姓名的SQL语句: String sql = "SELECT * FRO…

    Java 2023年5月11日
    00
  • 基于Java设计一个短链接生成系统

    下面是详细讲解“基于Java设计一个短链接生成系统”的完整攻略: 1. 确定技术选型 短链接生成系统需要对 URL 进行加密编码,使其变成一个相对短且不易被外界猜测的字符串,而 Java 编程语言具有稳定的运行性能、丰富的第三方框架和库支持,因此选择 Java 作为系统的开发语言,而相对简单易用的 spring-boot 框架作为主要开发工具。 2. 简化开…

    Java 2023年5月24日
    00
  • Java解析json报文实例解析

    下面我来详细讲解“Java解析json报文实例解析”的完整攻略,包含以下几个步骤: 1. 基础知识 在进行 Java 解析 JSON 报文之前,需要先掌握一些基础知识,包括: 什么是 JSON?JSON 是一种轻量级的数据交换格式,可以被多种编程语言解析。 JSON 数据结构:JSON 由键值对或数组组成。 Java 解析 JSON 的库:常用的有 Jack…

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