Como usar a caixa de seleção dentro da opção Selecionar

94

O cliente me deu um design que tem um menu Selecionar opção contendo uma caixa de seleção junto com o nome do item como itens individuais na lista. Existe alguma forma de adicionar uma caixa de seleção dentro de um menu Selecionar opção?

NB: O desenvolvedor precisa adicionar seu próprio id para tornar o menu efetivo, eu só preciso do código HTML CSS se for possível.

Hero Tra
fonte
5
"Eu só preciso do código HTML CSS se for possível de qualquer maneira" ... sim, é possível ... você só precisará codificá-lo por você mesmo ou no Google
fmodos
5
@fmodos Possível? Por favor, nos jogue uma demonstração e OP - veja isso ... Não é possível com CSS e HTML apenas
Sr. Alien
Por favor, leia esta postagem 1stwebdesigns.com/blog/development/…
kuldeep raj
@ Mr.Alien, sinto falta, entendido ... Achei que ele estava pedindo um componente que "poderia" ser HTML CSS e não "teria" que ser apenas "HTML CSS" ... meu mal: /
fmodos

Respostas:

188

Você não pode colocar a caixa de seleção dentro do elemento de seleção, mas pode obter a mesma funcionalidade usando HTML, CSS e JavaScript. Aqui está uma possível solução de trabalho. A explicação segue.

insira a descrição da imagem aqui


Código:

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>

Explicação:

Primeiramente, criamos um elemento select que mostra o texto "Selecione uma opção" e um elemento vazio que cobre (sobrepõe) o elemento selecionado (<div class="overSelect"> ). Não queremos que o usuário clique no elemento selecionado - ele mostraria opções vazias. Para sobrepor o elemento a outro elemento, usamos a propriedade de posição CSS com valor relativo | absoluto.

Para adicionar a funcionalidade, especificamos uma função JavaScript que é chamada quando o usuário clica no div que contém nosso elemento select ( <div class="selectBox" onclick="showCheckboxes()">).

Também criamos div que contém nossas caixas de seleção e estilizamos usando CSS. A função JavaScript mencionada acima apenas muda<div id="checkboxes"> valor da propriedade de exibição CSS de "nenhum" para "bloquear" e vice-versa.

A solução foi testada nos seguintes navegadores: Internet Explorer 10, Firefox 34, Chrome 39. O navegador precisa ter o JavaScript habilitado.


Mais Informações:

Posicionamento CSS

Como sobrepor um div sobre outro div

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

Propriedade de exibição CSS

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

vitfo
fonte
1
Para sua informação: esta solução exigirá mais esforço se for necessário modificar mais de uma lista de seleção. Eu sugiro ir para algum plugin mantido ativamente.
como obter o valor das caixas de seleção selecionadas? Muito boa resposta, mas seria muito útil se você fornecer plnkr ou algo parecido.
Pardeep Jain
7
também a caixa de seleção não desaparece quando o usuário seleciona qualquer opção
Pardeep Jain
1
Essa resposta é ótima e funcionou para mim. No entanto, há uma melhoria que fiz nele. Em vez do overselectdiv que poderia causar alguns problemas em uma interface complexa que usei <option selected hidden>Select an option</option>. Pode não ser o melhor uso do, hiddenmas funciona.
Syknapse
2
mas como esconder a lista suspensa, quando clicamos fora?
saurabh kumar
58

O melhor plugin até agora é o Bootstrap Multiselect

<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>

Aqui está o DEMO

$(function() {

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

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

<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>

pmrotule
fonte
1
Você não precisa usar tantas bibliotecas para sua solução. Você pode apenas usar a opção de seleção múltipla de HTML regular. Obrigado!
Power Star
3
Eu sei que posso usar a opção de seleção múltipla de HTML, mas achei feia e não amigável.
pmrotule
4
Eu gosto do comportamento deste plugin, mas quero usá-lo sem bootstrap ... algo semelhante?
singpolyma
este plugin é tão problemático ... eles têm 150 questões em aberto e o mantenedor disse que não tem tempo. então, após algumas questões, mudei para a resposta e vue aceitos
Oleg Abrazhaev
1
@Erbureth Os caminhos externos de script / folha de estilo estavam desatualizados na demonstração (links inativos). Eu atualizei os urls para corrigir isso.
pmrotule de
18

Para uma abordagem Pure CSS , você pode usar o :checkedseletor combinado com o ::beforeseletor para embutir conteúdo condicional.

Basta adicionar a classe select-checkboxao seu selectelemento e incluir o seguinte CSS:

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

Você pode usar caracteres Unicode simples (com uma codificação hexadecimal de escape ) como estes:

Ou se quiser apimentar as coisas, você pode usar esses glifos FontAwesome

Captura de tela

Demonstração em jsFiddle e Stack Snippets

Nota : No entanto, tome cuidado com os problemas de compatibilidade do IE

KyleMit
fonte
1
É um problema quando o multipleatributo faz a <select>aparência de uma caixa em vez de uma lista suspensa ...
vsync
@vsync, você pode explicar qual é o problema que está tendo, talvez até mesmo um fork do violino e incluir uma captura de tela. O objetivo aqui é aplicar a um <select multiple>elemento, de modo que deve ser o caso de uso pretendido. Os seletores CSS devem ser específicos para a aplicação dessa classe, então você decide usar em elementos individuais aplicando a .select-checkboxclasse
KyleMit
1
Recomendo vivamente esta solução elegante se estiver procurando uma abordagem CSS pura.
Anish Sana de
@KyleMit Ótima solução !!! mas o problema é que, se eu quiser selecionar vários itens, tenho que usar o botão Ctrl como o simples elemento de seleção.
Lalit Rajput
@LalitRajput, claro, esse é o Design de interação padrão para todos os controles de seleção múltipla em todos os navegadores. Eu concordo que é meio instável ou não intuitivo. Você sempre pode encontrar maneiras de substituir esse comportamento padrão, se quiser. Como evitar a necessidade de ctrl-click em uma caixa de seleção múltipla usando Javascript? - veja este violino atualizado
KyleMit
14

Experimente a seleção múltipla , especialmente vários itens . Parece ser uma solução muito limpa e gerenciada, com toneladas de exemplos. Você também pode ver a fonte.

<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>
Azghanvi
fonte
Embora este link possa responder à pergunta, é melhor incluir as partes essenciais da resposta aqui e fornecer o link para referência. As respostas somente com link podem se tornar inválidas se a página vinculada mudar. - Da avaliação
Justin Lessard
8

Comecei com a resposta @vitfo, mas quero ter entradas <option>dentro em <select>vez de caixas de seleção, então juntei todas as respostas para fazer isso, aqui está o meu código, espero que ajude alguém.

$(".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>

Pavelbere
fonte
6

Versão alternativa do Vanilla JS com clique fora para ocultar as caixas de seleção:

let expanded = false;
const multiSelect = document.querySelector('.multiselect');

multiSelect.addEventListener('click', function(e) {
  const checkboxes = document.getElementById("checkboxes");
    if (!expanded) {
    checkboxes.style.display = "block";
    expanded = true;
  } else {
    checkboxes.style.display = "none";
    expanded = false;
  }
  e.stopPropagation();
}, true)

document.addEventListener('click', function(e){
  if (expanded) {
    checkboxes.style.display = "none";
    expanded = false;
  }
}, false)

Estou usando addEventListener em vez de onClick para aproveitar as vantagens das opções de fase de captura / bolha junto com stopPropagation (). Você pode ler mais sobre a captura / borbulhamento aqui: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

O resto do código corresponde à resposta original do vitfo (mas não há necessidade de onclick () no html). Algumas pessoas solicitaram essa funcionalidade sem jQuery.

Aqui está um exemplo de codepen https://codepen.io/davidysoards/pen/QXYYYa?editors=1010

davidysoards
fonte
2

Você pode usar esta biblioteca no git para esta finalidade https://github.com/ehynds/jquery-ui-multiselect-widget

para iniciar a caixa de seleção use este

    $("#selectBoxId").multiselect().multiselectfilter();

e quando você tiver os dados prontos em json (de ajax ou qualquer método), primeiro analise os dados e depois atribua o array js a eles

    var js_arr = $.parseJSON(/*data from ajax*/);
    $("#selectBoxId").val(js_arr);
    $("#selectBoxId").multiselect("refresh");
Jaya Parwani
fonte
2

Use este código para a lista de caixas de seleção no menu de opções.

.dropdown-menu input {
   margin-right: 10px;
}   
<div class="btn-group">
    <a href="#" class="btn btn-primary"><i class="fa fa-cogs"></i></a>
    <a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
      <span class="caret"></span>
    </a>
    <ul class="dropdown-menu" style="padding: 10px" id="myDiv">
        <li><p><input type="checkbox" value="id1" > OA Number</p></li>
        <li><p><input type="checkbox" value="id2" >Customer</p></li>
        <li><p><input type="checkbox" value="id3" > OA Date</p></li>
        <li><p><input type="checkbox" value="id4" >Product Code</p></li>
        <li><p><input type="checkbox" value="id5" >Name</p></li>
        <li><p><input type="checkbox" value="id6" >WI Number</p></li>
        <li><p><input type="checkbox" value="id7" >WI QTY</p></li>
        <li><p><input type="checkbox" value="id8" >Production QTY</p></li>
        <li><p><input type="checkbox" value="id9" >PD Sr.No (from-to)</p></li>
        <li><p><input type="checkbox" value="id10" > Production Date</p></li>
        <button class="btn btn-info" onClick="showTable();">Go</button>
    </ul>
</div>

Rupesh Wankhede
fonte
Para um exemplo completo desta abordagem básica de construção de um dropdown-menucom elementos de caixa de seleção em cada linha, aqui está uma resposta para colocar caixas de seleção em uma lista suspensa Bootstrap
KyleMit
1

Você pode estar carregando o arquivo multiselect.js antes da lista de opções atualizada com a chamada AJAX, portanto, enquanto a execução do arquivo multiselect.js, há uma lista de opções vazia para aplicar a funcionalidade multiselect. Portanto, primeiro atualize a lista de opções por chamada AJAX e, em seguida, inicie a chamada multisseleção, você obterá a lista suspensa com a lista de opções dinâmicas.

Espero que isso ajude você.

Lista suspensa Multiselect e js relacionados e arquivos CSS

// This function should be called while loading page
var loadParentTaskList = function(){
    $.ajax({
        url: yoururl,
        method: 'POST',
        success: function(data){
            // To add options list coming from AJAX call multiselect
            for (var field in data) {
                $('<option value = "'+ data[field].name +'">' + data[field].name + '</option>').appendTo('#parent_task');
            }
   
            // To initiate the multiselect call 
            $("#parent_task").multiselect({
                includeSelectAllOption: true
            })
        }
    });
}
// Multiselect drop down list with id parent_task
<select id="parent_task" multiple="multiple">
</select>

Yaswini Modupalli
fonte
1

Você pode tentar selecionar Bootstrap . Tem uma pesquisa ao vivo também!

saee
fonte
0

Se você deseja criar vários menus suspensos de seleção na mesma página:

.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;
}

Html:

 <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>
<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>

Usando Jquery:

 function showCheckboxes(elethis) {
        if($(elethis).next('#checkboxes').is(':hidden')){
            $(elethis).next('#checkboxes').show();
            $('.selectBox').not(elethis).next('#checkboxes').hide();  
        }else{
            $(elethis).next('#checkboxes').hide();
            $('.selectBox').not(elethis).next('#checkboxes').hide();
        }
 }
Ashish
fonte
-2

Apenas adicione class create div e adicione class form-control. Iam usar JSP, boostrap4. Ignore c: foreach.

<div class="multi-select form-control" style="height:107.292px;">
        <div class="checkbox" id="checkbox-expedientes">
            <c:forEach var="item" items="${postulantes}">
                <label class="form-check-label">
                    <input id="options" class="postulantes" type="checkbox" value="1">Option 1</label>
            </c:forEach>
        </div>
    </div>
Juan Silupú Maza
fonte