Могу ли я иметь несколько:перед псевдоэлементами для одного и того же элемента?
возможно ли иметь несколько :before
pseudos для одного и того же элемента?
.circle:before {
content: "CF";
font-size: 19px;
}
.now:before{
content: "Now";
font-size: 19px;
color: black;
}
Я пытаюсь применить вышеуказанные стили к одному и тому же элементу с помощью jQuery, но применяется только самый последний, а не оба.
2 ответов
в CSS2.1, элемент может иметь не более одного псевдо-элемента любого типа в любое время. (Это означает, что элемент может иметь как :before
и :after
псевдо-элемент - он просто не может иметь более одного каждого вида.)
в результате, когда у вас есть несколько :before
правила, соответствующие одному и тому же элементу, они будут каскадировать и применяться к одному :before
псевдо-элементом, как с нормальным элементом. В вашем примере, конечный результат выглядит это:
.circle.now:before {
content: "Now";
font-size: 19px;
color: black;
}
как вы можете видеть, только content
объявление с наивысшим приоритетом (как уже упоминалось, последнее) вступит в силу - остальные объявления отбрасываются, как и в случае с любым другим свойством CSS.
это поведение описано в селекторы из спецификации CSS2.1:
псевдо-элементы ведут себя так же, как реальные элементы в CSS с исключениями, описанными ниже и в другом месте.
это означает, что селекторы псевдо-элементы работают так же, как селекторы для нормальных элементов. Это также означает, что каскад должен работать одинаково. Странно, в CSS2.1 представляется только ссылка; ни С помощью CSS3-селекторов, ни С помощью CSS3-каскад упомяните об этом вообще, и еще предстоит выяснить, будет ли это разъяснено в будущей спецификации.
если элемент может соответствовать более чем один селектор с тем же псевдо-элементом, и вы хотите, чтобы все они каким-то образом применялись, вам нужно будет создать дополнительные правила CSS с комбинированными селекторами, чтобы вы могли точно указать, что должен делать браузер в этих случаях. Я не могу привести полный пример, включая content
свойство здесь, так как не ясно, например, должен ли символ или текст быть первым. Но селектор нужно для Этот комбинированный правило либо .circle.now:before
или .now.circle:before
- какой бы селектор вы ни выбрали личные предпочтения, поскольку оба селектора эквивалентны, это только значение content
свойство, которое вам нужно будет определить самостоятельно.
Если вам все-таки нужен конкретный пример, см. Мой ответ этот же вопрос.
устаревшая спецификация css3-content содержит раздел о вставке нескольких ::before
и ::after
псевдо-элементами используя нотацию, совместимую с CSS2.1 каскад, но обратите внимание, что документ устарел - он не обновлялся с 2003 года, и никто не реализовал эту функцию в последнее десятилетие. Хорошей новостью является то, что заброшенный документ активно подвергается переписыванию под видом css-content-3 и css-псевдо-4. Плохая новость заключается в том, что функция множественных псевдоэлементов нигде не встречается ни в одной из спецификаций, предположительно из-за отсутствия интереса к реализации.
Если ваш основной элемент имеет некоторые дочерние элементы или текст, вы можете использовать его.
расположите свой основной элемент относительно (или абсолютный / фиксированный) и используйте оба :до и после позиционирования абсолютного (в моей ситуации он должен быть абсолютным, не знаю о ваших).
теперь, если вы хотите еще один псевдо-элемент, прикрепите Абсолют: раньше к одному из дочерних элементов основного элемента (если у вас есть только текст, поместите его в промежуток, теперь у вас есть элемент), который не относительный / абсолютный / фиксированный.
этот элемент начнет действовать так, как будто его владелец является вашим основным элементом.
HTML-код
<div class="circle">
<span>Some text</span>
</div>
в CSS
.circle {
position: relative; /* or absolute/fixed */
}
.circle:before {
position: absolute;
content: "";
/* more styles: width, height, etc */
}
.circle:after {
position: absolute;
content: "";
/* more styles: width, height, etc */
}
.circle span {
/* not relative/absolute/fixed */
}
.circle span:before {
position: absolute;
content: "";
/* more styles: width, height, etc */
}