You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用HTML和JS/JQuery实现图中所示的多选下拉组件?

多选组件实现方案

核心功能实现逻辑

  • 组件分为两个核心区域:输入展示区、下拉选项区
  • 点击输入展示区触发下拉选项区的显示/隐藏切换
  • 维护一个已选选项数组,每次选中新选项时更新该数组
  • 渲染下拉列表时,判断当前选项是否存在于已选数组中,存在则添加disabled禁用样式与状态
  • 输入展示区动态渲染已选数组内的所有选项,支持单独删除已选条目

前端核心代码示例(Vue3 版本)

<template>
  <div class="multi-select">
    <!-- 输入展示区 -->
    <div class="select-input" @click="showDropdown = !showDropdown">
      <span v-for="item in selectedList" :key="item.value" class="selected-tag">
        {{ item.label }}
        <span @click.stop="removeSelect(item.value)">×</span>
      </span>
      <span class="placeholder" v-if="selectedList.length === 0">请选择选项</span>
    </div>
    <!-- 下拉选项区 -->
    <div class="dropdown" v-if="showDropdown">
      <div 
        v-for="item in optionList" 
        :key="item.value" 
        class="dropdown-item"
        :class="{ disabled: selectedList.some(s => s.value === item.value) }"
        @click="selectOption(item)"
      >
        {{ item.label }}
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
// 模拟选项数据,可根据实际业务替换
const optionList = ref([
  { label: '选项1', value: 1 },
  { label: '选项2', value: 2 },
  { label: '选项3', value: 3 },
  { label: '选项4', value: 4 }
])
const selectedList = ref([])
const showDropdown = ref(false)

// 选中选项逻辑
const selectOption = (item) => {
  if (selectedList.value.some(s => s.value === item.value)) return
  selectedList.value.push(item)
}

// 移除已选选项逻辑
const removeSelect = (value) => {
  selectedList.value = selectedList.value.filter(s => s.value !== value)
}
</script>

<style scoped>
.multi-select {
  width: 300px;
  position: relative;
}
.select-input {
  min-height: 36px;
  border: 1px solid #dcdfe6;
  border-radius: 4px;
  padding: 4px 8px;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
  cursor: pointer;
}
.selected-tag {
  background: #ecf5ff;
  color: #409eff;
  padding: 2px 6px;
  border-radius: 2px;
  font-size: 12px;
  display: flex;
  align-items: center;
  gap: 4px;
}
.selected-tag span {
  cursor: pointer;
}
.placeholder {
  color: #909399;
}
.dropdown {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  border: 1px solid #dcdfe6;
  border-radius: 4px;
  margin-top: 4px;
  max-height: 200px;
  overflow-y: auto;
  background: #fff;
  z-index: 999;
}
.dropdown-item {
  padding: 8px 12px;
  cursor: pointer;
}
.dropdown-item:hover {
  background: #f5f7fa;
}
.dropdown-item.disabled {
  color: #c0c4cc;
  cursor: not-allowed;
  background: #f5f7fa;
}
</style>

上述实现逻辑不依赖特定框架,原生JS、React等技术栈都可以参考该思路复现相同效果。

内容的提问来源于stack exchange,提问作者Nyxshield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:15:04