如何在 Select Option 中使用 Checkbox

IT技术 javascript html css html-select
2021-01-23 04:23:00

客户给了我一个设计,它有一个 Select Option 菜单,其中包含一个复选框以及项目名称作为列表中的单个项目。无论如何可以在“选择选项”菜单中添加一个复选框?

注意:开发者需要添加自己的 id 才能使菜单生效,如果可能的话,我只需要 HTML CSS 代码。

6个回答

您不能在 select 元素中放置复选框,但您可以通过使用 HTML、CSS 和 JavaScript 获得相同的功能。这是一个可能的工作解决方案。解释如下。

在此处输入图片说明


代码:

var expanded = false;

function showCheckboxes() {
  var checkboxes = document.getElementById("checkboxes");
  if (!expanded) {
    checkboxes.style.display = "block";
    expanded = true;
  } else {
    checkboxes.style.display = "none";
    expanded = false;
  }
}
.multiselect {
  width: 200px;
}

.selectBox {
  position: relative;
}

.selectBox select {
  width: 100%;
  font-weight: bold;
}

.overSelect {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
}

#checkboxes {
  display: none;
  border: 1px #dadada solid;
}

#checkboxes label {
  display: block;
}

#checkboxes label:hover {
  background-color: #1e90ff;
}
<form>
  <div class="multiselect">
    <div class="selectBox" onclick="showCheckboxes()">
      <select>
        <option>Select an option</option>
      </select>
      <div class="overSelect"></div>
    </div>
    <div id="checkboxes">
      <label for="one">
        <input type="checkbox" id="one" />First checkbox</label>
      <label for="two">
        <input type="checkbox" id="two" />Second checkbox</label>
      <label for="three">
        <input type="checkbox" id="three" />Third checkbox</label>
    </div>
  </div>
</form>

解释:

首先,我们创建一个显示文本“选择一个选项”的选择元素,以及覆盖(重叠)选择元素 ( <div class="overSelect">) 的空元素我们不希望用户点击选择元素——它会显示一个空的选项。要将元素与其他元素重叠,我们使用 CSS position 属性,其值为 relative | 绝对。

为了添加功能,我们指定了一个 JavaScript 函数,当用户单击包含我们的 select 元素 ( <div class="selectBox" onclick="showCheckboxes()">)的 div 时调用该函数

我们还创建了包含复选框的 div 并使用 CSS 为其设置样式。上面提到的 JavaScript 函数只是将<div id="checkboxes">CSS 显示属性的值从“none”更改为“block”,反之亦然。

该解决方案在以下浏览器中进行了测试:Internet Explorer 10、Firefox 34、Chrome 39。浏览器需要启用 JavaScript。


更多信息:

CSS定位

如何将一个 div 覆盖在另一个 div 上

http://www.w3schools.com/css/css_positioning.asp

CSS 显示属性

http://www.w3schools.com/cssref/pr_class_display.asp

仅供参考:如果需要修改多个选择列表,则此解决方案将需要更多的努力。我建议使用一些积极维护的插件。
2021-03-13 04:23:00
但是当我们在外面点击时如何隐藏下拉菜单?
2021-03-26 04:23:00
我们可以显示选定的项目吗?
2021-04-03 04:23:00
当用户选择任何选项时,选择框也不会消失
2021-04-04 04:23:00
这个答案很棒,对我有用。然而,我对其进行了一项改进。而不是overselect可能在我使用的复杂界面中导致一些问题div <option selected hidden>Select an option</option>它可能不是最好的用途,hidden但它有效。
2021-04-06 04:23:00

迄今为止最好的插件是Bootstrap Multiselect

编辑:我很久以前写过这个。我不再推荐使用 jQuery。你应该学习一个响应式框架,比如 Vue.js、React 或 Angular,在那里你有很多module可供选择。我相信你会找到你需要的。例如,从快速的 Google 搜索中找到了这个

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<title>jQuery Multi Select Dropdown with Checkboxes</title>

<link rel="stylesheet" href="css/bootstrap-3.1.1.min.css" type="text/css" />
<link rel="stylesheet" href="css/bootstrap-multiselect.css" type="text/css" />

<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js"></script>
<script type="text/javascript" src="js/bootstrap-3.1.1.min.js"></script>
<script type="text/javascript" src="js/bootstrap-multiselect.js"></script>

</head>

<body>

<form id="form1">

<div style="padding:20px">

<select id="chkveg" multiple="multiple">
    
    <option value="cheese">Cheese</option>
    <option value="tomatoes">Tomatoes</option>
    <option value="mozarella">Mozzarella</option>
    <option value="mushrooms">Mushrooms</option>
    <option value="pepperoni">Pepperoni</option>
    <option value="onions">Onions</option>

</select>

<br /><br />

<input type="button" id="btnget" value="Get Selected Values" />

<script type="text/javascript">

$(function() {
    
    $('#chkveg').multiselect({
        
        includeSelectAllOption: true
    });
    
    $('#btnget').click(function(){
        
        alert($('#chkveg').val());
    });
});

</script>

</div>

</form>

</body>
</html>

这是一个演示:

$(function() {

  $('#chkveg').multiselect({
    includeSelectAllOption: true
  });

  $('#btnget').click(function() {
    alert($('#chkveg').val());
  });
});
.multiselect-container>li>a>label {
  padding: 4px 20px 3px 20px;
}
<link href="https://unpkg.com/bootstrap@3.3.2/dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://unpkg.com/jquery@3.3.1/dist/jquery.min.js"></script>
<script src="https://unpkg.com/bootstrap@3.3.2/dist/js/bootstrap.min.js"></script>
<script src="https://unpkg.com/bootstrap-multiselect@0.9.13/dist/js/bootstrap-multiselect.js"></script>
<link href="https://unpkg.com/bootstrap-multiselect@0.9.13/dist/css/bootstrap-multiselect.css" rel="stylesheet"/>

<form id="form1">
  <div style="padding:20px">

    <select id="chkveg" multiple="multiple">
      <option value="cheese">Cheese</option>
      <option value="tomatoes">Tomatoes</option>
      <option value="mozarella">Mozzarella</option>
      <option value="mushrooms">Mushrooms</option>
      <option value="pepperoni">Pepperoni</option>
      <option value="onions">Onions</option>
    </select>
    
    <br /><br />

    <input type="button" id="btnget" value="Get Selected Values" />
  </div>
</form>

@Erbureth 演示中的外部脚本/样式表路径已过时(死链接)。我更新了网址以修复它。
2021-03-13 04:23:00
我知道我可以使用 HTML 多选选项,但我发现它丑陋且用户友好。
2021-03-16 04:23:00
我喜欢这个插件的行为,但想在没有引导的情况下使用它......有什么类似的吗?
2021-03-17 04:23:00
这个插件太有问题了……他们有 150 个未解决的问题,维护者说他没有时间。所以在一些问题之后我切换到接受的答案和 vue
2021-03-24 04:23:00
您不需要为您的解决方案使用这么多库。您可以只使用常规的 HTML 多选选项。谢谢!
2021-03-25 04:23:00

对于纯 CSS方法,您可以将:checked选择器与::before选择器结合使用来内联条件内容。

只需将该类添加select-checkbox到您的select元素并包含以下 CSS:

.select-checkbox option::before {
  content: "\2610";
  width: 1.3em;
  text-align: center;
  display: inline-block;
}
.select-checkbox option:checked::before {
  content: "\2611";
}

您可以使用普通的旧 unicode 字符(带有转义的十六进制编码),如下所示:

或者,如果你想给事情加点料,你可以使用这些FontAwesome字形

截屏

jsFiddle & Stack Snippets 中的演示

注意但是要注意 IE 兼容性问题

@vsync,您能否详细说明您遇到的问题,甚至可以分叉并附上屏幕截图。这里的目标是应用于一个<select multiple>元素,所以这应该是预期的用例。CSS 选择器应特定于应用该类,因此您决定通过应用.select-checkbox该类在单个元素上使用
2021-03-21 04:23:00
@LalitRajput,当然,所有浏览器中所有多选控件的默认交互设计。我同意这有点古怪或不直观。如果需要,您总是可以找到覆盖该默认行为的方法如何避免使用 Javascript 在多选框中按 ctrl-click 的需要?- 看到这个更新的小提琴
2021-03-23 04:23:00
multiple属性使<select>外观看起来像一个框而不是下拉列表时,这是一个问题......
2021-04-03 04:23:00
如果您正在寻找纯 CSS 方法,强烈推荐这个优雅的解决方案。
2021-04-03 04:23:00
@KyleMit 不错的解决方案!!!但问题是如果我想选择多个项目,那么我必须像使用简单的选择元素一样使用 Ctrl 按钮。
2021-04-03 04:23:00

尝试multi-select,尤其是multiple-items看起来是非常干净和管理的解决方案,有大量的例子。也可以查看源码。

<div>
  <div class="form-group row">
    <label class="col-sm-2">
      Basic Select
    </label>

    <div class="col-sm-10">
      <select multiple="multiple">
        <option value="1">1</option>
        <option value="2">2</option>
      </select>
    </div>
  </div>

  <div class="form-group row">
    <label class="col-sm-2">
      Group Select
    </label>

    <div class="col-sm-10">
      <select multiple="multiple">
        <optgroup label="Group 1">
          <option value="1">1</option>
          <option value="2">2</option>
        </optgroup>
        <optgroup label="Group 2">
          <option value="6">6</option>
          <option value="7">7</option>
        </optgroup>
        <optgroup label="Group 3">
          <option value="11">11</option>
          <option value="12">12</option>
        </optgroup>
      </select>
    </div>
  </div>
</div>

<script>
  $(function() {
    $('select').multipleSelect({
      multiple: true,
      multipleWidth: 60
    })
  })
</script>
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会无效。-来自评论
2021-04-10 04:23:00

我从@vitfo 答案开始,但我想在<option>里面<select>而不是复选框输入,所以我把所有的答案放在一起,这是我的代码,我希望它能帮助别人。

$(".multiple_select").mousedown(function(e) {
    if (e.target.tagName == "OPTION") 
    {
      return; //don't close dropdown if i select option
    }
    $(this).toggleClass('multiple_select_active'); //close dropdown if click inside <select> box
});
$(".multiple_select").on('blur', function(e) {
    $(this).removeClass('multiple_select_active'); //close dropdown if click outside <select>
});
	
$('.multiple_select option').mousedown(function(e) { //no ctrl to select multiple
    e.preventDefault(); 
    $(this).prop('selected', $(this).prop('selected') ? false : true); //set selected options on click
    $(this).parent().change(); //trigger change event
});

	
	$("#myFilter").on('change', function() {
      var selected = $("#myFilter").val().toString(); //here I get all options and convert to string
      var document_style = document.documentElement.style;
      if(selected !== "")
        document_style.setProperty('--text', "'Selected: "+selected+"'");
      else
        document_style.setProperty('--text', "'Select values'");
	});
:root
{
	--text: "Select values";
}
.multiple_select
{
	height: 18px;
	width: 90%;
	overflow: hidden;
	-webkit-appearance: menulist;
	position: relative;
}
.multiple_select::before
{
	content: var(--text);
	display: block;
  margin-left: 5px;
  margin-bottom: 2px;
}
.multiple_select_active
{
	overflow: visible !important;
}
.multiple_select option
{
	display: none;
    height: 18px;
	background-color: white;
}
.multiple_select_active option
{
	display: block;
}

.multiple_select option::before {
  content: "\2610";
}
.multiple_select option:checked::before {
  content: "\2611";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="myFilter" class="multiple_select" multiple>
  <option>A</option>
  <option>B</option>
  <option>C</option>
  <option>D</option>
  <option>E</option>
</select>