Я хочу, чтобы первый option
в select
отображался серым цветом. Я нашел рабочее решение здесь.
Важные биты:
/* fails */
.select1 option[value = ""] {
color: #999999;
}
/* works */
.select2:invalid,
.select2 option[value = ""] {
color: #999999;
}
<div>Fails:</div>
<select class = "select1">
<option value = "" selected>Select a fruit</option>
<option>Apple</option>
<option>Banana</option>
</select>
<br/><br/>
<div>Works:</div>
<select class = "select2" required>
<option value = "" selected>Select a fruit</option>
<option>Apple</option>
<option>Banana</option>
</select>
Запустите демонстрацию, и вы увидите, что первый пример не работает, а второй работает.
Я ожидаю, что селектор CSS .select2:invalid, .select2 option[value = ""]
будет означать «или-или»; но это не удается без ведущего .select2:invalid,
.
Почему?
Я полагаю, что ваше замешательство вызвано рядом недоразумений. Ваше понимание селектора CSS с запятой, означающей «или-или», верно, но я думаю, что это единственное, что вы поняли правильно.
Во-первых, элементы option и элемент select — это две разные вещи; то, что вы видите в раскрывающемся списке, — это элемент <select>
, а не выбранный в данный момент элемент <option>
... чтобы просмотреть элементы <option>
, вам нужно активировать элемент выбора, чтобы отобразить параметры... обратите внимание, как вы видите значение элемента выбора и такое же значение, как один из вариантов, когда вы это делаете?
Во-вторых, селектор CSS для вашего первого раскрывающегося списка — .select1 option[value = ""]
. Это стилизация только опции, а не самого выбранного элемента. Если вы нажмете на первый выбранный элемент, а затем наведете курсор на параметры «Яблоко» или «Банан», вы увидите, что параметр «Выбрать фрукт» неактивен. Повторяю, выделено серым цветом... потому что это то, к чему говорит ваш селектор, чтобы применить стиль.
Во втором раскрывающемся списке есть тот же селектор (но для .select2
) ... что означает, что параметры по-прежнему будут выделены серым цветом, где это необходимо. Но у него также есть .select2:invalid
, первая часть кикера. .select2:invalid
применяется к элементу <select>
, а не к опциям... и возникает всякий раз, когда выбранная в данный момент опция является недопустимой.
Как он узнает, какие из них недействительны, — это вторая часть кикера: у вас есть атрибут required
на втором элементе <select>
, но не на первом. Поскольку на втором элементе есть required
, он знает, что он «недействителен», если только у него не выбран параметр с непустым значением.
Я также, вероятно, должен объяснить в этот момент, что значение <option>
— это то, что по умолчанию находится в атрибуте value = ""
; если атрибут value = ""
не объявлен, то используется содержимое элемента <option>
. Таким образом, значения для вашего рабочего раскрывающегося списка: empty
, Apple
и Banana
. Недопустимое значение empty
, потому что в раскрывающемся списке установлен атрибут required
.
Подводя итог, как вы, возможно, были близки к открытию, нужны и селектор .select2:invalid
, и .select2 option[value = ""]
, но не только это; вам также нужен атрибут required
в элементе <select>
, чтобы оба этих селектора на основе проверки работали.
Интересно, что мое замешательство усугублялось тем фактом, что в Firefox это не отображается (серый элемент не серый). Я только что проверил Chromium, и он действительно отображается так, как вы описали.
@Ionix Хм, я использую Firefox, и он для меня серый. Поведение между ними идентично (за исключением того, что параметр «активный/наведенный» в Firefox — это просто черный текст, тогда как в Chrome он выделяется синим цветом).
В вашем первом варианте выбора цвет серый, но когда он отображается в выборе, потому что выбранный цвет черный, он показывает черный цвет
.select1,
.select1 option[value = ""]{
color: #999999;
}
дайте как значение select, так и option значение цвета, который вы хотите, и ваш вариант дает другой цвет, подобный этому. Это решит вашу проблему
.select1 option{
color: black;
}
/* fails */
.select1,
.select1 option[value = ""]{
color: #999999;
}
.select1 option{
color: black;
}
/* works */
.select2:invalid,
.select2 option[value = ""] {
color: #999999;
}
<div>Fails:</div>
<select class = "select1">
<option value = "" selected>Select a fruit</option>
<option>Apple</option>
<option>Banana</option>
</select>
<br/><br/>
<div>Works:</div>
<select class = "select2" required>
<option value = "" selected>Select a fruit</option>
<option>Apple</option>
<option>Banana</option>
</select>
Я опытный пользователь html, но не учел различия между стилем самого выбора и стилем первого варианта. Я предположил, что между ними есть некоторое совпадение, но очевидно, что они стилизованы отдельно — что имеет смысл теперь, когда вы подробно описали это. Мы узнаем что-то новое каждый день. Спасибо!