Объявления с встроенным стилем против объявлений с идентификатором ID [дубликат]

Использование vw, em & amp; сотрудничество. работает наверняка, но imo всегда нуждается в прикосновении человека для тонкой настройки.

Вот сценарий, который я только что написал на основе @ tnt-rox ' answer , который пытается автоматизировать этот touch:

$('#controller').click(function(){
	$('h2').each(function(){
    var
      $el = $(this),
      max = $el.get(0),
      el = null
    ;
    max =
      max
    ? max.offsetWidth
    : 320
    ;
    $el.css({
      'font-size': '1em',
      'display': 'inline',
    });
    el = $el.get(0);

    el.get_float = function(){
      var
        fs = 0
      ;
      if (this.style && this.style.fontSize) {
        fs = parseFloat(this.style.fontSize.replace( /([\d\.]+)em/g, '$1' ));
      }
      return fs;
    };

    el.bigger = function(){
      this.style.fontSize = (this.get_float() +0.1) +'em';
    };


    while ( el.offsetWidth < max ) {
      el.bigger();
    }
    // finishing touch.
    $el.css({
      'font-size': ((el.get_float() -0.1) +'em'),
      'line-height': 'normal',
      'display': '',
    });
	});  // end of ( each )
});	// end of ( font scaling test )
div {
  width: 50%;
  background-color: tomato;
  font-family: 'Arial';
}

h2 {
  white-space: nowrap;
}

h2:nth-child(2) {
  font-style: italic;  
}


Lorem ipsum dolor

Test String

Sweet Concatenation

Font Scaling

В основном уменьшает размер шрифта до 1em, а затем начинает увеличиваться на 0,1 до он достигает максимальной ширины.

jsFiddle

117
задан Igor Ivancha 30 January 2016 в 00:17
поделиться

7 ответов

Текущий Селекторный рабочий уровень 4-го уровня отлично справляется с описанием Специфика в CSS:

Специфичность сравнивается путем сравнения трех компонентов по порядку: специфичность с большим значением A является более конкретным; если два значения A привязаны, то специфика с большим значением B более конкретна; если оба значения B также связаны, то специфика с большим значением c более специфична; если все значения привязаны, эти два значения равны.

Это означает, что значения A, B и C полностью независимы друг от друга.

15 классов не дает вашему селектору показатель специфичности 150, он дает значение B 15. Одно значение A достаточно для того, чтобы одолеть это.

В качестве метафоры представьте себе семью из 1 родителя, 1 родителя и 1 ребенка. Это можно представить в виде 1,1,1 . Если у родителя 15 детей, это не делает их еще одним родителем ( 1,2,0 ). Это означает, что у родителя намного больше ответственности, чем у одного ребенка ( 1,1,15 ). ;)

В той же документации также говорится:

Из-за ограничений хранилища реализации могут иметь ограничения на размер A , B или c . Если это так, значения, превышающие предел, должны быть зажаты до этого предела, а не переполнения.

Это было добавлено для решения проблемы, представленной в ответе Фауста , в результате чего реализация CSS в 2012 году позволила перечислить значения специфичности друг другу.

Еще в 2012 году большинство браузеров реализовало ограничение в 255, но это ограничение было разрешено переполнением. 255 классов имели A, B, c показатель специфичности 0,255,0 , но 256 классов переполнены и имели оценку A, B, c из 1,0,0 . Внезапно наше значение B стало нашим значением A . Документация Уровни 4-го уровня полностью облучает эту проблему, заявляя, что предел никогда не может быть переполнен. С этой реализацией оба 255 и 256 классов имели бы ту же A, B, c оценку 0,255,0 .

Проблема, поставленная в ответе Фауста, с тех пор была исправлена ​​ в большинстве современных браузеров.

131
ответ дан Community 19 August 2018 в 05:59
поделиться
  • 1
    Важно: обратите внимание, что число 256 не указано в spec . Таким образом, этот ответ описывает (по общему признанию, полезную) деталь реализации. – Matt Fenwick 15 August 2012 в 19:09
  • 2
    Не только 256 не входит в спецификацию, как сказал @MattFenwick, но он также варьируется в зависимости от реализации. Похоже, он больше в Opera. В WeasyPrint и cssselect это «бесконечность»: я использую набор целых чисел вместо одного целого. – Simon Sapin 16 August 2012 в 11:12
  • 3
    Операция @Faust использует 16 бит вместо 8 – karlcow 16 August 2012 в 11:21
  • 4
    Честно говоря, этот ответ имеет более практическое описание, чем ответ Пекки. В основном то, что @Matt Fenwick говорит: то, что вы описываете, является практической реализацией спецификации. Недостаток в этом, но не тот, о чем нужно что-либо сделать, будь то авторы или исполнители. – BoltClock♦ 17 August 2012 в 10:35
  • 5
    256, похоже, недостаточно в текущих версиях webkit (Chrome и Safari), что еще более подчеркивает точку MattFenwick. – Blazemonger 12 February 2014 в 15:42
  • 6
    Через 6 лет после того, как я задал этот вопрос, он все еще получает потрясающие ответы, подобные этому, - спасибо за добавление в базу знаний, Джеймс. Отличный ответ! – Sam 19 March 2016 в 23:58
  • 7
    Спасибо за это. Я никогда не собирался публиковать ответ. Если бы я сделал это, это, вероятно, было бы очень длинной версией этого. Теперь это просто нужно подняться на вершину ... – BoltClock♦ 18 April 2016 в 15:03
131
ответ дан Community 30 October 2018 в 18:08
поделиться

В настоящее время я использую книгу CSS Mastery: Advanced Web Standards Solutions .

В главе 1, стр. 16 говорится:

Чтобы вычислить как конкретное правило, каждому типу селектора присваивается числовое значение. Специфика правила затем вычисляется путем суммирования значения каждого из его селекторов. К сожалению, специфика не вычисляется в базе 10, а в высоком, неуказанном, базовом числе. Это делается для того, чтобы очень специфичный селектор, такой как селектор идентификаторов, никогда не был переопределен множеством менее специфических селекторов, таких как селектор типов.

(выделение мое) и

Специфика селектора разбивается на четыре составляющих уровня: a, b, c и d.

  • , если стиль является встроенным, тогда a = 1
  • b = общее количество селекторов id
  • c = число классов, псевдокласса и селекторов атрибутов
  • d = число типов селекторов и селекторов псевдоэлементов

Далее говорится, что вы можете часто делать вычисления в базе 10, но только в том случае, если все столбцы имеют значения меньше 10.


В ваших примерах идентификаторы не стоят 100 баллов; каждый из них стоит [0, 1, 0, 0] очков. Следовательно, один id превосходит 15 классов, потому что [0, 1, 0, 0] больше, чем [0, 0, 15, 0] в системе с высоким номером.

8
ответ дан Matt Fenwick 19 August 2018 в 05:59
поделиться

Я не верю, что объяснение блога верно. Спецификация здесь:

http://www.w3.org/TR/CSS2/cascade.html#specificity

«Точки» из селектор классов не может быть более важным, чем селектор «id». Это просто не работает.

3
ответ дан Matthew Wilson 19 August 2018 в 05:59
поделиться
  • 1
    Как я сказал в своем ответе. ^^ Однако это имеет значение, если у вас больше одного типа (element, class, id). Но это довольно очевидно, если пятьдесят говорят, что красный цвет и 3 говорят, что синий хорошо, Има покраснел. – Sphvn 11 May 2010 в 09:47
  • 2
    Формулировка вокруг специфики, вероятно, не сильно изменилась между CSS2 и CSS2.1, но вы действительно должны указывать на спецификацию CSS2.1 в будущих дискуссиях, поскольку она полностью отменяет CSS2, который был вообще сломан в момент выпуска. – Robin Whittleton 16 August 2012 в 09:49

Я увлекаюсь сравнением ранжирования спецификаций с таблицей медалей Олимпийских игр (первый метод золота основан на количестве золотых медалей, затем серебряных, а затем и бронзовых).

Он также работает с вашим вопросом (огромное количество селекторов в одной группе специфичности). Специфичность рассматривалась каждой группой отдельно. В реальном мире я редко видел случай с более чем дюжиной селекторов).

Здесь также имеется неплохой калькулятор специфичности здесь . Вы можете поместить свой пример (#a и .a .b .c .d .e .f .g .h .i .j .k .l .m .n .o) и увидеть результаты.

Пример таблицы медалей Олимпийских игр в Рио-2016 выглядит как

4
ответ дан rkarczmarczyk 19 August 2018 в 05:59
поделиться

Я бы сказал, что:

Element < Class < ID

Я думаю, что они складываются только в зависимости от того, что вы получаете, если оно кратно тому же. Таким образом, класс всегда будет переопределять элемент и идентификатор всегда над классом, но если он относится к одному из четырех элементов, где 3 - синим, а 1 - красным, он будет синим.

Например:

.a .b .c .d .e .f .g .h .i .j .k .l
{
color: red;
}

 .m .n .o
{
color blue;
}

Должно получиться красным.

См. Пример http://jsfiddle.net/RWFWq/

", если Vings скажем, красный и 3 говорят, что синий колодец Има пойдет красным "

1
ответ дан Sphvn 19 August 2018 в 05:59
поделиться

Хороший вопрос.

Я не могу точно сказать - все статьи, которые мне удалось найти, избегают примера нескольких классов, например. здесь - но я предполагаю, что когда дело доходит до сравнения спецификации между селектором классов и идентификатором , класс вычисляется только с значением 15, независимо от того,

Это соответствует моему опыту в том, как себя ведет себя.

Однако должен быть некоторой укладкой классов, потому что

.a .b .c .d .e .f .g .h .i .j .k .l .m .n .o

более специфичен, чем

.o

, единственное, что у меня есть, это то, что специфика стековых классов вычисляется только друг против друга, но не против идентификаторов.

Update : Я на полпути получаю это сейчас. Это не система баллов, а информация о классах весом 15 баллов неверна. Это система нумерации на 4 части, очень хорошо объясненная здесь здесь .

Исходной точкой является 4 цифры:

style  id   class element
0,     0,   0,    0

Согласно пояснению W3C по специфичности , значения специфичности для вышеупомянутых правил:

#a            0,1,0,0    = 100
classes       0,0,15,0   = ... see the comments

Это система нумерации с очень большой (неопределенной?) базой.

Я понимаю, что, поскольку база очень большая, число в столбце 4 не может бить число > 0 в столбце 3, то же самое для столбца 2, столбец 1 .... Правильно ли это?

Мне было бы интересно, сможет ли кто-нибудь с лучшим пониманием в Math, чем я, объяснить систему нумерации и как преобразовать его в десятичный, когда отдельные элементы больше 9.

26
ответ дан Stephen Watkins 19 August 2018 в 05:59
поделиться
  • 1
    То потому что его между .o & amp; .a .b и т. д. Поэтому он будет рассматривать их коллективно. Но между ID и amp; класс, например: .a и #a, идентификатор всегда будет превышать. Он будет (я полагаю) считать только между классами, когда нет более подавляющего attr. Например, класс перейдет через элемент и id поверх класса. – Sphvn 11 May 2010 в 09:32
  • 2
    @ Озаки это то, что я тоже принимаю, но это противоречит тому, что ОП говорит о системе баллов. Должно быть больше в игре. Я бы хотел увидеть правила. – Pekka 웃 11 May 2010 в 09:35
  • 3
    Просто понял, что мы оба пришли к такому же выводу. Отличная работа! – Sam 11 May 2010 в 09:48
  • 4
    Для математической стороны мы можем работать здесь в базе 16 (поскольку ни один из индивидуальных номеров не превышает 15). Таким образом, 0,1,0,0 = 0100h = 256 0,0,15,0 = 00f0h = 240 256 & gt; 240, так что побеждает идентификатор. – Matthew Wilson 11 May 2010 в 10:08
  • 5
    Да, вы можете придумать вычисления специфичности как выполняемые в системе с большой базой. Я думаю, что термин «конкатенация» (также используется в спецификации) является гораздо лучшим описанием. (Пришел здесь, отвечая на новый вопрос, который оказывается обманом этого, иди рисунок ...) – BoltClock♦ 2 March 2012 в 23:46