Вступление #

Кастомизация селекта, можно использовать по умолчанию класс .js-select и обычную разметку.

Установка #

Пример разметки и инициализации селекта.

    <select class="js-select">
        <option placeholder>Выберите фрукт</option>
        <option>Яблоко</option>
        <option>Апельсин</option>
        <option>Арбуз</option>
    </select>
    BasicSelect.init('.my-select');
    BasicSelect.init(document.querySelector('.my-select'));
    BasicSelect.init(document.querySelectorAll('.my-select'));

    // или

    BasicSelect.init(); // по умолчанию инициaлизирует элементы с классом .js-select

Так же можно заранее инициализировать с необходимыми параметрами:

	BasicSelect.init(document.querySelector('.my-select'), {
		'notfound': 'Увы, ничего не нашли',
		'placeholder': {
			'output': 'Список для выбора',
			'search': 'Искать'
		},
		'addClass': 'my-custom-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 Текст-заглушка для поля поиска, по умолчанию Найти.
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>

Multiple так же поддерживает 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>

Методы #

У групп есть свои отдельные методы.

groupСreate() #

Создать новую группу с опциями. Метод работает с селектами default и multiple.

    BasicSelect.groupСreate({
        "select": "#my-select",
		"name": "Новый optgroup",
        "value": [
            {
                "label": "<b>Новый пункт списка</b>",
                "value": "Новый пункт списка",
                "selected": true
            },

            {
                "label": "<i>Ещё один пункт списка</i>",
                "value": "Ещё один пункт списка",
                "disabled": true
            }
        ]
    });

где в конфигурациях указывается:

Название Тип Описание
select object/string Оригинальный селект(к примеру .js-select), для которого необходимо добавить новые элементы.
name string Название группы.
value object Список(ввиде массива) дочерних элементов группы, где label — это внешний вид элемента, а value — необходимое значение, selected — заранее выбрать новый элемент, disabled — заранее заблокировать элемент.

groupRemove() и groupRemoveAll() #

Удалить группы из списка. Методы работают с селектами default и multiple.

    BasicSelect.groupRemove({
        "select": "#my-select",
		"value": "Новый optgroup" // если надо удалить сразу несколько групп из селекта: ["Название группы 1", "Название группы 2"]
    });

	// или

	BasicSelect.groupRemoveAll("#my-select"); // удалить сразу все группы из селекта

конфигурации для groupRemove():

Название Тип Описание
select object/string Оригинальный селект(к примеру .js-select), у которого необходимо удалить элемент.
value string Название группы из списка, которую нужно удалить. Если необходимо удалить сразу несколько групп, то надо будет указать их название ввиде одного массива.

groupAdd() #

Пополнить группу новыми дочерними элементами. Метод работает с селектами default и multiple.

    BasicSelect.groupAdd({
        "select": "#my-select",
		"name":   "Название группы",
        "value": [
            {
                "label": "<b>Новый пункт списка</b>",
                "value": "Новый пункт списка",
                "selected": true
            },

            {
                "label": "<i>Ещё один пункт списка</i>",
                "value": "Ещё один пункт списка",
                "disabled": true
            }
        ]
    });

где в конфигурациях указывается:

Название Тип Описание
select object/string Оригинальный селект(к примеру .js-select), для которого необходимо добавить новые элементы.
name string Название группы, куда необходимо добавить новые элементы.
value object Список(ввиде массива) новых дочерних элементов группы, где label — это внешний вид элемента, а value — необходимое значение, selected — заранее выбрать новый элемент, disabled — заранее заблокировать элемент.

groupDisabled() и groupEnabled() #

Заблокировать/разблокировать группу из списка. Метод работает с селектами default и multiple.

    BasicSelect.groupDisabled({
        "select": "#my-select",	  	// оригинальный селект(к примеру .js-select).
		"value":  "Название группы" // название группы, которую необходимо заблокировать.
    });

	// или разблокировать

	BasicSelect.groupEnabled({
        "select": "#my-select",	  	// оригинальный селект(к примеру .js-select).
		"value":  "Название группы" // название группы, которую необходимо разблокировать.
    });

Методы #

add() #

Добавить новые элементы в список селекта. Метод работает с селектами default и multiple.

    BasicSelect.add({
        "select": "#my-select",
        "value": [
            {
                "label": "<b>Новый пункт списка</b>",
                "value": "Новый пункт списка",
                "selected": true
            },

            {
                "label": "<i>Ещё один пункт списка</i>",
                "value": "Ещё один пункт списка",
                "disabled": true
            }
        ]
    });

где в конфигурациях указывается:

Название Тип Описание
select object/string Оригинальный селект(к примеру .js-select), для которого необходимо добавить новые элементы.
value object Список новых элементов ввиде массива, где label — это внешний вид элемента, а value — необходимое значение, selected — заранее выбрать новый элемент, disabled — заранее заблокировать элемент.

choose() и chooseAll() #

Выбрать элемент/элементы из списка. Методы работают с селектами default и multiple.

    BasicSelect.choose({
        "select": "#my-select",
        "value":  "Пункт списка" // если необходимо выбрать сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
    });

    // или

    BasicSelect.chooseAll('#my-select') // выбрать сразу все выбранные элементы из списка

конфигурации для choose():

Название Тип Описание
select object/string Оригинальный селект(к примеру .js-select), у которого необходимо выбраmь элементы.
value object/string Указывается значение элемента из списка, которое необходимо выбрать. Если необходимо выбрать сразу несколько, то надо будет указать их ввиде массива.

clear() и clearAll() #

Очистить селект от выбора. Методы работают с селектами default и multiple.

    BasicSelect.clear({
        "select": "#my-select",
        "value":  "пункт списка" // если надо очистить от несколько выбранных элементов: ["Пункт списка", "Ещё один пункт списка"]
    });

    // или

    BasicSelect.clearAll('#my-select') // очистить сразу все выбранные элементы из списка

конфигурации для clear():

Название Тип Описание
select object/string Оригинальный селект(к примеру .js-select), у которого необходимо очистить выбранные элементы.
value object/string Указывается значение выбранного элемента из списка, от которого надо очистить селект. Если необходимо избавиться от нескольких, то надо будет указать их ввиде массива.

remove() и removeAll() #

Удаляет дочерние элементы из списка. Методы работают с селектами default и multiple.

    BasicSelect.remove({
        "select": "#my-select",
        "value":  "пункт списка" // если надо удалить сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
    });

    // или

    BasicSelect.removeAll('#my-select'); // удалить сразу все элементы из списка

конфигурации для remove():

Название Тип Описание
select 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({
        "select": "#my-select",
        "value":  "пункт списка" // если надо заблокировать сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
    });

    // или разблокировать

    BasicSelect.enabledOption({
        "select": "#my-select",
        "value":  "пункт списка" // если надо разблокировать сразу несколько элементов из списка: ["Пункт списка", "Ещё один пункт списка"]
    });

destroy() #

Уничтожает экземпляр кастомизированного селекта и возвращает оригинал в первоначальный вид. Метод работает с селектами default и multiple.

    BasicSelect.destroy("#my-select");

Прослушивание событий #

Можно прослушать события элемента и получить необходимые параметры.

select choice #

Срабатывает при выборе элемента из списка.

Параметры:

Название Тип Описание
event.detail.el object Селект(.js-select).
event.detail.select object Кастомизированный селект.
event.detail.index number index селекта.
event.detail.previous object Предыдущий выбранный элемент из списка.
event.detail.target object Элемент из списка, на котором произошло основное событие.
event.detail.selected boolean Указывает статус выбранного элемента.
event.detail.value string Значение селекта.
    document.querySelector('#my-select').addEventListener('select choice', function() {

        console.log(event.detail); // параметры

    }, false);

select clear #

Срабатывает при очистке селекта от выбора.

Параметры:

Название Тип Описание
event.detail.el object Селект(.js-select).
event.detail.select object Кастомизированный селект.
event.detail.index number index селекта.
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.select object Кастомизированный селект.
event.detail.index number index селекта.
event.detail.show boolean Указывает статус видимости списка селекта.
    document.querySelector('#my-select').addEventListener('select visibility', function() {

        console.log(event.detail); // параметры

    }, false);

Моб.версия #

Кастомизированный селект можно адаптировать под моб.версию и для этого достаточно прописать соответствующие стили.

В данном примере, селект реализован в виде попапа.

Пример стилизации:

	.select-overlay {
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		position: fixed;

		opacity: 0;
		visibility: hidden;

		z-index: 999;
		padding: 10px;
		cursor: pointer;
		display: flex;
		align-items: center;
		justify-content: center;
		background-color: rgba(30,30,30,.81);
	}

	.select-dropdown {
		top: auto !important;
		position: relative;

		width: 100%;
		max-width: 320px;
		border-radius: 5px;
	}

	.select--open .select-overlay {
		opacity: 1;
    	visibility: visible;
	}