Вступление #
Для кастомизации селекта можно использовать класс .js-select по умолчанию и стандартную разметку.
Выпадающий список селекта реализован на базе Headless Tippy.
Установка #
Пример разметки и инициализации кастомизированного селекта.
<select class="js-select">
<option placeholder>Выберите фрукт</option>
<option>Яблоко</option>
<option>Апельсин</option>
<option>Арбуз</option>
</select>
const options = {
'notfound': 'Увы, ничего не нашли',
'placeholder': {
'output': 'Список для выбора',
'search': 'Искать',
},
'tippy': {
'offset': [10, 10],
},
'addClass': 'my-custom-select',
};
BasicSelect.init('.my-select', options);
BasicSelect.init(document.querySelector('.my-select'), options);
BasicSelect.init(document.querySelectorAll('.my-select'), options);
// или
BasicSelect.init(); // по умолчанию инициaлизирует элементы с классом .js-select
Конфигурация #
Настройки, заданные с использованием data-атрибутов.
data-select-options #
В значение указываются параметры для гибкой настройки кастомизированного селекта.
<select
class="js-select"
data-select-options='{
"enabledSearch": true,
"notfound": "Увы, ничего не нашли",
"placeholder": {
"output": "Список для выбора",
"search": "Искать"
},
"addClass": "my-custom-select"
}'
>
<option placeholder>Выберите фрукт</option>
<option>Яблоко</option>
<option>Апельсин</option>
<option>Арбуз</option>
</select>
Параметры:
| Название | Тип | Описание |
|---|---|---|
enabledSearch |
boolean |
Показать поиск, по умолчанию — true. |
notfound |
string |
Текст при нулевом результате поиска, по умолчанию — ничего не найдено. |
placeholder.output |
string |
Текст-заглушка для вывода результата, по умолчанию — Выберите из списка. |
placeholder.search |
string |
Текст-заглушка для поля поиска, по умолчанию — Найти. |
tippy |
object |
В значениях указываются параметры для гибкой настройки выпадающего списка, с ними можно ознакомиться на странице официальной документации Tippy.js. |
addClass |
string/object |
Добавить дополнительный класс к кастомизированному селекту. |
data-select-label #
Помимо текста, в дочерние элементы можно передать полную HTML-разметку, включая изображения, форматирование текста и другие элементы.
<select class="js-select">
<option placeholder>Выберите валюту</option>
<option data-select-label='<svg class="select-icon"><use xlink:href="#icon-usd"/></svg> Доллар'>Доллар</option>
<option data-select-label='<svg class="select-icon"><use xlink:href="#icon-eur"/></svg> Евро'>Евро</option>
<option data-select-label='<svg class="select-icon"><use xlink:href="#icon-rub"/></svg> Рубль'>Рубль</option>
</select>
<select class="js-select">
<option placeholder>Форматирование текста</option>
<option data-select-label='<i>Курсивом</i>'>Курсивом</option>
<option data-select-label='<b>Жирный</b>'>Жирный</option>
<option data-select-label='<s>Зачёркнутый</s>'>Зачёркнутый</option>
</select>
Multiple select #
Для настройки селекта множественного выбора необходимо добавить атрибут multiple.
<select multiple class="js-select">
<option placeholder>Выберите фрукты</option>
<option selected>Яблоко</option>
<option selected>Апельсин</option>
<option>Арбуз</option>
<option>Виноград</option>
<option>Сливы</option>
<option>Мандарины</option>
<option>Грушы</option>
</select>
Данный тип селекта также поддерживает data-select-label.
<select multiple class="js-select">
<option placeholder>Форматирование текста</option>
<option data-select-label='<i>Курсивом</i>'>Курсивом</option>
<option data-select-label='<b>Жирный</b>'>Жирный</option>
<option data-select-label='<s>Зачёркнутый</s>'>Зачёркнутый</option>
<option data-select-label='<u>Подчёркнутый</u>'>Подчёркнутый</option>
<option data-select-label='<mark>Выделенный</mark>'>Выделенный</option>
</select>
Optgroup #
Установка #
Поддерживает группировку опций внутри селекта. Работает с типами селектов default и multiple.
<select class="js-select">
<optgroup label="Заголовки">
<option data-select-label='Заголовок h1'>Заголовок h1</option>
<option data-select-label='Заголовок h2'>Заголовок h2</option>
<option data-select-label='Заголовок h3'>Заголовок h3</option>
</optgroup>
<optgroup label="Обычное форматирование">
<option data-select-label='<i>Курсивом</i>'>Курсивом</option>
<option data-select-label='<b>Жирный</b>'>Жирный</option>
<option data-select-label='<s>Зачёркнутый</s>'>Зачёркнутый</option>
<option data-select-label='<u>Подчёркнутый</u>'>Подчёркнутый</option>
<option data-select-label='<mark>Выделенный</mark>'>Выделенный</option>
</optgroup>
</select>
Методы #
У групп существуют свои методы.
groupCreate() #
Создать новую группу с опциями. Метод работает с типами селектов default и multiple.
BasicSelect.groupCreate({
"el": "#my-select",
"name": "Новая группа",
"value": [
{
"label": "<b>Новый пункт списка</b>",
"value": "Новый пункт списка",
"selected": true
},
{
"label": "<i>Ещё один пункт списка</i>",
"value": "Ещё один пункт списка",
"disabled": true
}
]
});
где в конфигурациях указывается:
| Название | Тип | Описание |
|---|---|---|
el |
object/string |
Оригинальный селект(.js-select), к которому необходимо добавить новые элементы. |
name |
string |
Название группы. |
value |
object |
Массив дочерних элементов группы, где label — это внешний вид элемента, а value — необходимое значение, selected — заранее выбрать элемент, disabled — заранее заблокированный элемент. |
groupRemove() и groupRemoveAll() #
Исключить группы из списка. Метод работает с типами селектов default и multiple.
BasicSelect.groupRemove({
"el": "#my-select",
"value": "Название группы" // если необходимо исключить из списка сразу несколько групп: ["Название группы 1", "Название группы 2"]
});
// или
BasicSelect.groupRemoveAll("#my-select"); // удалить сразу все группы из селекта
конфигурации для groupRemove():
| Название | Тип | Описание |
|---|---|---|
el |
object/string |
Оригинальный селект(.js-select), из списка которого нужно исключить определённую группу. |
value |
string |
Название группы из списка, которую необходимо исключить. которую следует исключить из списка. Если нужно исключить сразу несколько групп, то необходимо указать их названия в виде массива. |
groupAdd() #
Добавить в группу новые дочерние элементы. Метод работает с типами селектов default и multiple.
BasicSelect.groupAdd({
"el": "#my-select",
"name": "Название группы",
"value": [
{
"label": "<b>Новый пункт списка</b>",
"value": "Новый пункт списка",
"selected": true
},
{
"label": "<i>Ещё один пункт списка</i>",
"value": "Ещё один пункт списка",
"disabled": true
}
]
});
где в конфигурациях указывается:
| Название | Тип | Описание |
|---|---|---|
el |
object/string |
Оригинальный селект(.js-select), в который нужно добавить новые элементы. |
name |
string |
Название группы, в которую нужно добавить новые элементы. |
value |
object |
Массив новых дочерних элементов группы, где label — это внешний вид элемента, а value — необходимое значение, selected — заранее выбрать новый элемент, disabled — заранее заблокировать элемент. |
groupDisabled() и groupEnabled() #
Заблокировать или разблокировать группу из списка. Метод работает с типами селектов default и multiple.
BasicSelect.groupDisabled({
"el": "#my-select", // оригинальный селект(к примеру .js-select).
"value": "Название группы" // название группы, которую необходимо заблокировать.
});
// или разблокировать
BasicSelect.groupEnabled({
"el": "#my-select", // оригинальный селект(к примеру .js-select).
"value": "Название группы" // название группы, которую необходимо разблокировать.
});
Методы #
add() #
Добавить новые элементы в список кастомизированного селекта. Метод работает с типами селектов default и multiple.
BasicSelect.add({
"el": "#my-select",
"value": [
{
"label": "<b>Новый пункт списка</b>",
"value": "Новый пункт списка",
"selected": true
},
{
"label": "<i>Ещё один пункт списка</i>",
"value": "Ещё один пункт списка",
"disabled": true
}
]
});
где в конфигурациях указывается:
| Название | Тип | Описание |
|---|---|---|
el |
object/string |
Оригинальный селект(.js-select), в который нужно добавить новые элементы. |
value |
object |
Массив новых элементов, где label — это внешний вид элемента, а value — значение элемента, selected — заранее выбранный элемент, disabled — заранее заблокированный элемент. |
choose() и chooseAll() #
Выбрать элемент или элементы из кастомизированного селекта. Метод работает с типами селектов default и multiple.
BasicSelect.choose({
"el": "#my-select",
"value": "Пункт списка" // если необходимо выбрать сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
});
// или
BasicSelect.chooseAll('#my-select') // выбрать сразу все выбранные элементы из списка
конфигурации для choose():
| Название | Тип | Описание |
|---|---|---|
el |
object/string |
Оригинальный селект(.js-select), в котором необходимо выбрать элементы. |
value |
object/string |
Необходимо указать значение элемента из списка, который нужно выбрать. Если требуется выбрать сразу несколько элементов, то следует представить их в виде массива. |
clear() и clearAll() #
Очистить кастомизированный селект от выбора. Методы работают с типами селектов default и multiple.
BasicSelect.clear({
"el": "#my-select",
"value": "пункт списка" // если надо очистить от несколько выбранных элементов: ["Пункт списка", "Ещё один пункт списка"]
});
// или
BasicSelect.clearAll('#my-select') // очистить сразу все выбранные элементы из списка
конфигурации для clear():
| Название | Тип | Описание |
|---|---|---|
el |
object/string |
Оригинальный селект(.js-select), который необходимо очистить от выбранных элементов. |
value |
object/string |
Необходимо указать значение выбранного элемента из списка, от которого необходимо очистить селектор. Если требуется удалить несколько элементов, то необходимо указать их в виде массива. |
remove() и removeAll() #
Удаляет дочерние элементы из списка кастомизированного селекта. Методы работают с типами селектов default и multiple.
BasicSelect.remove({
"el": "#my-select",
"value": "пункт списка" // если надо удалить сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
});
// или
BasicSelect.removeAll('#my-select'); // удалить сразу все элементы из списка
конфигурации для remove():
| Название | Тип | Описание |
|---|---|---|
el |
object/string |
Оригинальный селект(.js-select), из которого необходимо удалить элемент. |
value |
object/string |
Необходимо указать значение элемента, который требуется удалить из списка. Если нужно удалить несколько элементов, то их следует указать в виде массива. |
show() и hide() #
Показать/скрыть выпадающий список кастомизированного селекта. Методы работают с типами селектов default и multiple.
BasicSelect.show('#my-select'); // показать выпадающий список
BasicSelect.hide('#my-select'); // скрыть выпадающий список
disabled() и enabled() #
Заблокировать или разблокировать кастомизированный селект. Методы работают с типами селектов default и multiple.
BasicSelect.disabled('#my-select'); // заблокировать селект
BasicSelect.enabled('#my-select'); // разблокировать селект
disabledOption() и enabledOption() #
Заблокировать или разблокировать дочерние элементы из списка кастомизированного селекта. Методы работают с типами селектов default и multiple.
BasicSelect.disabledOption({
"el": "#my-select",
"value": "пункт списка" // если надо заблокировать сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
});
// или разблокировать
BasicSelect.enabledOption({
"el": "#my-select",
"value": "пункт списка" // если надо разблокировать сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
});
destroy() #
Уничтожает экземпляр кастомизированного селекта и возвращает оригинал в первоначальный вид. Метод работает с селектами default и multiple.
BasicSelect.destroy("#my-select");
Экземпляр #
У каждого инициализированного элемента есть свой экземпляр.
const myCustomSelect = document.querySelector(".my-select");
console.log(myCustomSelect.BasicSelect); // пример экземпляра
В настоящее время экземпляр поддерживает все методы.
Прослушивание событий #
Можно прослушать события элемента и получить необходимые параметры.
select:choice #
Срабатывает при выборе элемента из списка кастомизированного селекта.
Параметры:
| Название | Тип | Описание |
|---|---|---|
event.detail.el |
object |
Оригинальный селект(.js-select). |
event.detail.index |
number |
index селекта. |
event.detail.select |
object |
Кастомизированный селект. |
event.detail.target |
object |
Пункт из списка, с которым связано главное событие. |
event.detail.selected |
boolean |
Указывает статус выбранного пункта из списка. |
event.detail.value |
string или object |
Значение селекта. string — default select, object — multiple select. |
document.querySelector('#my-select').addEventListener('select:choice', function() {
console.log(event.detail); // параметры
}, false);
select:clear #
Срабатывает при очистке кастомизированного селекта от выбора.
Параметры:
| Название | Тип | Описание |
|---|---|---|
event.detail.el |
object |
Оригинальный селект(.js-select). |
event.detail.index |
number |
index селекта. |
event.detail.select |
object |
Кастомизированный селект. |
event.detail.previous |
object |
Предыдущий выбранный элемент из списка. |
event.detail.selected |
boolean |
Указывает статус выбранного элемента. |
event.detail.value |
string |
Значение селекта. |
document.querySelector('#my-select').addEventListener('select:clear', function() {
console.log(event.detail); // параметры
}, false);
select:visibility #
Срабатывает при показе или скрытия выпадающего списка кастомизированного селекта.
Параметры:
| Название | Тип | Описание |
|---|---|---|
event.detail.el |
object |
Оригинальный селект(.js-select). |
event.detail.index |
number |
index селекта. |
event.detail.select |
object |
Кастомизированный селект. |
event.detail.dropdown |
object |
Выпадающий список селекта. |
event.detail.tippy |
object |
Параметры tippy экземпляра селекта. |
event.detail.show |
boolean |
Указывает статус видимости списка селекта. |
document.querySelector('#my-select').addEventListener('select:visibility', function() {
console.log(event.detail); // параметры
}, false);