Почему # селектор меньшей специфики, чем что-нибудь?

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

10
задан BoltClock 16 August 2012 в 19:06
поделиться

4 ответа

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

9
ответ дан 3 December 2019 в 23:48
поделиться

По мне, и я основываю это исключительно на мнении, это ожидаемое "естественное" поведение.

Рассмотрим следующее:

Вы знаете, как рассчитывается специфичность 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 .

3
ответ дан 3 December 2019 в 23:48
поделиться

Как

Правила 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 (в системе счисления с большим основанием) дает специфику. Также, когда правила имеют одинаковую специфичность, побеждает последнее.

Пример

  • outer span: a=0, b=1, c=0, d=1 --> 101

  • span#inner: a=0, b=1, c=0, d=1 --> 101
  • div#outer span#inner: a=0, b=2, c=0, d=2 --> 202

Попробуйте переставить правила 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).

1
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: