我试图在输入字段上使用: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">
我做错了什么?我应该使用另一个伪选择器吗?
注意:我不能在输入周围添加跨度,因为它是由第三方控件生成的。
:在容器内渲染之前和之后
<input>不能包含其他元素。
伪元素只能在容器元素上定义(或者更好地说,只支持)。因为它们的渲染方式在容器本身作为子元素。输入不能包含其他元素,因此不支持它们。另一方面,也是表单元素的按钮支持它们,因为它是其他子元素的容器。
如果你问我,如果某些浏览器确实在非容器元素上显示了这两个伪元素,那就是一个bug和一个非标准一致性。规范直接涉及元素内容。。。
W3C规范
如果我们仔细阅读规范,它实际上表明它们被插入到包含元素中:
作者使用:before和:after伪元素指定生成内容的样式和位置。正如它们的名称所示,:before和:after伪元素指定元素文档树内容前后的内容位置。“content”属性与这些伪元素一起指定插入的内容。
看见元素的文档树内容。据我理解,这意味着在容器内。
您不能在输入元素中放置伪元素,但可以放置阴影元素,如占位符!
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伪元素。这是一个fiddle,它在输入的包装器div上有一个before,然后将before放在输入内部-或者至少看起来像它。显然,这是一种变通方法,但在紧要关头很有效,并且有助于做出响应。如果你需要放一些其他内容,你可以很容易地让它成为一个after。
工作Fiddle
输入内的美元符号作为伪元素:http://jsfiddle.net/kapunahele/ose4r8uj/1/
HTML:
<div class="test">
<input type="text"></input>
</div>
CSS:
input {
margin: 3em;
padding-left: 2em;
padding-top: 1em;
padding-bottom: 1em;
width:20%;
}
.test {
position: relative;
background-color: #dedede;
display: inline;
}
.test:before {
content: '$';
position: absolute;
top: 0;
left: 40px;
z-index: 1;
}
如果您试图使用: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>
正如其他人所解释的,输入有点被替换为空元素,所以大多数浏览器不允许您在其中生成::before或::after伪元素。
然而,CSS工作组正在考虑在输入具有外观:none的情况下显式允许::before和::after。
从…起https://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html,
Safari和Chrome都允许在表单输入上使用伪元素。其他浏览器没有。我们曾考虑删除此项,但使用计数器正在记录大约0.07%的使用它的页面,这是我们最大值的20倍移除阈值。实际上,在输入上指定伪元素需要指定输入的内部结构至少在某种程度上,我们没有我不相信我们能做到)。但鲍里斯建议,在其中一个错误线程中,允许它出现:无输入-基本上只是将它们转换为<div>s,而不是“有点被替换”的元素。
总结
它不适用于<inputtype=“button”>,但适用于<输入type=“checkbox”>。
小提琴:http://jsfiddle.net/gb2wY/50/
HTML格式:
<p class="submit">
<input id="submit-button" type="submit" value="Post">
<br><br>
<input id="submit-cb" type="checkbox" checked>
</p>
CSS:
#submit-button::before,
#submit-cb::before {
content: ' ';
background: transparent;
border: 3px solid crimson;
display: inline-block;
width: 100%;
height: 100%;
padding: 0;
margin: -3px -3px;
}