Подтвердить что ты не робот

Стиль <select> на основе выбранного <option>

Можно ли стилизовать элемент select на основе того, что option выбран только с помощью CSS? Я знаю о существующих решениях JavaScript.

Я попытался стилизовать сам элемент option, но это придаст стиль только элементу option в списке опций, а не выбранному элементу.

select[name="qa_contact"] option[value="3"] {
    background: orange;
}

http://jsfiddle.net/Aprillion/xSbhQ/

Если это невозможно с помощью CSS 3, поможет ли Селектор тем CSS 4 в будущем - или это останется запретным плодом для CSS?

4b9b3361

Ответ 1

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

Чтобы сделать то, что вы хотите, вам, по сути, придется определить, какой из дочерних элементов (<option>) выбран, и затем соответствующим образом оформить родительский элемент.

Однако это можно сделать с помощью очень простого вызова jQuery, как показано ниже:

HTML

<select>
  <option value="foo">Foo!</option>
  <option value="bar">Bar!</option>
</select>

JQuery

var $select = $('select');
$select.each(function() {
    $(this).addClass($(this).children(':selected').val());
}).on('change', function(ev) {
    $(this).attr('class', '').addClass($(this).children(':selected').val());
});

CSS

select, option { background: #fff; }
select.foo, option[value="foo"] { background: red; }
select.bar, option[value="bar"] { background: green; }

Вот рабочая jsFiddle.

Вернемся к вопросу о будущем селекторов. Да - селекторы "Тема" предназначены именно для того, что вы упоминаете. Если/когда они вообще появятся в современных браузерах, вы можете адаптировать приведенный выше код для:

select { background: #fff; }
!select > option[value="foo"]:checked { background: red; }
!select > option[value="bar"]:checked { background: green; }

В качестве дополнительного примечания по-прежнему ведутся споры о том, должен ли ! идти до или после предмета. Это основано на стандарте программирования !something, означающем "не что-то". В результате, предметный CSS может выглядеть так:

select { background: #fff; }
select! > option[value="foo"]:checked { background: red; }
select! > option[value="bar"]:checked { background: green; }

Ответ 2

Итак, вот что я нашел на нем , возможно. Самая большая проблема заключается в том, что после того, как вы выбрали элемент, цвет фона не изменится, потому что элемент выбора фактически не перерисовывается (кажется более превалирующим в IE - go figure). Поэтому, даже если вы выбираете другой вариант, этот параметр не отображается в списке при повторном нажатии элемента выбора.

Чтобы устранить проблемы перерисовки в IE, потребовалось изменить font-size на минимальную сумму, + -. 1. Другое дело, которое, похоже, не хорошо документировано, заключается в том, что псевдо-класс :checked выполняет также работу над элементами управления.

fiddler, чтобы показать добавленный css, который делает это возможным.

Я только кратко играл с ним в Chrome и IE9, fyi.

EDIT: Очевидно, вам нужно будет установить значение [value = "x" ] на нужное значение для выделения специальных опций.

Ответ 3

Минималистское решение

У этого нет JS-зависимости (вам не нужен jQuery или что-то еще), это одна строка кода для события изменения, просто присваивание, которое извлекает значение в набор данных DOM. Кроме того, в производственной версии вы можете добавить data-chosen="something" к вашему выбору, чтобы установить опцию по умолчанию. Но есть случаи, когда это даже не нужно.

Все, что мы здесь делаем, - информируем элемент select о текущей опции. CSS может справиться с остальным.

    <select onchange=" this.dataset.chosen = this.value; ">
        ...
        ...
    </select>

Таким образом, вы уже можете прикрепить стили CSS для своих значений, например так:

select[data-chosen='opt3'] { 
    border: 2px solid red;
}

Смотрите на CodePen.

Примечание: это не обязательно должно быть слово "выбрано", используйте любое другое, если выбранные данные уже выделены для какой-то другой цели. Дело в том, чтобы получить значение.