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

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

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


当前回答

这里有另一种方法(假设您可以控制HTML):在输入之后添加一个空的<span></span>,并在CSS中使用input.mystyle+span:after将其作为目标

.field包含错误{显示:内联;颜色:红色;}.field_with_errors输入+span:之后{内容:“*”}<div class=“field_with_errors”>标签:</div><div class=“field_with_errors”><input type=“text”/><span></span></div>

我在AngularJS中使用这种方法,因为它会自动将.ng无效类添加到<input>表单元素和表单中,但不会添加到<label>中。

其他回答

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

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

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

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

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

之后的API文档

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

您不能在输入元素中放置伪元素,但可以放置阴影元素,如占位符!

input[type="text"] {   
  &::-webkit-input-placeholder {
    &:before {
      // your code
    }
  }
}

要使其在其他浏览器中工作,请在不同的选择器中使用:-moz占位符、::-moz placeholder和:-ms input placeholder。无法对选择器进行分组,因为如果浏览器无法识别选择器,则整个语句将无效。

更新:以上代码仅适用于CSS预处理器(SASS、LESS…),不使用预处理器:

input[type="text"]::-webkit-input-placeholder:before { // your code }

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

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

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

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

下一步尝试:

label[for=“userName”]{位置:相对;}label[for=“userName”]::之后{content:'[after]';宽度:22px;高度:22px;显示:内联块;位置:绝对;右:-30像素;}<label for=“userName”>姓名:<input type=“text”name=“userName”id=“userName“></label>

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

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