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

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

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


当前回答

:after和:before在Internet Explorer 7及以下版本中不受任何元素的支持。

它也不能用于替换的元素,如表单元素(输入)和图像元素。

换句话说,使用纯CSS是不可能的。

但是,如果使用jquery,则可以使用

$(".mystyle").after("add your smiley here");

之后的API文档

使用javascript附加内容。这将适用于所有浏览器。

其他回答

前后切换开关示例只需将输入包装在div块上

.fm表单控件{位置:相对;页边空白:25px;边距底部:25.2px;}.fm切换器{显示:无;}.fm切换开关:选中+.fm占位符切换开关:在之后{背景色:#94c6e7;}.fm切换器:已选中+.fm占位符切换器{左:24px;}.fm切换器[已禁用]+.fm占位符切换器{游标:不允许;}.fm切换器[已禁用]+.fm占位符切换器:之前{背景色:#cbd0d3;}.fm切换器[已禁用]+.fm占位符切换器:之后{背景色:#eaeeded;边框颜色:#cbd0d3;}.fm占位符切换器{左填充:53px;光标:指针;线条高度:24px;}.fm占位符切换器:之前{位置:绝对;内容:“”;左:0;顶部:50%;宽度:20px;高度:20px;页边空白:-10px;左边距:2px;背景色:#2980b9;z指数:2;-moz转换:所有0.15s都易于进出;-o型转换:所有0.15s都易于进出;-webkit转换:所有0.15s都易于输入输出;过渡:所有0.15s均缓进缓出;边框半径:12px;}.fm占位符切换器:在之后{位置:绝对;内容:“”;左:0;顶部:50%;宽度:48px;高度:20px;页边空白:-12px;背景色:#ffffff;z指数:1;边框半径:12px;边框:2px实心#bdc3c7;-moz转换:所有0.15s都易于进出;-o型转换:所有0.15s都易于进出;-webkit转换:所有0.15s都易于输入输出;过渡:所有0.15s均缓进缓出;}<div class='fm表单控件'><input class=‘m-switcher‘id=‘switcher_id‘type=‘checkbox‘><label class='m-placeholder-switcher'for='switcher_id'>切换器</label></div>

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

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

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

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

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

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

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

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

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


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

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

W3C规范

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

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

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

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

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

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

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