CSS:未向某些元素添加内容后

时间:2011-08-04 22:05:27

标签: css pseudo-element

我无法理解CSS :after属性的行为。根据规范(herehere):

  

正如其名称所示,:before:after伪元素指定元素文档树内容之前和之后的内容位置。

这似乎没有限制哪些元素可以具有:after(或:before)属性。但是,它似乎仅适用于specific elements ... <p>有效,<img>没有,<input>没有,<table>有效。我可以测试更多,但重点是。请注意,这似乎在浏览器中非常一致。 决定对象是否可以接受:before:after属性的因素是什么?

4 个答案:

答案 0 :(得分:143)

imginput都是replaced elements

  

替换元素是其外观和尺寸为的任何元素   由外部资源定义。示例包括图像(<img>标签),   插件(<object>标签)和表单元素(<button><textarea>,   <input><select>代码)。可以引用所有其他元素类型   作为未被替换的元素。

:before:after仅适用于未替换的元素。

来自the spec

  

请注意。该规范没有完全定义交互   已更换元素的:before:after(例如HTML中的IMG)。这个   将在未来的规范中更详细地定义。

使用span:before, span:after,DOM看起来像这样:

<span><before></before>Content of span<after></after></span>

显然,这不适用于<img src="" />

答案 1 :(得分:9)

:before:after不是必需的用于替换元素,而CSS规范没有指定它们如何为它们工作,并且被替换元素的概念是有些模糊。

CSS 2.1规范明确suggests,他们可以为替换元素工作,只是说它没有“完全定义”如何。这涉及到被替换的元素应该具有其自己的视觉呈现的问题,其不受CSS控制,而伪元素应该向元素的内容添加某些内容。该规范补充说,这将在未来的规范中“更详细地”定义,但到目前为止还没有这样做。

浏览器供应商只是决定通过不为某些元素实现这些伪元素来避免问题。

根本不清楚“替换元素”是什么意思,其意义似乎有所改变。它通常被解释为与空元素(具有EMPTY声明内容的元素,即不能包含任何内容的元素)相同,但CSS 2.1本身显示带有选择器{{1}的sample style sheet (虽然浏览器忽略了这一点,以自己的方式实现br:before)。可以说,越来越多的元素已经进入CSS渲染的范围,至少部分是这样。例如,br元素(包括其字体,颜色等)在很大程度上可以通过CSS在现代浏览器中控制。

当前浏览器(Firefox,IE,Chrome)似乎不支持除input以外的空元素的:after:before伪元素。对于hr,IE和Chrome会将生成的内容放在有边框中,这是hr的实现;内容使盒子更高。 Firefox将两个(!)伪元素的内容放在水平规则之后,即hr的实现。这种变化说明了CSS 2.1中提到的各种“交互”问题。

通常声称这些伪元素不能用于空元素,因为它们的HTML定义不允许任何内容。这是一个类别错误。标记语言的语法规则不限制您在CSS中可以执行的操作

总而言之,hr:after目前无法用于空元素(:before除外),但这主要是由于实施,可能会在将来发生变化。< / p>

答案 2 :(得分:0)

我花了几个小时拔掉头发,才发现其他CSS覆盖了选择器的library(sqldf) v1 <- "Species" v2 <- "Sepal.Length" x4 <- fn$sqldf("select * from iris order by [$v1], [$v2] desc") all.equal(x1, x4, check.attributes = FALSE) ## [1] TRUE (或content)属性。

例如,如果以下代码写在其他地方,则display:nonebefore元素将永远不会显示:

after
#id > child:before {
  content: none!important;
}

只需找到要覆盖您的样式和垃圾邮件的CSS 更强选择器和<html> <div id="id" class="class"> <child> Before element is not showing </child> </div> <style> child:before { content: 'before'; color: 'red'; } </style> </html>使其生效

!important
#id>child:before {
  content: none!important;
}

答案 3 :(得分:-1)

没有结束标记的元素是空元素,它们不能在其中显示内容:

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%);
    }
  }
}