Вступление #
Для кастомизации селекта можно использовать класс .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,
)