Кратко
СкопированоКогда задано свойство content
, то элемент заменяется на значение этого свойства. В качестве значения могут быть переданы различные типы: изображение, градиент или текст.
Пример
Скопированоa::after { content: "👉"; margin-right: 5px;}
a::after { content: "👉"; margin-right: 5px; }
Как пишется
СкопированоИзображение в качестве содержимого. Может применяться к любому элементу.
div { content: url("http://www.example.com/test.png");}
div { content: url("http://www.example.com/test.png"); }
Все значения ниже могут применяться ТОЛЬКО к псевдоэлементам :
и :
.
Строка текста:
div::before { content: "prefix";}
div::before { content: "prefix"; }
Значения счётчиков с использованием функций counter
и counters
:
div::before { content: counter(chapter_counter);}div::before { content: counters(section_counter, ".");}
div::before { content: counter(chapter_counter); } div::before { content: counters(section_counter, "."); }
Значения HTML-атрибутов с использованием функции attr
:
div::before { content: attr(value string);}
div::before { content: attr(value string); }
Ключевые слова, зависящие от языка страницы и положения в тексте:
div::before { content: open-quote; content: close-quote; content: no-open-quote; content: no-close-quote;}
div::before { content: open-quote; content: close-quote; content: no-open-quote; content: no-close-quote; }
Использование нескольких значений одновременно. Исключение — ключевые слова normal
и none
:
div::before { content: open-quote counter(chapter_counter);}
div::before { content: open-quote counter(chapter_counter); }
Ключевые слова, которые нельзя комбинировать с другими значениями:
div::before { content: normal; content: none;}
div::before { content: normal; content: none; }
Как понять
СкопированоЧаще всего свойство content
применяется к псевдоэлементам :
и :
. В зависимости от значения свойства псевдоэлемент принимает тот или иной вид:
-
Если значением является просто строка, то она подставляется на место псевдоэлемента. Как правило, это до или после текстового содержимого тега.
-
Есть несколько зарезервированных слов, которые также можно указывать в качестве значения. Используются они как совместно со свойством
quotes
, так и в автоматическом режиме:open
обозначает открывающую кавычку цитаты для текущего языка. Например, для русского это будет открывающая «ёлочка» (- quote «
);close
обозначает закрывающую кавычку цитаты для текущего языка. Например, для русского это будет закрывающая «ёлочка» (- quote »
);
<blockquote> Вспомните, как говорили мушкетёры: <q>Один за всех, все за одного!</q></blockquote>
<blockquote> Вспомните, как говорили мушкетёры: <q>Один за всех, все за одного!</q> </blockquote>
blockquote { quotes: "«" "»" "„" "”";}blockquote::before { content: open-quote;}blockquote::after { content: close-quote;}
blockquote { quotes: "«" "»" "„" "”"; } blockquote::before { content: open-quote; } blockquote::after { content: close-quote; }
Результат
«Вспомните, как говорили мушкетёры: „Один за всех, все за одного!”»
no
и- open - quote no
используются, когда не нужно отображать кавычки, но при этом продолжать увеличивать уровень вложенности;- close - quote - Если значением является результат выполнения функций
counter
или( ) counters
, то псевдоэлемент будет содержать вычисленное значение счётчика в текущий момент. Эти функции работают совместно со свойствами( ) counter
и- reset counter
;- increment - Очень интересным значением является результат выполнения функции
attr
.( )
С помощью неё можно вывести в псевдоэлемент значение любого атрибута тега:
<p> Ваш рейтинг: <span data-tip="Вычисляется на основе активности">212</span></p>
<p> Ваш рейтинг: <span data-tip="Вычисляется на основе активности">212</span> </p>
[data-tip] { position: relative; cursor: help;}[data-tip]:hover::after { opacity: 1; visibility: visible;}[data-tip]::after { content: attr(data-tip); position: absolute; top: 140%; left: 50%; transform: translateX(-50%); opacity: 0; visibility: hidden;}
[data-tip] { position: relative; cursor: help; } [data-tip]:hover::after { opacity: 1; visibility: visible; } [data-tip]::after { content: attr(data-tip); position: absolute; top: 140%; left: 50%; transform: translateX(-50%); opacity: 0; visibility: hidden; }
Ну и конечно же разработчики спецификации позаботились о нас и сделали возможность собрать сразу несколько значений в общую строку:
<p>Вы можете пройти <a href="https://google.com">по ссылке</a></p>
<p>Вы можете пройти <a href="https://google.com">по ссылке</a></p>
@media print { a[href]::after { content: " [" attr(href) "] "; }}
@media print { a[href]::after { content: " [" attr(href) "] "; } }
В результате так выведется на печать:
- Значением свойства
content
может быть ссылкаurl
на изображение. В этом случае содержимое элемента заменяется на это изображение. Нужно помнить о том, что при таком способе мы не можем управлять размером изображения.( . . . )
<div class="replaced" data-alt="Mozilla logo">Mozilla</div>
<div class="replaced" data-alt="Mozilla logo">Mozilla</div>
.replaced { content: url("https://mdn.mozillademos.org/files/12668/MDN.svg");}#replaced::after { /* не будет отображаться, если замена элемента поддерживается */ content: " (" attr(data-alt) ")";}
.replaced { content: url("https://mdn.mozillademos.org/files/12668/MDN.svg"); } #replaced::after { /* не будет отображаться, если замена элемента поддерживается */ content: " (" attr(data-alt) ")"; }
Результат
Подсказки
Скопировано💡 Если мы используем url
в качестве значения свойства content
для тега, то псевдоэлементов у такого тега не будет.
На практике
Скопированосоветует Скопировано
🛠 Свойство content
со значением counter
активно применяется в случаях, когда нужно расставить автоматическую нумерацию элементов, не относящихся к спискам:
<section> <h2>Внутренний механизм</h2> <p>Механизм счётчика состоит из:</p> <ul> <li>кнопки;</li> <li>пронумерованных кругов;</li> <li>колеса прокрутки;</li> </ul></section><section> <h2>Принцип действия</h2> <p>Принцип действия..</p></section><section> <h2>См. также</h2> <ul> <li>Механический счётчик</li> <li>Электронный счётчик импульсов</li> </ul></section>
<section> <h2>Внутренний механизм</h2> <p>Механизм счётчика состоит из:</p> <ul> <li>кнопки;</li> <li>пронумерованных кругов;</li> <li>колеса прокрутки;</li> </ul> </section> <section> <h2>Принцип действия</h2> <p>Принцип действия..</p> </section> <section> <h2>См. также</h2> <ul> <li>Механический счётчик</li> <li>Электронный счётчик импульсов</li> </ul> </section>
body { counter-reset: cnt;}section { counter-increment: cnt; position: relative;}section h2::before { content: counter(cnt); position: absolute; left: -45px; top: -2px;}
body { counter-reset: cnt; } section { counter-increment: cnt; position: relative; } section h2::before { content: counter(cnt); position: absolute; left: -45px; top: -2px; }
🛠 ...или красиво оформить нумерованный перечень
<h2>Наши преимущества:</h2><ul class="benefits"> <li class="benefits-item">Низкие цены</li> <li class="benefits-item">Большая база поставщиков</li> <li class="benefits-item">Быстрая доставка</li></ul>
<h2>Наши преимущества:</h2> <ul class="benefits"> <li class="benefits-item">Низкие цены</li> <li class="benefits-item">Большая база поставщиков</li> <li class="benefits-item">Быстрая доставка</li> </ul>
.benefits { counter-reset: benefits;}.benefits-item { counter-increment: benefits;}.benefits-item::before { content: counter(benefits); position: absolute; font-size: 190px; font-weight: bold; left: 0; top: -0.35em; opacity: 0.5; color: #1A5AD7;}
.benefits { counter-reset: benefits; } .benefits-item { counter-increment: benefits; } .benefits-item::before { content: counter(benefits); position: absolute; font-size: 190px; font-weight: bold; left: 0; top: -0.35em; opacity: 0.5; color: #1A5AD7; }
советует Скопировано
🛠 Можете задавать альтернативные описания графике из content
, когда добавляете её псевдоэлементом :
или :
. Перечислите описание после основного значения через косую черту (/
). Видимый текст не изменится, а вот вспомогательные технологии и браузеры сделают его частью названия элемента.
Обычно важные для смысла элементы добавляют через HTML, но бывает, что это делают через CSS. Предположим, нам достались стили для <span>
от предыдущей команды разработчиков. Опишем знак копирайта «©» из псевдокласса:
span::before { content: "©" / "Авторские права:";}
span::before { content: "©" / "Авторские права:"; }
Можете добавить описание и к url
:
span::after { content: url(./img/fancy-symbol.svg) / "Не обязательно";}
span::after { content: url(./img/fancy-symbol.svg) / "Не обязательно"; }
Используйте этот трюк с умом. К примеру, когда скринридеры не знакомы с символом или не могут озвучить иконку из :
или :
. Ссылки и другие интерактивные элементы лучше вообще обходить стороной. Дело в том, что пользователи голосового управления не узнают об альтернативном описании в content
. Разберём на примере ссылки:
<a href="#">Грегор Замза</a>
<a href="#">Грегор Замза</a>
/* Не делайте так ❌ */a::before { content: "©" / "Авторские права:";}
/* Не делайте так ❌ */ a::before { content: "©" / "Авторские права:"; }
Для браузеров и скринридеров текст ссылки будет «Авторские права: Грегор Замза». Пользователи голосового управления увидят только «Грегор Замза». Ничего не произойдёт, когда они попытаются перейти по ссылке командой «Грегор Замза, клик».