Почему:: select был удален из спецификации CSS Selectors и как его специфичность работает против селекторов типов?

Некоторые вопросы об использовании CSS для указания цвета выделенного текста:

  • https://developer.mozilla.org/En/CSS/::selection говорит, что

    ::selection был разработан для CSS3 Селекторы, но удалены из текущий проект CSS3. Во всяком случае, это реализовано в браузерах и поддержке будет продолжаться.

    Почему это было удалено?

  • Представьте, что в CSS по умолчанию, реализованном браузером, существует такое же правило, как и следующее:

    ::selection { background-color: Highlight; color: HighlightText; }
    

    Далее представьте, что правило, подобное приведенному ниже, определяется в любой специальной таблице стилей, определенной сайтом:

    body { background-color: white }
    

    Учитывая эти правила, каков будет цвет фона выбранного текста тела: было бы оно white или Highlight?

    Возможно, правило в таблице стилей автора должно переопределить правило по умолчанию: поскольку в соответствии со спецификой, body имеет такое же значение, как ::selection, и указан позже (и поэтому должен переопределять предыдущую запись).

    С другой стороны, это приведет к тому, что текст будет невидимым при его выборе (потому что если Highlight является синим, а HighlightText - белым, чтобы выделенный текст был белым на синем, то переопределение background-color выделенного текста, чтобы он был белым, чтобы он был белым на белом).

  • Предполагая, что поведение на шаге 2 нежелательно, как его избежать?

    • Скажите, что это ошибка в таблице стилей пользователя, которая никогда не должна указывать background-color без указания color?

    • Скажите, что body не соответствует выбранному тексту тела, кроме случаев, когда псевдо-элемент ::selection указан как часть селектора?

Ответ 1

Селектора типов (например, body) и селекторы псевдоэлементов (например, ::selection) действительно имеют одинаковую специфичность, но < сильная > специфика только вступает в игру, когда два селектора выбирают один и тот же элемент.

Селектор body не выбирает выделенный текст или любой текст вообще - он выбирает элемент <body>. Его элемент, а не его текст, который имеет цвет фона.

В то время как ::selection выбирает воображаемый элемент, который окружает текущий выбранный текст на странице. Таким образом, не существует конфликта между стилями, установленными на body и ::selected, поскольку селекторы выбирают разные вещи.

Пример

Представьте, что у вас был следующий HTML:

<body>
    I am some body text.

    <p>I am some text in a paragraph.</p>
</body>

И следующий CSS:

p {
    background-color: red;
}

body {
    background-color: white;
}

Оба селектора имеют одинаковую специфичность, но фон <p> s по-прежнему будет красным, потому что это не элемент <body>.

То же самое верно, если вы замените p на ::selection - выбранный фон текста будет красным, потому что текст внутри элемента <body> не является элементом <body>.

Итак, в основном, что вы сказали здесь:

body не соответствует выбранному тексту тела, кроме случаев, когда псевдо-элемент ::selection указан как часть селектора

Ответ 2

Следующий стиль:

body { background-color: white }

применяется к цвету фона вашей страницы.

С другой стороны, это правило:

::selection { background-color: Highlight; color: HighlightText; }

применяет стили, когда вы выбираете текст на своей странице.

Таким образом, они делают совершенно разные вещи, и нет никаких сомнений в их столкновении.

Ответ 3

Почему это было удалено?

Хорошо, это будет вопрос, который вам нужно будет задать комитету W3C, который удалил его из черновика. Я понимаю, что в сообществе W3C было много внутренних потрясений, так как они начали писать черновики HTML5 и CSS3. Некоторые люди, которые запускают проекты, разрабатывающие браузеры (и я не буду входить в имена), хотели, чтобы это было сделано одним способом, и разработчики были прокляты. Сообщество разработчиков захотело сделать это по-другому, и поэтому началась вражда над тем, кто должен контролировать W3C.

Учитывая эти правила, каков будет цвет фона выделенного текста тела: будет ли он белым или выделенным?

Sarfraz ударил его по голове здесь, псевдо-класс: select произвел только выделенный текст. Поэтому в вашем примере, когда вы выделяете что-то, цвет фона меняется на "Выделение", когда он не выбран, он возвращается к белым.

Я не тестировал этот конкретный пример, но вот что я понимаю об этом

Ответ 4

::selection будет отменять цвет фона после выбора и вернет его в body{background-color: white;} после удаления текста.
мы просто должны всегда обеспечивать правильные цвета и значения фона как для выбора, так и для основного стиля.