в коде:
<!DOCTYPE html>
<html>
<head>
<style>
.parent {
position: absolute;
top:500px;
width:400px;
border:1px solid green;
}
.parent:before {
z-index:-1;
content:'';
position:absolute;
opacity:0.5;
width:400px;
height:200px;
background-image:url('wallpaper324845.jpg');
border:1px solid red;
}
.child {
Color:black;
border:1px solid black;
}
</style>
</head>
<body>
<div class="parent">
<div class="child">Hello I am child</div>
</div>
</body>
</html>
Я пытаюсь создать прозрачный фон, как описано в этом потоке: Как установить непрозрачность в родительском div и не повлиять на дочерний div? ,
Глядя на код с 4-го ответа. Как это работает, я путаюсь с использованием .parent
и .parent:before
. Я бы подумал, что это создаст элемент .parent:before
перед каждым родительским элементом. Действительно запутался, как это работает?
:before
созданием виртуального контента с использованием CSS, поэтому в приведенном выше случае автор использует ниже фрагменты
.parent:before{
z-index:-1;
content:'';
position:absolute;
opacity:0.5;
width:400px;
height:200px;
background-image:url('wallpaper324845.jpg');
border:1px solid red;
}
Он создает виртуальный элемент, используя :before
, который затем он присваивает absolute
, назначает некоторые измерения и назначает background
, чтобы убедиться, что он остается ниже содержимого div
, он использует z-index: -1;
Другими словами :before
:after
- не что иное, как предполагают вложенные два элемента span
внутри вашего div
, но, используя pseudo
, вам не нужно иметь span
поскольку вы можете достичь того же самого с псевдоэлементами.
У вас есть что-то вроде этого
<div>
Hello
<span></span>
</div>
div {
position: relative;
}
div span {
position: absolute;
width: 100%;
height: 100%;
background: #f00;
z-index: -1;
left: 0;
top: 0;
}
Может быть также достигнуто с использованием :before
или :after
, разметка остается неизменной, но CSS идет как
div {
position: relative;
}
div:after {
content: "";
position: absolute;
width: 100%;
height: 100%;
background: #f00;
z-index: -1;
left: 0;
top: 0;
}
Таким образом, он просто сохраняет ваш пустой элемент в вашем HTML, но если вы посмотрите на вышеприведенный CSS, я использую свойство content
которое ВСЕГДА связано с :before
или :after
и да, это необходимо, даже если вы сохраняете его пустым,
Также обратите внимание, что :before
и :after
сгенерированного содержимого являются встроенными, поэтому, чтобы сделать height
, width
работы, вам нужно явно указать display: block;
или display: inline-block;
если вы хотите сделать его блочным уровнем, но в этом конкретном случае вам не понадобится, поскольку псевдоэлемент будет помещен как absolute
div:after {
content: "Hello";
margin-top: 20px; /* This wont work as pseudo is inline by default */
}
Поэтому сделайте block
или inline-block
position: absolute;
:) так что вам не нужно определять display: block;
Авторы определяют стиль и расположение сгенерированного контента с помощью: before и: after псевдоэлементов. Как показывают их имена, псевдовые элементы: before и: after определяют местоположение содержимого до и после содержимого дерева элементов элемента. Свойство "content", в сочетании с этими псевдоэлементами, указывает, что вставлено.
Ниже представлено дерево документов с HTML как root.
HTML
.HEAD
..TITLE
.BODY
..H1
..P
..UL
...LI
...LI
...LI
Например, следующее правило вставляет строку "Примечание:" перед содержимым каждого элемента P, чей атрибут "class" имеет значение "note":
p.note:before { content: "Note: " }
Объекты форматирования (например, ящики), сгенерированные элементом, включают сгенерированный контент. Так, например, изменение указанной таблицы стилей на:
p.note:before { content: "Note: " }
p.note { border: solid green }
приведет к созданию сплошной зеленой границы вокруг всего абзаца, включая начальную строку.
Псевдоэлементы: before и: after наследуют любые наследуемые свойства от элемента в дереве документов, к которому они прикреплены.
Например, следующие правила вставляют открытую метку кавычки перед каждым элементом Q. Цвет метки кавычки будет красным, но шрифт будет таким же, как и шрифт остальной части элемента Q:
q:before {
content: open-quote;
color: red
}
В a: before или: после объявления псевдоэлемента непривитые свойства принимают свои начальные значения.
Так, например, поскольку начальное значение свойства "display" является "inline", цитата в предыдущем примере вставляется как встроенное поле (то есть в той же строке, что и исходное текстовое содержимое элемента). Следующий пример явно устанавливает свойство display для "block", так что вставленный текст становится блоком:
body:after {
content: "The End";
display: block;
margin-top: 2em;
text-align: center;
}
Элементы: before и: after псевдоэлементы взаимодействуют с другими блоками, такими как окна ввода-вывода, как если бы они были реальными элементами, вставленными только внутри их связанного элемента.
Например, следующий фрагмент документа и таблица стилей:
<h2> Header </h2> h2 { display: run-in; }
<p> Text </p> p:before { display: block; content: 'Some'; }
... будет отображаться точно так же, как следующий фрагмент документа и таблица стилей:
<h2> Header </h2> h2 { display: run-in; }
<p><span>Some</span> Text </p> span { display: block }
Аналогичным образом, следующий фрагмент документа и таблица стилей:
<h2> Header </h2> h2 { display: run-in; }
h2:after { display: block; content: 'Thing'; }
<p> Text </p>
... будет отображаться точно так же, как следующий фрагмент документа и таблица стилей:
<h2> Header <span>Thing</span></h2> h2 { display: block; }
span { display: block; }
<p> Text </p>
Попробуйте взглянуть на эту статью. он объясняет, как: до и: после псевдоселекторов работают:
В основном :before
(например: after) является псевдоэлементом CSS. Так что это почти как встроенный элемент HTML. Почти.
Чтобы играть с псевдоэлементами, вам нужно content
свойство content
(в большинстве случаев - пустая строка). Обратите внимание, что это встроенный элемент по умолчанию, поэтому он не может иметь ширину/высоту. Вам нужно установить display: block
(или встроенный блок или что-то еще).
Я думаю, вы пропустили установку relative
позиции на родительский элемент (.parent). Вот он:
.parent{
position: relative;
top:500px;
width:400px;
border:1px solid green;
}