ui组件之input多选下拉实现方法(带有搜索功能)

下面是详细的攻略过程:

UI组件之Input多选下拉实现方法(带有搜索功能)

在前端开发中,多选下拉框是十分常见的一种UI组件。那么如何实现这样一个组件呢?接下来我们将使用HTML、CSS和JavaScript来实现一个具有搜索的多选下拉框。

1. HTML结构

首先,在HTML中,我们需要一个输入框和一个下拉框。下拉框中可以用列表展示选项。基本的HTML结构如下所示:

<div class="dropdown">
  <input type="text" class="dropdown-input" placeholder="请选择...">
  <ul class="dropdown-menu">
    <li><input type="checkbox" value="1">选项一</li>
    <li><input type="checkbox" value="2">选项二</li>
    <li><input type="checkbox" value="3">选项三</li>
    ...
  </ul>
</div>

2. CSS样式

为了美化UI,需要对下拉框进行样式设置。同时我们还要设置文字的显示长度、剩余文字省略号显示。CSS样式如下所示:

.dropdown {
  position: relative;
}

.dropdown .dropdown-input {
  width: 100%;
  padding: 8px;
  font-size: 14px;
  border: 1px solid #ccc;
  border-radius: 5px;
}

.dropdown .dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 9;
  min-width: 200px;
  max-height: 200px;
  overflow-y: auto;
  list-style: none;
  margin: 0;
  padding: 0;
  border: 1px solid #ccc;
  border-radius: 5px;
}

.dropdown .dropdown-menu li {
  padding: 8px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  cursor: pointer;
}

.dropdown .dropdown-menu li:hover {
  background-color: #f1f1f1;
}

.dropdown .dropdown-menu li input[type="checkbox"] {
  margin-right: 5px;
}

3. JavaScript代码实现

在JavaScript中,我们需要实现点击下拉框展开、收起,选项的选择和取消选择等功能。同时,还需要实现搜索功能,在输入框中输入文字时,动态过滤下拉框中的选项。

示例1:基本实现多选下拉框(没有搜索功能)

// 获取所有复选框元素
var checkboxes = document.querySelectorAll('.dropdown-menu input[type="checkbox"]');

// 下拉框元素
var dropdown = document.querySelector('.dropdown');
var menu = dropdown.querySelector('.dropdown-menu');
var input = dropdown.querySelector('.dropdown-input');

// 给下拉框元素添加点击事件
dropdown.addEventListener('click', function(e) {
  // 如果当前点击的区域是下拉框输入框或者下拉框内的元素,则不处理
  if (input.contains(e.target) || menu.contains(e.target)) {
    return;
  }
  // 隐藏下拉框
  menu.style.display = 'none';
});

// 给下拉框输入框添加点击事件
input.addEventListener('click', function(e) {
  // 显示下拉框
  menu.style.display = 'block';
  e.stopPropagation();
});

// 给下拉框中的每个复选框添加点击事件
for (var i = 0; i < checkboxes.length; i++) {
  checkboxes[i].addEventListener('click', function(e) {
    e.stopPropagation();
  });
}

// 监听所有复选框的状态改变,更新下拉框输入框中的文本内容
for (var i = 0; i < checkboxes.length; i++) {
  checkboxes[i].addEventListener('change', function(e) {
    var checkedArr = [];
    for (var j = 0; j < checkboxes.length; j++) {
      if (checkboxes[j].checked) {
        checkedArr.push(checkboxes[j].parentNode.innerText.trim());
      }
    }
    input.value = '';
    if (checkedArr.length) {
      input.value = checkedArr.join(', ');
    } else {
      input.placeholder = '请选择...';
    }
  });
}

示例2:实现多选下拉框(带有搜索功能)

// 获取所有复选框元素
var checkboxes = document.querySelectorAll('.dropdown-menu input[type="checkbox"]');

// 下拉框元素
var dropdown = document.querySelector('.dropdown');
var menu = dropdown.querySelector('.dropdown-menu');
var input = dropdown.querySelector('.dropdown-input');

// 给下拉框元素添加点击事件
dropdown.addEventListener('click', function(e) {
  // 如果当前点击的区域是下拉框输入框或者下拉框内的元素,则不处理
  if (input.contains(e.target) || menu.contains(e.target)) {
    return;
  }
  // 隐藏下拉框
  menu.style.display = 'none';
});

// 给下拉框输入框添加点击事件
input.addEventListener('click', function(e) {
  // 显示下拉框
  menu.style.display = 'block';
  e.stopPropagation();
});

// 给下拉框输入框添加键盘输入事件
input.addEventListener('input', function(e) {
  var searchText = input.value.trim().toLowerCase();
  for (var i = 0; i < checkboxes.length; i++) {
    // 如果搜索框中的文字为空,则显示所有选项
    if (!searchText) {
      checkboxes[i].parentNode.style.display = 'block';
    } else {
      // 否则根据搜索框中的文字动态匹配选项,并显示对应选项
      var text = checkboxes[i].parentNode.innerText.trim().toLowerCase();
      if (text.indexOf(searchText) < 0) {
        checkboxes[i].parentNode.style.display = 'none';
      } else {
        checkboxes[i].parentNode.style.display = 'block';
      }
    }
  }
});

// 给下拉框中的每个复选框添加点击事件
for (var i = 0; i < checkboxes.length; i++) {
  checkboxes[i].addEventListener('click', function(e) {
    e.stopPropagation();
  });
}

// 监听所有复选框的状态改变,更新下拉框输入框中的文本内容
for (var i = 0; i < checkboxes.length; i++) {
  checkboxes[i].addEventListener('change', function(e) {
    var checkedArr = [];
    for (var j = 0; j < checkboxes.length; j++) {
      if (checkboxes[j].checked) {
        checkedArr.push(checkboxes[j].parentNode.innerText.trim());
      }
    }
    input.value = '';
    if (checkedArr.length) {
      input.value = checkedArr.join(', ');
    } else {
      input.placeholder = '请选择...';
    }
  });
}

通过以上的代码实现,我们可以完成一个基本的多选下拉框,并且还可以添加搜索功能,可以方便地筛选选项,提高UI的灵活性和用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ui组件之input多选下拉实现方法(带有搜索功能) - Python技术站

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

相关文章

  • a标签的四个css伪类(link、visited、hover、active)样式理解

    下面是关于“a标签的四个css伪类(link、visited、hover、active)样式理解”的完整攻略: 1. 前置知识 在讲解a标签的四个伪类之前,需要先了解以下几个概念: 链接:一般指用a标签包裹的文本或图像,点击后可以跳转到其他页面或下载文件等。 链接状态:一般包括以下四种状态:link(链接的初始状态)、visited(已经被访问过)、hove…

    css 2023年6月9日
    00
  • 使用font-face改变字体即加载外部字体

    使用@font-face规则可以在网页中加载外部字体,从而改变网页中的文本字体,并且让文本在任何设备上都显示一致。以下是使用@font-face规则加载外部字体的完整攻略: 步骤一:选择字体文件 选择适合自己网站风格的字体文件,并确保其版权合法。常见的字体类型有TTF、OTF、WOFF等。 步骤二:在样式表中声明@font-face规则 在网站样式表中声明@…

    css 2023年6月9日
    00
  • 基于jQuery实现select下拉选择可输入附源码下载

    为了实现“基于jQuery实现select下拉选择可输入”,需要在HTML页面中增加以下代码结构: <label for="select-input">下拉选择可输入:</label> <select id="select-input" name="select-input&qu…

    css 2023年6月11日
    00
  • CSS教程:认识层叠规则互相作用

    下面给您详细讲解 “CSS教程:认识层叠规则互相作用” 的完整攻略: 1. CSS层叠 层叠是CSS的一个特性,表示CSS属性的值可以堆叠起来形成最终的渲染效果,这种渲染效果反映了CSS选择器的优先级。选择器优先级越高,对应的CSS属性值就越具有优先权,就会覆盖掉优先级较低的值。 2. CSS选择器优先级 CSS选择器优先级是用来确定哪个CSS规则应该应用到…

    css 2023年6月9日
    00
  • 三步用CSS写一个商城卡券

    以下是关于“三步用CSS写一个商城卡券”的完整攻略,包含两个示例说明。 步骤一:创建HTML结构 首先,需要创建一个HTML结构。可以按照以下步骤操作: 在文本编辑器中创建一个新文件。 在文件中添加以下代码: <div class="coupon"> <div class="coupon-header&quot…

    css 2023年5月18日
    00
  • 关于CSS中的display:table-cell使用技巧的几种应用

    关于CSS中的display:table-cell使用技巧的几种应用 在CSS中,display:table-cell这一属性用法非常广泛,它可以帮助我们快速实现一些表格布局的效果,也可以实现一些类似于flex布局一样的特殊布局效果,下面我们详细介绍一下这一属性的几种常见用法: 1. 实现响应式的3等分宽度布局 通过使用display:table-cell属…

    css 2023年6月10日
    00
  • 用 CSS background 实现刻度线的呈现

    用 CSS background 实现刻度线的呈现,可以通过利用相关CSS属性和技巧实现,下面是具体步骤: 步骤一: 制作刻度线图案 首先,我们需要建立一个背景图案作为刻度线,具体制作方法如下: 通过ps或者其他图片编辑工具,建立一个宽度为1像素、高度为10像素的透明背景图片。 分成两个部分,一个是白色刻度线,一个是灰色背景,分别涂上颜色。 将两个部分分别保…

    css 2023年6月9日
    00
  • CSS定义超链接样式的顺序及四个伪类的用法示例介绍

    下面是关于“CSS定义超链接样式的顺序及四个伪类的用法示例介绍”的完整攻略: 一、CSS定义超链接样式的顺序 在HTML中,超链接是通过<a>标签来实现的。想要修改超链接的样式,就要使用CSS。在CSS中,我们可以通过以下顺序来定义超链接的样式,这个顺序可以确保我们的样式能够按照我们想要的方式生效。 定义超链接的状态(link、visited、h…

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