JSFiddle - React, Tailwind, and code Playground
by Cykeltur
HTML
<!DOCTYPE html>
<html>
<style>
.filterDiv {
float: left;
background-color: #2196F3;
color: #ffffff;
width: 100px;
line-height: 100px;
text-align: center;
margin: 2px;
display: none;
}
.show {
display: block;
}
.container {
margin-top: 20px;
overflow: hidden;
}
/* Style the buttons */
.btn {
border: none;
outline: none;
padding: 12px 16px;
background-color: #f1f1f1;
cursor: pointer;
}
.btn:hover {
background-color: #ddd;
}
.btn.active {
background-color: #666;
color: white;
}
</style>
<body>
<h2>Filter DIV Elements</h2>
<div class="options">
<label><input type="radio" name="operation" value="union" id="op-union" checked> Union</label>
<label><input type="radio" name="operation" value="intersection" id="op-inter"> Intersection</label>
</div>
<div class="categories">
<span class="category">
<input type="checkbox" value="cars" id="cat-cars">
<label for="cat-cars">Cars</label>
</span>
<span class="category">
<input type="checkbox" value="animals" id="cat-animals">
<label for="cat-animals">Animals</label>
</span>
<span class="category">
<input type="checkbox" value="fruits" id="cat-fruits">
<label for="cat-fruits">Fruits</label>
</span>
<span class="category">
<input type="checkbox" value="colors" id="cat-colors">
<label for="cat-colors">Colors</label>
</span>
</div>
<div class="container">
<div class="filterDiv cars">BMW</div>
<div class="filterDiv colors fruits">Orange</div>
<div class="filterDiv cars">Volvo</div>
<div class="filterDiv colors">Red</div>
<div class="filterDiv cars animals">Mustang</div>
<div class="filterDiv colors">Blue</div>
<div class="filterDiv animals">Cat</div>
<div class="filterDiv animals">Dog</div>
<div class="filterDiv fruits">Melon</div>
<div class="filterDiv fruits animals">Kiwi</div>
<div class="filterDiv fruits">Banana</div>
<div class="filterDiv fruits">Lemon</div>
<div class="filterDiv...
JavaScript
var checkboxes = document.querySelectorAll(".categories input");
for(var i = 0; i < checkboxes.length; i++) {
checkboxes[i].addEventListener("change", filter);
}
var radios = document.getElementsByName("operation");
for(var i = 0; i < radios.length; i++) {
radios[i].addEventListener("change", filter);
}
filter();
function filter() {
var i, j;
// Choose an operation
var operation = document.getElementById("op-union").checked ? "union" : "intersection";
// Get the selected categories
var checkboxes = document.querySelectorAll(".categories input");
var categories = [];
var c;
for(i = 0; i < checkboxes.length; i++) {
if(checkboxes[i].checked) {
c = checkboxes[i].value;
categories.push(c);
}
}
// Apply the filter
var items = document.querySelectorAll(".filterDiv");
var item, show;
for(i = 0; i < items.length; i++) {
item = items[i];
if(categories.length == 0) {
show = true;
} else if(operation == "union") {
// Union: Only one of the categories needs to exist
show = false;
for(j = 0; j < categories.length; j++) {
if(item.classList.contains(categories[j])) {
show = true;
break;
}
}
} else {
// Intersection: All of the categories must apply
show = true;
for(j = 0; j < categories.length; j++) {
if(!item.classList.contains(categories[j])) {
show = false;
break;
}
}
}
if(show) {
item.classList.add("show");
} else {
item.classList.remove("show");
}
}
}