Как реализовать фильтр на HTML и CSS, чтобы при выборе одного или нескольких чекбоксов показывался один определенный элемент из предложенных? Например, если выбран чекбокс 1, должен показываться соответствующий элемент; если выбраны чекбоксы 3 и 5, должен показываться соответствующий элемент и так далее. Какие подходы можно использовать для достижения этой функциональности и какая лучшая практика в данном случае?
Для создания фильтра опций с использованием JavaScript или jQuery можно использовать следующий подход:
1. Создать список опций с помощью HTML и CSS.
2. Добавить каждой опции data-атрибуты для идентификации и фильтрации.
3. Написать функцию фильтрации на JavaScript или jQuery, которая будет скрывать/показывать определенные элементы в зависимости от выбранных опций.
Пример реализации фильтра на HTML и CSS:
```html
<input type="checkbox" id="option1" data-filter="filter1">
<label for="option1">Option 1</label>
<input type="checkbox" id="option2" data-filter="filter2">
<label for="option2">Option 2</label>
<input type="checkbox" id="option3" data-filter="filter3">
<label for="option3">Option 3</label>
<div class="element filter1">Element 1</div>
<div class="element filter2">Element 2</div>
<div class="element filter3">Element 3</div>
```
```css
.element {
display: none;
}
.element.show {
display: block;
}
```
Пример JavaScript/ jQuery кода для фильтрации:
```javascript
$('input[type="checkbox"]').change(function() {
var selectedOptions = [];
$('input[type="checkbox"]:checked').each(function() {
selectedOptions.push($(this).data('filter'));
});
$('.element').removeClass('show'); // скрываем все элементы
$('.element').each(function() {
var elementFilter = $(this).data('filter');
if (selectedOptions.includes(elementFilter)) {
$(this).addClass('show'); // показываем элемент, если его filter соответствует выбранным опциям
}
});
});
```
С помощью данного подхода можно легко реализовать функциональность фильтра опций на странице. Лучшей практикой в данном случае будет структурированный и читаемый код, который может быть легко изменен или расширен в дальнейшем.
<pre><code class="javascript">document.querySelector('.options').addEventListener('change', e => {
const selector = Array
.from(
e.currentTarget.querySelectorAll('input'),
n => n.checked ? `.${n.value}` : `:not(.${n.value})`)
.join('');
for (const n of document.querySelector('.box').children) {
n.classList.toggle('hidden', !n.matches(selector));
}
});</code></pre> <br/> или <br/> <br/> <pre><code class="javascript">const checkboxes = [...document.querySelectorAll('.options input')];
const items = [...document.querySelector('.box').children];
checkboxes.forEach(n => n.addEventListener('change', onChange));
function onChange() {
const checked = checkboxes.reduce((acc, n) => (acc[n.value] = n.checked, acc), {});
items.forEach(function({ classList: cl }) {
cl.toggle('hidden', this.some(n => n[1] !== cl.contains(n[0])));
}, Object.entries(checked));
}</code></pre>