JSFiddle - React, Tailwind, and code Playground

by anoopsuda

HTML

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"/>

<div class="container-fluid">

<!--
  <div class="form-group col-sm-8">
    <label for="dur">BS original select</label>
    <select id="dur" class="form-select">
      <option value="12" selected>One Year</option>
      <option value="24">Two Year</option>
      <option value="36">Three Year</option>
      <option value="48">Four year</option>
      <option value="60">Five Year</option>
    </select>
  </div>
  -->

  <div class="form-group col-sm-8">
    <label for="myMultiselect">BS custom multiselect</label>
    <div id="myMultiselect" class="multiselect">
      <div id="mySelectLabel" class="selectBox" onclick="toggleCheckboxArea()">
        <select class="form-select">
          <option>somevalue</option>
        </select>
        <div class="overSelect"></div>
      </div>
      <div id="mySelectOptions">
        <label class="customcheckbox-container" for="one"><input type="checkbox" id="one" onchange="checkboxStatusChange()" value="one" />
        <span class="checkmark"></span>First checkbox</label>
        <label class="customcheckbox-container"  for="two"><input type="checkbox" id="two" onchange="checkboxStatusChange()" value="two" /> <span class="checkmark"></span>Second checkbox</label>
        <label  class="customcheckbox-container" for="three"><input type="checkbox" id="three" onchange="checkboxStatusChange()" value="three" /><span class="checkmark"></span> Third checkbox</label>
        <label  class="customcheckbox-container" for="four"><input type="checkbox" id="four" onchange="checkboxStatusChange()" value="four" /> <span class="checkmark"></span>Third checkbox</label>
        <label  class="customcheckbox-container" for="five"><input type="checkbox" id="five" onchange="checkboxStatusChange()" value="five" /><span class="checkmark"></span> First...

CSS

#mySelectOptions::-webkit-scrollbar-track {
    background-color: #fafafa;
}
#mySelectOptions::-webkit-scrollbar-thumb {
    background: #ccc;
    border-radius: 8px;
}
#mySelectOptions::-webkit-scrollbar {
    width: 10px;
}
#mySelectOptions::-webkit-scrollbar-corner {
    background-color: #7f1d1d;
}

.multiselect {
  width: 100%;
}


.selectBox {
  position: relative;
}

.selectBox select {
  width: 100%;
}

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

#mySelectOptions {
  display: none;
  border: 0.5px #7c7c7c solid;
  background-color: #ffffff;
  max-height: 142px;
  overflow-y: scroll;
}

#mySelectOptions label {
  display: block;
  font-weight: normal;
  display: block;
  white-space: nowrap;
  min-height: 1.2em;
  background-color: #ffffff00;
 /* padding: 0 2.25rem 0 .75rem;
   padding: .375rem 2.25rem .375rem .75rem; */
}

#mySelectOptions label:hover {
  background-color: #1e90ff;
}



/*===============check box*/
/* The customcheckbox-container */
.customcheckbox-container {
  display: block;
  position: relative;
  padding-left: 35px;
  margin-bottom: 12px;
  cursor: pointer;
  font-size: 16px;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

/* Hide the browser's default checkbox */
.customcheckbox-container input {
  position: absolute;
  opacity: 0;
  cursor: pointer;
  height: 0;
  width: 0;
}

/* Create a custom checkbox */
.checkmark {
  position: absolute;
  top: 0;
  left: 0;
  height: 25px;
  width: 25px;
  background-color: #eee;
}

/* On mouse-over, add a grey background color */
.customcheckbox-container:hover input ~ .checkmark {
  background-color: #ccc;
}

/* When the checkbox is checked, add a blue background */
.customcheckbox-container input:checked ~ .checkmark {
  background-color: #2196F3;
}

/* Create the checkmark/indicator (hidden when not checked) */
.checkmark:after {
  content: "";
  position: absolute;
  display: none;
}

/* Show...

JavaScript

window.onload = (event) => {
  initMultiselect();
};

function initMultiselect() {
  checkboxStatusChange();

  document.addEventListener("click", function(evt) {
    var flyoutElement = document.getElementById('myMultiselect'),
      targetElement = evt.target; // clicked element

    do {
      if (targetElement == flyoutElement) {
        // This is a click inside. Do nothing, just return.
        //console.log('click inside');
        return;
      }

      // Go up the DOM
      targetElement = targetElement.parentNode;
    } while (targetElement);

    // This is a click outside.
    toggleCheckboxArea(true);
    //console.log('click outside');
  });
}

function checkboxStatusChange() {
  var multiselect = document.getElementById("mySelectLabel");
  var multiselectOption = multiselect.getElementsByTagName('option')[0];

  var values = [];
  var checkboxes = document.getElementById("mySelectOptions");
  var checkedCheckboxes = checkboxes.querySelectorAll('input[type=checkbox]:checked');

  for (const item of checkedCheckboxes) {
    var checkboxValue = item.getAttribute('value');
    values.push(checkboxValue);
  }

  var dropdownValue = "Nothing is selected";
  if (values.length > 0) {
    dropdownValue = values.join(', ');
  }

  multiselectOption.innerText = dropdownValue;
}

function toggleCheckboxArea(onlyHide = false) {
  var checkboxes = document.getElementById("mySelectOptions");
  var displayValue = checkboxes.style.display;

  if (displayValue != "block") {
    if (onlyHide == false) {
      checkboxes.style.display = "block";
    }
  } else {
    checkboxes.style.display = "none";
  }
}