我正在我的应用程序中显示表单,并将每个字段(或相关的一组)括在UL/LI
元素中。这是一个例子:
<ul class="form">
<li class="required">
<label for="...">Field label</label>
<div class="field">
<input type="text" ... />
</div>
</li>
...
</ul>
如您所见,我在必填字段required
元素上设置了一个类LI
,因此当显示label
时,我定义了一个::after
伪元素,之后的红色星号:
ul.form li.required label::after
{
content: " *";
font-weight: bold;
color: #f66;
}
我遇到的问题是我的<div class="field">
容器中有复选框或单选按钮列表。要使单选按钮或复选框旁边的标签可单击,它们必须包含在label
。
<ul class="form">
<li class="required">
<label for="...">Radio button set</label>
<div class="field">
<input type="radio" name="RBSet" value="1" id="RBSet1" /><label for="RBSet1">First</label><br/>
<input type="radio" name="RBSet" value="2" id="RBSet2" /><label for="RBSet2">Second</label><br/>
<input type="radio" name="RBSet" value="3" id="RBSet3" /><label for="RBSet3">Third</label><br/>
...
</div>
</li>
...
</ul>
问题当然是我的单选按钮旁边的每个标签都显示一个星号,因为它也包含在li.required
元素中。
如何从::after
中包含的所有label
元素中删除div.field
个伪元素?我是否必须实际定义它,但将其内容设置为空字符串,还是可以将它们全部删除?
我可以将::after
的样式定义更改为
ul.form li.required > label::after
{
content: " *";
font-weight: bold;
color: #f66;
}
但出于兼容性原因,我想避免使用这些特殊的CSS选择器。
答案 0 :(得分:2)
您应该使用child combinator >
将伪元素应用于label
的{{1}}的孩子:
.required
ul.form li.required > label::after
{
content: " *";
font-weight: bold;
color: #f66;
}
组合器具有比>
伪元素(IE9及更高版本)更好的IE兼容性(IE7及更高版本)。如果您能够使用::after
,则没有理由不使用::after
。事实上,IE对伪元素的支持是如此不一致,IE8识别CSS2 >
而不是CSS3 :after
。因此,除非您使用::after
,否则您的代码将无法在IE8上运行,并且为了支持IE7及更早版本,您需要修复JavaScript。
答案 1 :(得分:1)
继续选择孩子。如果您查看this compatibility table,您会看到支持:after
的所有浏览器也支持子选择器>
。
如果您需要最大兼容性(使用IE7),请考虑使用背景图片而不是:after
标记。例如:
ul.form li.required label
{
background: url(/images/star.png) top right no-repeat;
padding-right: 10px;
}
ul.form li.required div.field label
{
background: none;
padding-right: 0px;
}
答案 2 :(得分:0)
您还可以清除所有::after
标签的field
内容:
ul.form li.required label::after
{
content: " *";
font-weight: bold;
color: #f66;
}
ul.form li.required div.field label::after
{
content: " ";
}