Главная » Статьи » Вот что я не знал о «content»

Вот что я не знал о «content»

Вот что я не знал о «content»

От автора: несколько недель назад Стефан опубликовал на своем веб-сайте пост под названием Свойство CSS «content» принимает альтернативный текст, что поразило меня. Он показал, что свойство content принимает 2 значения, а не только 1, фактическое содержимое и альтернативный текст.

Простой пример:

.new-item::before { /* "Highlighted item" и элемент содержимого */ content: "icon" / "Highlighted item";
}

Я не знал этого, и мне было интересно, есть ли еще вещи, которых я не знал о свойстве content.

Как я использую атрибут content

До того, как я начал свое исследование, я использовал это свойство в первую очередь для 3 вещей.

Добавление элемента в другой элемент с использованием псевдо-элементов

Если я хочу создать в CSS простую фигуру, которая не является прямоугольником или кругом, я использую :after и ::before, чтобы дать себе больше возможностей для стилизации.

<div></div>

div { width: 70px; height: 50px; margin-top: 15px; border: 5px solid #123456; border-radius: 5px; position: relative;
} div::before { content: ""; position: absolute; left: 0; right: 0; top: -16px; width: 20px; height: 20px; margin: auto; border: solid #123456; border-width: 5px 5px 0 0; border-radius: 5px; transform: rotate(-45deg); background: #fff;
}

Посмотрите Пример 1 на CodePen.

Для отображения на экране псевдо-элементам необходим атрибут content.

Выявление URL-адресов в таблицах стилей для печати

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

@media print { a[href^="http://"]:after, a[href^="https://"]:after { content: " (" attr(href) ")"; }
}

Пользовательские счетчики

Время от времени мне нужно создавать пользовательские счетчики в списках. Комбинация content и свойств счетчиков обычно справляется с этим очень хорошо.

<ol> <li>Element 001</li> <li>Element 002</li> <li>Element 003</li>
</ol>

ol { list-style-type: none; counter-reset: mylist;
} li { counter-increment: mylist;
} li::before { content: "icon " counter(mylist) ": "
}

Пример 2 на CodePen.

Посмотрите на то, что я не знал о list-style-type, чтобы узнать о других возможностях для стилизации элементов списка. Теперь посмотрим, что еще content может сделать для нас. Вот что я недавно узнал.

content принимает изображения и градиенты

Я знал, что content принимает функции counter и attr, но мне никогда не приходило в голову, что оно может также принимать другие функции. Всякий раз, когда мне нужно изображение в псевдо-элементе, я бы использовал background-image, хотя и content подходит для этого.

div::before { content: url('pin.png');
}

Пример 3 на CodePen.

Если это работает с изображениями, то должно работать и с градиентами, верно? Но нет. Похоже, что Chrome — единственный браузер, который отображает псевдо-элементы с градиентными значениями content.

div::before { content: linear-gradient(blue, red); height: 50px; width: 50px; display: block; border: 1px solid red;
}

Пример 4 на CodePen.

Вы можете определить альтернативный текст для значений content (… в Chrome)

Какой смысл использовать content, когда background-image поддерживается лучше? Причина, по которой Стефан написал свой пост, состоит в том, что content поддерживает альтернативный текст.

div::before { content: url('pin.png') / "You are here."
}

Пример 5 на CodePen.

К сожалению, это работает только в Chrome (протестировано на macOS 10.15.4, Chrome 81 с VoiceOver). Firefox и Safari даже не отображают псевдо-элемент, потому что значение недопустимо. К сожалению.

Даже если бы это работало в большинстве браузеров, я бы не рекомендовал добавлять текстовый контент в файл CSS. Другие, работающие над проектом, вероятно, не ожидают, что текст исходит из файла CSS, на сайтах с несколькими языками могут возникнуть проблемы, автоматический перевод может не сработать, а содержимое будет доступно только в случае успешной загрузки CSS.

Вы можете комбинировать текст и изображения

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

div::before { content: url('pin.png') "You are here."
}

Пример 6 на CodePen.

Вы можете заменить только content обычного элемента на image

Свойство content предназначено для использования с псевдо-элементами. Вы не можете использовать его для замены строки в элементе другой строкой. Это не сработает:

div { content: "You are here";
}

Но вы можете использовать его для замены строки изображением. Строка все еще находится в DOM, но программы чтения с экрана объявляют имя файла. (Вы можете сделать это, но я бы не советовал.)

<div>You are here!</div>

div { content: url('pin.png');
}

Пример 7 на CodePen.

С кавычками и без кавычек

Хорошо, теперь действительно крутая вещь. Допустим, у нас есть цитата, вложенная в другую цитату.

<blockquote> My mama always said, <q> Life was like a box of chocolates. You never know what you’re gonna get </q>.
</blockquote>

Вы видите в приведенном выше примере, что blockquote не имеет кавычек, q имеет двойные кавычки.

Если мы с помощью псевдо-элемента и свойства content добавим открывающие и закрывающие кавычки к blockquote, то blockquote будет отображаться с двойными кавычками, а q автоматически с одинарными.

blockquote::before { content: open-quote
} blockquote::after { content: close-quote
}

Отлично! Чтобы завершить все это, мы можем даже получить комбинацию blockquote без кавычек и q с одинарными кавычками.

blockquote::before { content: no-open-quote;
} blockquote::after { content: no-close-quote;
}

Ключевые слова no-open-quote и no-close-quote не вставляют ничего, но увеличивают глубину цитирования на один.

Вложенные цитаты на разных языках

Просто потому, что мне было любопытно, вот некоторые варианты второго примера на других языках. Французский:

<blockquote lang="fr"> Maman disait toujours, <q> la vie, c'est comme une boîte de chocolats: on ne sait jamais sur quoi on va tomber </q>.
</blockquote>

Русский:

<blockquote lang="ru"> Моя мама всегда говорила, <q> Жизнь как коробка шоколадных конфет: никогда не знаешь, какая начинка тебе попадётся </q>.
</blockquote>

Немецкий:

<blockquote lang="de"> Mama hat immer gesagt, <q> Das Leben ist wie eine Schachtel Pralinen. Man weiß nie, was man kriegt </q>.
</blockquote>

Испанский:

<blockquote lang="es"> Mi mamá siempre decía, <q> La vida es como una caja de bombones, nunca sabes lo que vas a conseguir </q>.
</blockquote>

Извините, если я облажался с каким-либо из переводов.

Есть counter() и есть counters()

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

<ol> <li> Element 001 <ol> <li>Element 001</li> <li>Element 002</li> <li>Element 003</li> </ol> </li> <li>Element 002</li> <li>Element 003</li>
</ol>

ol { list-style-type: none; counter-reset: mylist;
} li { counter-increment: mylist;
} li::before { content: "icon " counters(mylist, ".") ": "
}

Пример 8 на CodePen.

Вау, это было многословно. Я не ожидал так много напишу и так многому научусь. Я надеюсь, что вы узнали столько же, сколько и я. Спасибо за чтение и спасибо Стефану за вдохновение для этого поста.

Автор: Manuel Matuzovic

Источник: https://www.matuzo.at

Редакция: Команда webformyself.