Большая полужирная Caps Lock TL; DR:
Я ЗНАЮ, КАК СЕЛЕКТОРНАЯ СПЕЦИФИКА ОПРЕДЕЛЯЕТСЯ, я ДУМАЮ ИСПОЛЬЗОВАНИЕ IT ИСПОРЧЕННЫЕ ПРЕДПОЛОЖЕНИЯ И я, CAN СОЗДАЕТ РЕЗЕРВНУЮ КОПИЮ МОИХ РАЗДРАЖЕНИЙ С ДОПУСТИМЫМИ ОТНОШЕНИЯМИ ТЕОРИИ МНОЖЕСТВ, НЕ ОТВЕЧАЙТЕ, ОБЪЯСНЯЯ ПРАВИЛА ВЫЧИСЛЕНИЯ W3 ДЛЯ СПЕЦИФИКИ, ЧИТАЙТЕ, ВОПРОС <-считал это.
Это беспокоило меня в течение некоторого времени, когда я пишу стиль для некоторого HTML, который был бы подобен ниже:
...
<div id="outer">
<span id="inner"></span>
<span></span>
...
</div>
...
Почему правила специфики сделали бы селектор "#outer промежутком" более конкретный, чем "#inner"? Идентификатор уникален, поэтому когда я говорю "#inner", я могу ТОЛЬКО обращаться к одному элементу, итак, почему это менее конкретно? Я понимаю правила об определении специфики, я просто задаюсь вопросом, было ли это намеренным или случайным, также если любой знает, как я могу задать этот вопрос людям, которые пишут стандарты CSS.
Я должен отметить, я действительно понимаю, что МОГ использовать #outer #inner для обеспечения максимальной специфики, но это кажется, что побеждает цель идентификатора во-первых. Это также - проблематичное решение для того, когда я пишу шаблоны, и я не уверен, что один идентификатор будет в другом. Я не ищу обходное решение, просто ответ теории.
Моим вопросом является теория, полностью на основе логики набора. Хотя я имею, то, что, если Вы определяете правило для 1 объекта n возможных объектов, который не так конкретен, как можно пойти? Почему был бы создатели селекторов CSS делать правило, которое могло определить m объекты n возможных объектов, где m является подмножеством n как более определенное правило?
Моя мысль - то, что #id был бы эквивалентом идентификации 1 объекта по имени, и #id вяз будет определять группу своим отношением к объекту по имени. Это - полностью счетчик, интуитивный для вызова именованного объекта менее конкретным, чем группа без имени с именованным отношением.
Я думаю, что идея «почему» - это скорее точка зрения «поколения» или «авторитета».Если #Parent
(любого поколения назад) скажет, что всем моим детям, отвечающим критерию «x» (в вашем случае, span
), будет передано наследование «y» ( независимо от свойства css), не имеет значения, что хочет отдельный человек #Child
, ему нужны полномочия #Parent
, чтобы получить его, если родитель заявил иное.
Добавлено при редактировании: Встроенный стиль
будет тогда мятежным ребенком, а ! Important
жестоким родителем. Edit: Я оставил это для юмора, но не думаю, что это отражает идею так же хорошо, как мое более позднее заявление ниже.
Добавлено при редактировании вопроса в комментарии: Дано:
#outer span ...
#inner (which is a span element)
Затем, чтобы обеспечить выбор #inner, я рекомендую:
body span#inner (*edit:* just span#inner works *edit:* if defined later)
или дать телу идентификатор и
#bodyId #inner
Конечно, их все еще можно переопределить. Чем больше вовлечено "поколений", тем труднее изменить поведение из-за консенсуса поколений (если прадедушка, дедушка и родитель согласны, вероятно, ребенку не сойдет с рук заниматься своими делами) .
Мне пришлось существенно переписать этот раздел при более позднем редактировании Учитывая этот HTML:
<div id="grandparent">
<div id="parent">
<div id="child"></div>
</div>
</div>
Я ранее заявлял, что « #parent div
имеет больший авторитет, чем #grandparent div
. Оба имеют авторитет поколений, фактически," равный "авторитет поколений , но побеждает первое, «более близкое» поколение ». Ошибка в том, что «ближе» к поколению не имеет значения, а скорее последнее, кому дается власть.При равных полномочиях побеждает тот, кто назначен последним.
Думаю, я все еще могу придерживаться этого утверждения: помня об этом, такой селектор, как #child [id] (который перевешивает оба предыдущих селектора), рассматривает свои атрибуты как разрешения для большей власти управлять тем, что контролирует сам. Наличие # уже давало ему полномочия, но недостаточно, чтобы переопределить # более раннего поколения, если это более раннее поколение также несет другой селектор, предоставляющий больше полномочий.
Итак, #grandparent div
перевешивает #child
, но не div # child
, если он последним получил полномочия [добавил это] , а не #child [id]
, потому что [id]
увеличивает полномочия #child
на самоуправление. При равной избирательности побеждает тот, кому предоставлены полномочия последним.
Опять же, атрибут style
, устанавливающий свойство стиля, на самом деле действует больше как высшее наделение полномочиями управлять собой, предполагая, что что-то большее «! Important
» не принимает этого прочь.
В качестве итогового утверждения для ответа «почему» это именно так (а не в соответствии с теорией «множеств»), я считаю, что речь идет не о точности или даже о специфичности ] (хотя используется именно этот термин), так как тогда можно было бы ожидать, что #ChildsName
будет последним уникальным словом в этом вопросе, потому что больше не нужно говорить ничего конкретного.Скорее, хотя в документации это может не указываться как таковое, «избирательность» на самом деле структурирована на предоставлении полномочий . Кто имеет наибольшее количество «прав» на управление элементом и кому дана «ничья», кто последним получил эти права.
По мне, и я основываю это исключительно на мнении, это ожидаемое "естественное" поведение.
Рассмотрим следующее:
Вы знаете, как рассчитывается специфичность CSS, и из этой формулы мы знаем, что #outer span
более специфичен, чем #outer
, что необходимо для правильной работы CSS в целом, и это имеет смысл. #outer span
также более специфичен, чем #inner
, что также логично в рамках области таблицы стилей (#inner
- это только идентификатор, а #outer span
- это идентификатор плюс элемент, поэтому, чтобы их ранжировать, если мы просто смотрим на таблицу стилей, более квалифицированный должен быть более специфичным).
Здесь происходит то, что вы применяете контекст разметки HTML и говорите: "Ну, это не имеет смысла". Чтобы все работало так, как вы ожидаете, браузер должен воспринимать следующее:
находится внутри
- Применяются правила стилей для
#outer span
и #inner
- Правило
#outer span
более специфично, чем #inner
- Но подождите!
находится внутри , поэтому игнорируйте вычисления, основанные на таблице стилей, и утверждайте, что #inner
более специфичен
Этот последний шаг делает процесс определения полностью основанным на структуре HTML, что делает невозможным определение специфичности только в терминах CSS. Я лично считаю, что это сделает весь процесс более запутанным и трудноопределимым, но вы можете с этим не согласиться.
0
ответ дан 3 December 2019 в 23:48
поделиться
Поскольку #outer span
имеет как селектор идентификатора, так и селектор элементов. Этот селектор элемента делает его более весомым, чем #inner
.
Первый означает «выбрать любой элемент, найденный внутри любого элемента ID внешнего
]».
Последнее означает «выбрать любой элемент с идентификатором внутренний
]». Он не знает, где находится #inner
в вашем HTML-документе, поэтому конкретика меньше.
Возможно, вы могли бы либо попробовать вместо этого попробовать #outer #inner
, либо span # inner
#outer span # inner
.
Как
Правила W3C для вычисления специфичности:
- считать 1, если объявление из является атрибутом 'style', а не правило с селектором, 0 в противном случае (= a) (В HTML значения атрибута элемента "style" являются значениями таблицы стилей правила. Эти правила не имеют селекторов, поэтому a=1, b=0, c=0 и d=0.)
- подсчитать количество атрибутов ID в селекторе (= b)
- подсчитать количество других атрибутов и псевдоклассов в селекторе (= c)
- подсчет количества имен элементов и псевдоэлементов в селекторе (= d)
Специфика основана только на форме селектора. В частности селектор вида "[id=p33]" является считается селектором атрибутов (a=0, b=0, c=1, d=0), даже если атрибут id атрибут определен как "ID" в DTD исходного документа.
Конкатенация четырех чисел a-b-c-d (в системе счисления с большим основанием) дает специфику. Также, когда правила имеют одинаковую специфичность, побеждает последнее.
Пример
Попробуйте переставить правила 1 и 3: http://jsfiddle.net/Wz96w/
Почему
Я думаю, что #inner не определяет уникальный элемент. Хотя это только 1 элемент на странице, этот ID может быть совершенно другим элементом на другой странице.
Одна страница:
<div id="outer">
<div id="inner"> ... </div>
</div>
Другая страница:
<ul id="outer">
<li>main1
<ul id="inner">
<li>sub1</li>
<li>sub2</li>
</ul>
</li>
<li>main2</li>
</ul>
Хотя, я бы не стал кодировать это таким образом. Думаю, это объясняет, почему добавление элемента (ul#outer
против #outer
) заслуживает дополнительной конкретики.
Для пункта о потомках я визуализирую DOM для вашей разметки. Правило #outer span
имеет длину пути больше, чем #inner
. Поэтому в данном случае оно определяет более конкретное поддерево, поэтому ему следует присвоить большую специфичность (и #outer #inner li
должно быть [стоит] больше, чем #inner li
).