我试图在输入字段上使用:after CSS伪元素,但它不起作用。如果我将其与跨度一起使用,它可以正常工作。

<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>

这是有效的(将笑脸放在“buu!”之后,然后放在“somemore”之前)

<span class="mystyle">buuu!</span>a some more

这不起作用-它只将someValue涂成红色,但没有笑脸。

<input class="mystyle" type="text" value="someValue">

我做错了什么?我应该使用另一个伪选择器吗?

注意:我不能在输入周围添加跨度,因为它是由第三方控件生成的。


当前回答

问题提到“输入字段”。虽然我相信OP引用的是type=text、::after和::before的输入字段,但伪内容确实呈现了几种不同类型的输入字段:

input::before {
    content: "My content" /* 11 different input types will render this */
}    

这里是所有输入类型的全面演示,清楚地显示了哪些类型与(在本例中)::before伪元素兼容。

总之,这是可以呈现伪内容的所有输入类型的列表:

复选框颜色日期本地日期时间文件形象月无线电广播范围时间周

其他回答

尽管有解释指出Firefox不允许::after和::before内容用于无法显示任何内容的元素的行为是正确的,但这一规则似乎仍然适用:

input[type=checkbox] {
    -moz-appearance: initial;
}

由于::after是重新设置复选框或单选框样式的唯一方法,而不会引入更多无关的标记,如尾随跨度或标签,我认为可以强制Firefox允许显示::before和::aft内容,尽管不符合规范。

我使用背景图像为必填字段创建了红点。

input[type="text"][required] {
  background-image: radial-gradient(red 15%, transparent 16%);
  background-size: 1em 1em;
  background-position: top right;
  background-repeat: no-repeat
}

在Codepen上查看

:before和:after仅适用于可以具有子节点的节点,因为它们将新节点作为第一个或最后一个节点插入。

这里最大的误解是单词前后的意思。它们不是指元素本身,而是指元素中的内容。因此,元素:before在内容之前,元素:after在内容之后,但两者仍在原始元素内部。

input元素在CSS视图中没有内容,因此没有:before或:after伪内容。这适用于许多其他无效或替换的元素。

元素外部没有引用的伪元素。

在另一个宇宙中,这些伪元素可能被称为其他元素,以使这种区别更清晰。甚至有人提出了一个真正在元素之外的伪元素。到目前为止,在这个宇宙中情况并非如此。

问题提到“输入字段”。虽然我相信OP引用的是type=text、::after和::before的输入字段,但伪内容确实呈现了几种不同类型的输入字段:

input::before {
    content: "My content" /* 11 different input types will render this */
}    

这里是所有输入类型的全面演示,清楚地显示了哪些类型与(在本例中)::before伪元素兼容。

总之,这是可以呈现伪内容的所有输入类型的列表:

复选框颜色日期本地日期时间文件形象月无线电广播范围时间周