Почему для работы этого стиля списка выбора требуется селектор CSS :invalid?

Я хочу, чтобы первый 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,.

Почему?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я полагаю, что ваше замешательство вызвано рядом недоразумений. Ваше понимание селектора 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>, чтобы оба этих селектора на основе проверки работали.

Я опытный пользователь html, но не учел различия между стилем самого выбора и стилем первого варианта. Я предположил, что между ними есть некоторое совпадение, но очевидно, что они стилизованы отдельно — что имеет смысл теперь, когда вы подробно описали это. Мы узнаем что-то новое каждый день. Спасибо!

lonix 17.02.2023 16:55

Интересно, что мое замешательство усугублялось тем фактом, что в Firefox это не отображается (серый элемент не серый). Я только что проверил Chromium, и он действительно отображается так, как вы описали.

lonix 17.02.2023 17:03

@Ionix Хм, я использую Firefox, и он для меня серый. Поведение между ними идентично (за исключением того, что параметр «активный/наведенный» в Firefox — это просто черный текст, тогда как в Chrome он выделяется синим цветом).

TylerH 17.02.2023 17:57

В вашем первом варианте выбора цвет серый, но когда он отображается в выборе, потому что выбранный цвет черный, он показывает черный цвет

.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>

Другие вопросы по теме