我有一个类似下面的 div 结构:
<div class="body-content">
<div class="col-middle">
</div>
</div>
我希望做的是在body-content类中设置列表项样式,并确保它不适用于col-middle内的任何内容。
我认为应该像这样...
.body-content li { }
但是它也将这些样式应用到col-middle中的列表项。
最简单且向后兼容的选项是:
div.body-content li { /* some style */ }
div.col-middle li { /* some other style */ }
你可以使用子选择器:
div.body-content > ul li
但是它不支持IE6。
除此之外,这取决于你的标记语言编写方式和对浏览器支持的要求。
如果可能,请将你的标记语言更改为:
<div class="body-content">
<div class="col-middle">
...
</div>
<div class="col-other">
...
</div>
</div>
在设置了 .body-content li { } 样式之后,我会将 .body-content .col-middle li { } 的值设为零。
你唯一的其他选择是指定 li 将要出现的位置:
.body-content .li-block li { }
你需要:
.body-content > ul li { ... }
这将仅选择直接是 .body-content
中 ul
的子元素的列表项。
编辑:哎呀,> 放错位置了!
编辑:抱歉,还应该提到 - 子选择器在 IE6 中不起作用。
div.body-content li {
color: red;
}
div.col-middle li {
// overrides stuff
color: black;
}
样式从父元素向子元素级联。
你应该使用,这将仅为.body-content的子li设置样式
.body-content > ul li {}
您尝试的代码指定了仅在 .body-content 内部的列表项应该如何显示,即使它们在 .col-middle 内部也是如此。
使用 CSS2,除了指定 .col-middle 外部的列表项应该如何工作,然后再指定它们在 .col-middle 内部应该如何样式化之外,没有任何方法可以实现您想要的效果。
然而,使用 CSS3,您可以像这样做:
:not(.col-middle) li{}
.body-content
,然后覆盖 .col-middle
中的这些样式。这将是最具跨浏览器兼容性的方法。<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
.body-content > *:not(.col-middle) li {
color: red;
}
</style>
</head>
<body>
<div class="body-content">
<div class="col-middle">
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
<div>
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</div>
</body>
</html>