Answers:
img
和input
都是被替换的元素。
替换的元素是其外观和尺寸由外部资源定义的任何元素。实例包括图像(
<img>
标记),插件(<object>
标签),和形式的元件(<button>
,<textarea>
,<input>
,和<select>
标签)。所有其他元素类型都可以称为非替换元素。
:before
并且:after
仅适用于不可替换的元素。
从规格:
注意。本规范不完全定义的互动
:before
和:after
替换元素(例如HTML中的IMG)与替换元素。这将在以后的规范中更详细地定义。
使用span:before, span:after
,DOM如下所示:
<span><before></before>Content of span<after></after></span>
显然,这不适用于<img src="" />
。
<before></before>
。我应该说“假装DOM”之类的话。重点是要显示:before
和:after
处于元素内部,而不是元素外部。
:before
并且:after
不适用于替换的元素;它只是说它没有“完全定义”如何以及将来如何定义(到目前为止尚未发生)。DOM中发生的事情与此处无关。尽管浏览器不支持某些元素支持这些伪元素,但规范并不在其中,而是实现方式。
::before
,::after
不适用于从来没有实际内容的void(空)元素,在此之前/之后它们都可以适用。但是令人惊讶的是,它们hr
在几乎所有浏览器中都适用于element。
:before
并且:after
不要求工作的替换元素,和CSS规范没有指定他们将如何为他们工作,并替换元素的概念有些模糊。
CSS 2.1规范明确建议它们可以为替换的元素工作,只是说它没有“完全定义”操作方式。这涉及到一个问题,一个被替换的元素应该具有自己的视觉呈现,这不受CSS的控制,而伪元素应该在元素的内容中添加一些内容。规范补充说,这将在将来的规范中“更详细地”定义,但是到目前为止还没有发生。
浏览器供应商只是决定通过根本不对某些元素实现这些伪元素来避免问题。
完全不清楚“替换的元素”是什么意思,其含义似乎有所改变。它通常被解释为与空元素(具有EMPTY
声明内容的元素,即元素不能具有任何内容)相同,但是CSS 2.1本身显示了带有选择器的示例样式表br:before
(尽管浏览器忽略了这一点,实现了br
它们自己的方式)。可以说,越来越多的元素至少部分进入了CSS渲染的范围。例如,input
在现代浏览器中,可以使用CSS在很大程度上控制元素(包括其字体,颜色等)。
当前的浏览器(Firefox,IE,Chrome)似乎不支持空元素的:after
和:before
伪元素hr
。对于hr
,IE和Chrome将生成的内容放在带边框的框内,该框是的实现hr
;内容使盒子更高。Firefox将两个(!)伪元素的内容放在作为其实现的水平规则之后hr
。此变体说明了CSS 2.1中提到的“交互”问题的种类。
通常要求这些伪元素不能用于空元素,因为它们的HTML定义不允许任何内容。这是一个类别错误。标记语言的语法规则不限制您可以在CSS中执行的操作
总而言之,:after
并且:before
当前不适用于空元素(除了略有限制hr
),但这主要是由于实现,并且将来可能会发生变化。
没有结束标记的元素是空元素,它们不能在其中显示内容:
https://www.w3.org/TR/html5/syntax.html#void-elements
所有Blink,Webkit和Quantum浏览器都仅允许您在复选框上创建伪元素,但这是有争议的,因为没有任何规范允许这种行为。
这是一个例子:https : //codepen.io/equinusocio/pen/BOBaEM/
input[type="checkbox"] {
appearance: none;
color: #000;
width: 42px;
height: 24px;
border: 1px solid currentColor;
border-radius: 100px;
cursor: pointer;
transition: all 100ms;
background-size: 30%;
outline: none;
position: relative;
box-sizing: border-box;
background-color: #eee;
transition: background-color 200ms;
&::before {
content: '';
position: absolute;
left: 2px;
top: 2px;
bottom: 2px;
height: 18px;
width: 18px;
border-radius: 50%;
background-color: currentColor;
will-change: transform;
transition: transform 200ms cubic-bezier(.01,.65,.23,1);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}
&:checked {
background-color: aquamarine;
&::before {
transform: translateX(100%);
}
}
}
<before></before>
在源代码中找到类似“ ”的东西,我会感到惊讶。