Необычное использование CSS :after

Я наткнулся на фрагмент CSS, который работает. Я хотел бы понять, почему это работает для моего собственного назидания. У меня общий вопрос о семантике использования :after в CSS.

Тема Wordpress Twenty Nineteen накладывает темный фильтр на изображения функций, чтобы сделать (белый) текст заголовка более читаемым. Я искал способ удалить темный фильтр на определенных изображениях. Я нашел Почта, который предлагает этот css:

.site-header.featured-image:after {
   background: none;
}

Это работает удовольствие!

Используя инспектор Firefox, я вижу, что .site-header и .featured-image являются классами включающего элемента <header>. Макет гибкий.

Я пытаюсь понять это использование :after. Мой поиск :after предполагает, что это способ добавления «контента» после элемента. В этом примере не добавляется контент... вместо этого он, похоже, изменяет/переопределяет существующее свойство.

Если я уберу ':after', он перестанет работать, так что это определенно необходимо.

Может ли какой-нибудь эксперт объяснить, что здесь происходит, и/или указать мне спецификацию, которая объясняет это?

Спасибо

Пожалуйста, отредактируйте вопрос, чтобы показать, что вы пробовали, чтобы проиллюстрировать конкретное препятствие, с которым вы столкнулись в Минимальный, полный и проверяемый пример. Для получения дополнительной информации см. Как спросить и возьмите тур.

Chris Tapay 21.02.2019 02:46

Мой вопрос носит более общий характер. У меня нет работающего сайта, демонстрирующего проблему, на которую я могу указать в настоящее время. Я отредактировал вопрос, надеюсь, чтобы сделать мой вопрос более ясным.

Jerry S 21.02.2019 04:31

Вы можете использовать службы фрагментов кода, такие как CodePen, даже StackOverflow позволяет вставлять фрагменты кода, которые выполняются. Но для ясности и понимания того, чего вы пытаетесь достичь, лучше всего предоставить попытку, которую вы предприняли, и каков ожидаемый результат. В противном случае вы можете получить минусы на свой вопрос.

Chris Tapay 21.02.2019 04:42

Псевдоэлемент ::after, безусловно, создает контейнер типа block, который покрывает упомянутое изображение. На самом деле это не «контент», а просто прямоугольник с прозрачным фоном. Чтобы мы могли работать с более точной догадкой, вы должны проверить, что с помощью Firefox псевдоэлементы ::before и ::after видны в дереве элементов. Покажи нам, что ты там видишь!

Barthy 21.02.2019 04:44
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
4
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

То, что он на самом деле видит, это специфичность.

Что делает :after, так это добавляет элемент после последнего дочернего элемента или содержимого элемента, к которому применяется :after. См.: https://developer.mozilla.org/en-US/docs/Web/CSS/::после

Вот грубый пример

.featured-image {
  position:relative;
  padding:5px;
 
}

.featured-image > p {
  position: relative;
  z-index:10;
}

.featured-image:after {
  position:absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  content: '';
  border: 1px solid black;
  background-color: #CCC;
  z-index:1;
}

.site-header.featured-image:after {
   background: none;
}
<div class = "featured-image"><p> :after will have a background</p></div>
<div class = "site-header featured-image"><p> :after wont't have a background 2</p></div>

Поскольку .site-header.featured-image:after более конкретен, чем .featured-image:after, .site-header.featured-image:after отдает предпочтение любым конфликтующим стилям.

Спасибо. Это отличный пример, объясняющий то, что я вижу, и иллюстрирующий правило специфичности... и то, как вы модифицируете уже существующий псевдоэлемент. Ваше здоровье

Jerry S 22.02.2019 23:11

С помощью ::after и ::before вы можете добавлять html-элементы или, по крайней мере, что-то, что имитирует функциональность html-элемента.

::before будет помещен перед всеми элементами внутри элемента, а ::after будет последним элементом.

Например, скажем, у нас уже есть эта разметка,

<div class = "some-div">
  <h1>some text</h1>
  <div>Another div</div>
  <!-- bunch of other elements -->
</div>

Если мы добавим следующий css,

.some-div::after,
.some-div::before {
  content: "";
  display: block;
}

Это приведет к этой разметке,

<div class = "some-div">
  ::before
  <h1>some text</h1>
  <div>Another div</div>
  <!-- bunch of other elements -->
  ::after
</div>

Теперь я предполагаю, что ваша тема Wordpress добавляет элемент after с некоторым значением background-color, который перекрывает изображение. И установив фон этого элемента ::after на none, вы перезапишете эти стили и избавитесь от наложения.

Этот фрагмент более подробно описывает, что происходит в теме.

.some-div {
  width: 20rem;
  height: 20rem;
}

.img {
  position: relative;
  background-color: orangered;
  width: 100%;
  height: 100%;
}

.some-div:hover .img::after {
  position: absolute;
  top: 0;
  left: 0;
  content: "";
  display: block;
  width: 100%;
  height: 100%;
  background-color: black;
  opacity: .3;
}
<div class = "some-div">
  <div class = "img"></div>
<div>

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

Jerry S 22.02.2019 23:07

Другие вопросы по теме