переопределение класса, когда два класса назначены одному div

85

Я создавал <div>тег, в котором я хотел применить два класса для <div>тега, который будет галереей эскизов. Один класс для его положения, а другой класс для его стиля. Таким образом, я мог применить стиль, у меня были некоторые странные результаты, которые поставили меня перед вопросом.

Можно ли присвоить <div>тегу два класса ? Если да, то какой из них преобладает над другим или какой из них имеет приоритет?

Даниэль Рамирес-Эскудеро
источник

Ответы:

155

Div может быть назначено несколько классов. Просто разделите их в имени класса такими пробелами:

<div class="rule1 rule2 rule3">Content</div>

Этот DIV будет соответствовать никаким правилам стиля для трех различных селекторов класса: .rule1, .rule2и .rule3.

Правила CSS применяются к объектам на странице, которые соответствуют их селекторам в том порядке, в котором они встречаются в таблице стилей, и если существует конфликт между двумя правилами (более чем одно правило пытается установить один и тот же атрибут), то специфичность CSS определяет, какой правило имеет приоритет.

Если специфика CSS одинакова для конфликтующих правил, то более позднее правило (определенное позже в таблице стилей или в более поздней таблице стилей) имеет приоритет. Порядок имен классов в самом объекте не имеет значения. Порядок стилей в таблице стилей имеет значение, если специфика CSS такая же.

Итак, если у вас были такие стили:

.rule1 {
    background-color: green;
}

.rule2 {
    background-color: red;
}

Затем, поскольку оба правила соответствуют div и имеют точно такую ​​же специфичность CSS, второе правило применяется позже, поэтому оно будет иметь приоритет, а фон будет красным.


Если одно правило имело более высокую специфичность CSS ( div.rule1более чем .rule2):

div.rule1 {
    background-color: green;
}

.rule2 {
    background-color: red;
}

Тогда он будет иметь приоритет, а цвет фона здесь будет зеленым.


Если два правила не противоречат друг другу:

.rule1 {
    background-color: green;
}

.rule2 {
    margin-top: 50px;
}

Тогда будут применяться оба правила.

jfriend00
источник
+1 Еще одна отличная ссылка, объясняющая специфику CSS: maxdesign.com.au/articles/css-cascade
Fabian Barney
ответ ниже думаю более правильный, если не ошибаюсь?
nagates
@nagates - Какой ответ вы считаете более правильным и почему? Есть много ответов «ниже», поэтому я не знаю, какой из них вы имели в виду, и не знаю, почему вы считаете его «более правильным». Я буду счастлив улучшить или уточнить свой ответ, если вы сможете объяснить свои мысли.
jfriend00
jfriend00: ответ @ erez-sason ниже тот, о котором он имеет в виду. Это странно, потому что я думал, что это работает так, как вы описали, но его примеры явно работают так, как он описывает. Интересно, есть ли различие между встроенными стилями и связанными стилями.
Адам МакКормик,
1
@AdamMcCormick - Мой ответ уже содержит информацию из этого ответа в качестве одного из примеров, которые я привожу: Затем, поскольку оба правила соответствуют div и имеют точно такую ​​же специфичность CSS, второе правило применяется позже, поэтому оно будет иметь приоритет и фон будет красным. . Я показываю несколько возможных сценариев и объясняю их все, а не только один сценарий. OP не был конкретным с их кодом, поэтому я выбрал общее объяснение, которое охватывает несколько вариантов и включает самый простой вариант.
jfriend00
28

Фактически, класс, который определен последним в css, применяется к вашему div.

проверить это:

красный последний в css

.blue{ color: blue; }
.red { color: red;  }
<div class="blue red">blue red</div>
<div class="red blue">red blue</div>

против

синий последний в css

.red { color: red;  }
.blue{ color: blue; }
<div class="blue red">blue red</div>
<div class="red blue">red blue</div>

Эрез Сэсон
источник
4
Это гораздо лучший ответ. Принятый ответ вводит в заблуждение.
SD
4

Если вы спрашиваете о том, что у них такое же свойство, тогда, согласно правилу CSS, берется последнее утверждение.

<div class="red green"></div>

CSS

.red{
 color:red;
}
.green{
 color:green;
}

В соответствии с приведенным выше примером он принимает последний оператор дерева CSS, который имеет расширение .green .

Sandeep
источник
3

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

Прочтите о приоритете CSS, чтобы увидеть, как это работает.

Хенрик Аммер
источник
Вы имеете в виду физически последний в самом CSS или последнее имя класса в списке?
Brain2000
Он означает на самом деле последний в списке всех правил CSS, определенных повсюду, а не порядок в списке атрибутов, к сожалению для тех, кто использует методы JavaScript classList, которые, на мой взгляд, сочтут это дизайнерское решение неожиданным и бесполезным.
Дэвид Спектор
3

Элементу можно назначить множество классов, вы просто разделяете их пробелом

<div class="myClass aSecondClass keepOnClassing stayClassySanDiego"></div>

Из-за каскада в CSS к элементу будут применены правила перезаписи, расположенные ближе всего к концу документа.

Итак, если у вас есть

.myClass
{
    background: white;
    color: blue;
}

.keepOnClassing
{
    color: red;
}

Будет использован красный цвет, но не цвет фона, так как он не был перезаписан.

Вы также должны учитывать специфику CSS, если у вас есть более конкретный селектор, будет использоваться этот:

.myClass
{
    background: white;
    color: blue;
}

div.myClass.keepOnClassing
{
    background: purple;
    color: red;
}

.stayClassySanDiego
{
    background: black;
}

Здесь будет использоваться второй селектор, поскольку он более конкретен.

Вы можете взять с взглянуть на него все здесь .

Кайл
источник
Проголосовали за лучшее название класса всех времен (а также за полное и точное)
Оливер Тернер,