为啥 :before 和 :after 伪元素不能与 `img` 元素一起使用? [复制]

Posted

技术标签:

【中文标题】为啥 :before 和 :after 伪元素不能与 `img` 元素一起使用? [复制]【英文标题】:Why don't :before and :after pseudo elements work with `img` elements? [duplicate]为什么 :before 和 :after 伪元素不能与 `img` 元素一起使用? [复制] 【发布时间】:2011-11-15 19:46:40 【问题描述】:

我正在尝试将 :before pseudo element 与 img 元素一起使用。

考虑一下这个 html 和 CSS...

HTML

<img src="http://0.gravatar.com/avatar/this-is-not-a-hash"  />

CSS

img:before 
  content: "hello";

jsFiddle.

这不会产生预期的效果(在 Chrome 13 和 Firefox 6 中测试)。但是,它适用于 divspan 元素。

为什么不呢?

有没有办法让伪元素与img 元素一起工作?

【问题讨论】:

我写了这个(不是很好)相关的答案:***.com/questions/6949148/… 【参考方案1】:

The spec says...

注意。本规范并未完全定义:before:after 与替换元素(如HTML 中的IMG)的交互。这将在未来的规范中更详细地定义。

我猜这意味着它们不适用于 img 元素(目前)。

另见this answer。

【讨论】:

真正的 SOer 应该在回答自己 3 分钟后提出问题,+1 ;-) 这是未来,仍然没有规格...... 这里是 2017 年。 2019 年,8 年过去了。我们什么时候才能准确到达未来? 近 10 年后,我们中的许多人都头发花白,有些人已经去世。我们有自动驾驶汽车,但图像上的伪元素是我们无法弄清楚的一点技术。【参考方案2】:

这可能是浏览器供应商没有在 img 标签上实现伪元素,因为他们对规范的解释:img 元素,严格来说,不是块级元素或内联元素,它是一个empty element。

【讨论】:

这似乎是正确的,尽管自 HTML3 链接 (!) 以来术语已经发生了变化。在 HTML5 中,img 就是所谓的“void”元素。空元素的示例包括 hr、input 和 source。请参阅:dev.w3.org/html5/markup/syntax.html#void-element // 快速的非正式测试表明您也不能向输入元素添加伪元素。【参考方案3】:

只是为了测试并知道它不漂亮,您可以执行以下操作以使伪元素与“img”元素一起使用。

地址:display: block; content: ""; height: (height of image)px 到 CSS 中的 img 元素。

虽然它会使您的 img 标签变为空,因为 content: "" 您可以这样做

地址:style="background-image: url(image.jpg)" 到 html 中的 img 元素。

在 Fx、Chrome 和 Safari 中对此进行了测试

【讨论】:

似乎不适用于 Mac Firefox 17。 如果图像标签的 src 不存在 (404),则仅适用于 Firefox 23。 我通过将 img 包装到 span 来解决这个问题。是的,是的,但在某些情况下有效。

以上是关于为啥 :before 和 :after 伪元素不能与 `img` 元素一起使用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

[ css 伪元素 :before :after ] css中before, after伪元素特性表现解释和实例

伪元素::before和::after的详细介绍

动态改变伪元素样式的方(用:after和:before生成的元素)

伪元素 before 和 after 初探

学习使用:before和:after伪元素

::before和::after伪元素的用法