Сегодня мы собираемся рассмотреть псевдоэлементы :before и :after. Вы, наверное, часто видели как их используют в сложных примерах CSS. Итак, сегодня Вы можете также научиться их использовать самостоятельно.
Что такое псевдоэлемент и чем он отличается от псевдокласса? Почему псевдоэлементы иногда имеют одно двоеточие, а иногда и два? Как :before и :after реализован в CSS? Какие приемы используют разработчики во всем мире для создания удивительных вещей при помощи CSS? Читайте дальше, чтобы узнать это.
Очень многие люди путают эти понятия или не понимают в чем разница (включая и меня, прежде чем погрузиться в это исследование). Если вы воспользуетесь поиском, чтобы найти различия между ними, то вы найдете длинные и слишком "технические" ответы, перемешанные с простыми, голословными заявлениями о том, что это различные вещи по сути, но без обсуждения, как и почему. Некоторые источники, такие как W3Schools, похоже, используют эти термины как взаимозаменяемые, что часто приводит к их неправильному использованию. Ответ же на этот вопрос довольно прост.
Во-первых, давайте посмотрим на псевдоклассы, которые нацелены на весь элемент или его состояние.
a:link { color: #111; } a:hover { color: #222; } div:first-child { color: #333; } div:nth-child(3) { color: #444; }
Как вы можете видеть, что эти условия не обязательно основаны на DOM, в результате выбирается весь элемент в каждом случае. Что в конечном итоге определяет стили для всей ссылки, параграфа, div-а и т.д.
Псевдоэлементы, с другой стороны, относятся к части элемента. Это важное различие, вот несколько примеров:
p::first-line { color: #555; } p::first-letter { color: #666; } a::before { content: "hello world"; }
Как видите, все они указывают только на часть элемента: на первую строку или первую букву параграфа, например. Они также обладают замечательной способностью определять и даже добавлять вещи, которые даже не указаны в HTML, а именно это :before и :after, то что сегодня мы и обсуждаем.
Чтобы узнать больше о различиях между псевдоклассами и псевдоэлементами, я настоятельно рекомендую вам посмотреть UMD, для хорошего и подробного ознакомления, с большим количеством примеров.
Перед тем, как перейти непосредственно к объяснению :before и :after, и как их можно использовать для выполнения некоторых интересных задач, давайте проясним еще один важный момент, который часто вызывает вопросы. Если вы посмотрите в Интернете примеры с :before и :after, то вы найдете использование двух разных вариантов.
Иногда разработчики используют одно двоеточие, а иногда они будут использовать два. Они используют разные функции? Вовсе нет, оказывается, они абсолютно одинаковые с функциональной точки зрения, то есть вы получите тот же результат и они используются для одинаковых целей. Так в чем же разница? Вот пример:
/*CSS2*/ .example:before { } .example:after { } .example:first-child { } /*CSS3*/ .example::before { } .example::after { } .example:first-child { }
Как вы можете видеть, в CSS2, мы использовали одно двоеточие для определения псевдоклассов и псевдоэлементов. Однако, чтобы помочь различать их, в CSS3 добавлено второе двоеточие только для псевдоэлементов.
Так почему же мы все еще видим оба синтаксиса в современных примерах и учебниках? Остаются ли некоторые разработчики просто в неведении относительно этого изменения? Это может и так, но, вероятно, ответственность за большинство из этих противоречий лежит на нашем старом друге - Internet Explorer-е, разрушителе всего нового и хорошего в мире веб-разработки.
Оказывается, что все современные браузеры понимают синтаксис двойного двоеточия, но, к сожалению, с IE8 это не так. По этой причине, при кодировании с ::before и ::after, большинство разработчиков предпочитают для совместимости просто использовать синтаксис CSS2 с одним двоеточием. Чтобы не усложнять объяснение мы будем придерживаться этого синтаксиса в остальной части этой статьи.
Это всё была теория, но это необходимо знать, если вы собираетесь участвовать в обсуждении вопросов использования :before и :after в CSS. Теперь мы можем, наконец, посмотреть как эти вещи работают.
Концепция здесь на самом деле очень проста. Оба псевдоэлемента :before и :after позволяет фактически добавить HTML-элементы из вашего CSS-кода, не загромождая самой разметки. Это открывает большие возможности для добавления различных декоративных элементов, которые не обязательно заслуживают дополнительной разметки.
Например, предположим, что у вас есть несколько телефонных номеров на своем сайте и вы хотели бы разместить ☎ значок перед ними. Вы можете использовать псевдоэлемент :before, чтобы сделать это (content:"☎"):
.phoneNumber:before { content: '☎'; font-size: 1rem; }
Этот код будет вставлять маленький значок перед каждым элементом с классом .phoneNumber. :after работает точно так же, только, как вы можете догадаться, он будет добавлять значок после номера телефона.
.phoneNumber:after { content: '☎'; font-size: 1rem; }
Одной из причин по которой :before и :after стали невероятно популярны в последнее время, является их способность значительно увеличить сложность CSS элементов. Без дополнительной разметки, мы можем использовать эти псевдоэлементы для добавления дополнительных элементов и слоев.
Чтобы увидеть, как это работает, давайте создадим простую кнопку. Тут простые стили для класса button, которые создают круг с красным градиентом:
.button { height: 100px; width: 100px; position: relative; margin: 50px; color: white; text-align: center; line-height: 100px; /*закругленные углы и тень*/ border-radius: 100px; box-shadow: 2px 2px 4px rgba(0,0,0,0.4); /*градиент*/ background: #e51d16; /* fallback */ background: linear-gradient(top, #e51d16 0%,#b21203 100%); /* W3C */ }
Весь этот код приведет к созданию довольно простой, круглой кнопки:
Теперь, допустим, мы хотим добавить немного затемненную область за пределами кнопки и придать ей внутреннюю тень. Вместо добавления дополнительной разметки, мы можем просто использовать пустой псевдоэлемент.
.button:before { content: ''; }
Теперь мы можем задать стили, чтобы добавить нужный эффект. Тут уже всё зависит от вашей фантазии или вы можете посмотреть многочисленные уроки по CSS в сети.
.button:before { content: ''; width: 100%; height: 100%; display: block; z-index: -1; position: relative; padding: 1rem; background: #ddd; left: -1rem; top: -1rem; border-radius: 100px; box-shadow: inset 2px 2px 4px rgba(0,0,0,0.4); }
Теперь наша кнопка немного больше по размеру. Псевдоэлемент :before образует внешнее кольцо. Мы установили ему z-index: -1, чтобы спрятать его за кнопку и использовали абсолютное позиционирование, чтобы поставить его на нужное место.
Теперь предположим, что мы хотели сделать то же самое еще раз. Это можно осуществить используя псевдоэлемент :after и повторить процесс.
.button:after { content: ''; width: 100%; height: 100%; display: block; z-index: -2; position: relative; padding: 25px; background: #eee; position: absolute; left: -25px; top: -25px; border-radius: 100px; box-shadow: inset 2px 2px 4px rgba(0,0,0,0.4); }
Он просто добавляет еще один слой. Теперь кажется, что у нашей кнопки есть двойная, объемная рамка:
Если вы хотите увидеть это в действии и поэкспериментировать с кодом, то посмотрите наше демо. Попробуйте, на основе этого примера, сделать свою собственную кнопку.
© 2008 - 2025 Webmasters.BY Все права защищены
Новый комментарий