我试图在输入字段上使用: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">

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

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


当前回答

:before和:after应用于容器内部,这意味着您可以将其用于带有结束标记的元素。

它不适用于自动关闭元件。

另一方面,自动关闭的元素(如img/hr/input)也称为“替换元素”,因为它们被替换为各自的内容。“外部对象”,因为缺少更好的术语。这里读得更好

其他回答

如果您试图使用:before和:after来设置输入元素的样式,那么很可能您试图模仿CSS堆栈中其他span、div甚至某个元素的效果。

正如Robert Koritnik的回答所指出的,:before和:after只能应用于容器元素,而输入元素不是容器。

然而,HTML5引入了button元素,它是一个容器,其行为类似于input[type=“submit | reset”]元素。

    <style>
    .happy:after { content:url(smiley.gif); }
    </style>

    <form>
    <!-- won't work -->
    <input class="happy" type="submit" value="Submit" />

    <!-- works -->
    <button class="happy">Submit</button>
    </form>

根据CSS2.1规范中的注释,该规范“没有完全定义:before和:after与替换元素(如HTML中的IMG)的交互。这将在未来的规范中进行更详细的定义。”尽管input不再是真正的替换元素,基本情况没有改变::before和:after对它的影响未指明,通常没有影响。

解决方案是找到一种不同的方法来解决您试图以这种方式解决的问题。将生成的内容放入文本输入控件会非常误导:对用户来说,它似乎是控件中初始值的一部分,但无法修改,因此它似乎是在控件开始时强制的,但不会作为表单数据的一部分提交。

当我遇到同样的问题时,我发现了这篇文章,这是对我有效的解决方案。与替换输入的值相反,只需删除它并在其后面绝对放置一个大小相同的span,span可以使用您选择的图标字体将:before伪类应用于它。

<style type="text/css">

form {position: relative; }
.mystyle:before {content:url(smiley.gif); width: 30px; height: 30px; position: absolute; }
.mystyle {color:red; width: 30px; height: 30px; z-index: 1; position: absolute; }
</style>

<form>
<input class="mystyle" type="text" value=""><span class="mystyle"></span>
</form>

:在容器内渲染之前和之后

<input>不能包含其他元素。


伪元素只能在容器元素上定义(或者更好地说,只支持)。因为它们的渲染方式在容器本身作为子元素。输入不能包含其他元素,因此不支持它们。另一方面,也是表单元素的按钮支持它们,因为它是其他子元素的容器。

如果你问我,如果某些浏览器确实在非容器元素上显示了这两个伪元素,那就是一个bug和一个非标准一致性。规范直接涉及元素内容。。。

W3C规范

如果我们仔细阅读规范,它实际上表明它们被插入到包含元素中:

作者使用:before和:after伪元素指定生成内容的样式和位置。正如它们的名称所示,:before和:after伪元素指定元素文档树内容前后的内容位置。“content”属性与这些伪元素一起指定插入的内容。

看见元素的文档树内容。据我理解,这意味着在容器内。

奇怪的是,它可以处理某些类型的输入。至少在Chrome中,

<input type="checkbox" />

工作正常,与

<input type="radio" />

只是type=text和其他一些不起作用。