我正在使用如下所示的现有CSS代码(摘自更大的代码体):
.apl_widget_fourLevel {
margin:0 auto 1em;
overflow:hidden;
/* zoom:1 */ /* IE Sheet */
}
/* a panel container */
.apl_widget_fourLevel .apl_widget_level {
float:left;
position:relative;
overflow:hidden;
text-align:center;
width:102px;
height:150px;
margin:0 1px 0 0;
}
/* extra height for widgets with the supplementary data beneath the panels */
/* reset width for selected mini panels */
.apl_widget_fourLevel.apl_widget_client1 .apl_widget_level {
height:auto;
}
/* extra height for widgets with the supplementary data beneath the panels */
/* reset width for selected mini panels */
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level {
height:auto;
width:90px;
}
/* reset width for selected mini panels */
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level.apl_widget_levelSelected {
width:102px;
}
/* the gray label in the panel
enforce for mini display */
.apl_widget_fourLevel .apl_widget_level .apl_widget_label,
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level.apl_widget_levelSelected .apl_widget_label {
position:absolute;
top:20px;
left:0;
width:100%;
margin:0;
color:#555;
font-weight:normal;
text-transform:uppercase;
font-size:100%;
line-height:1.0em;
z-index:1;
}
/* offset for mini labels */
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level .apl_widget_label {
margin-top:20px;
font-size:85%;
}
/* label cascade reset for IE6, sigh */
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level.apl_widget_levelSelected .apl_widget_label {
margin-top:0;
font-size:100%;
}
/* the value displayed in the panel */
.apl_widget_fourLevel .apl_widget_level .apl_widget_value,
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level.apl_widget_levelSelected .apl_widget_value {
position:absolute;
top:45px;
left:0;
width:100%;
margin:0;
color:#fff;
font-weight:bold;
font-size:28px;
line-height:1.0em;
z-index:1;
}
/* offset for mini value */
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level .apl_widget_value {
margin-top:15px;
font-size:24px;
}
.apl_widget_fourLevel.apl_widget_client1 .apl_widget_level .apl_widget_value {
margin-top:3px;
font-size:20px;
font-weight:normal;
opacity:0;
-moz-opacity:0;
-webkit-opacity:0;
filter: alpha(opacity=0);
}
/* value cascade reset for IE6, sigh */
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level.apl_widget_levelSelected .apl_widget_value {
margin-top:0;
font-size:28px;
}
/* range values smaller */
.apl_widget_fourLevel.apl_widget_fourLevelRange .apl_widget_level .apl_widget_value {
margin-top:7px;
font-size:15px;
}
.apl_widget_fourLevel .apl_widget_value a {
color:#fff;
}
/* supplemental value beneath the panel */
.apl_widget_fourLevel .apl_widget_level .apl_widget_valueScore {
position:absolute;
bottom:0px;
left:0;
width:100%;
color:#0072ad;
font-weight:bold;
font-size:28px;
z-index:1;
}
.apl_widget_fourLevel .apl_widget_level .apl_widget_valueScore a {
color:#0072ad;
}
/* low values will be lighter color */
.apl_widget_fourLevel .apl_widget_level.apl_widget_levelLow .apl_widget_valueScore,
.apl_widget_fourLevel .apl_widget_level.apl_widget_levelLow .apl_widget_valueScore a {
color:#30a2dd;
}
/* the image container element */
.apl_widget_fourLevel .apl_widget_level .apl_widget_panel {
overflow:hidden;
width:100%;
height:135px;
position:relative;
}
/* the panel image itself */
.apl_widget_fourLevel .apl_widget_level .apl_widget_panel img {
position:absolute;
top:0;
left:-5px;
margin-top:-150px;
}
/* Individual Level image offsets */
.apl_widget_fourLevel .apl_widget_level.apl_widget_level1 .apl_widget_panel img {
left:-5px;
}
.apl_widget_fourLevel .apl_widget_level.apl_widget_level2 .apl_widget_panel img {
left:-105px;
}
.apl_widget_fourLevel .apl_widget_level.apl_widget_level3 .apl_widget_panel img {
left:-205px;
}
.apl_widget_fourLevel .apl_widget_level.apl_widget_level4 .apl_widget_panel img {
left:-305px;
}
/* mini panel offsets */
.apl_widget_fourLevel.apl_widget_fourLevelMini .apl_widget_level .apl_widget_panel img {
margin-top:-300px;
margin-left:-6px;
}
/* reset image offset via margin for highlighted/selected style */
.apl_widget_fourLevel .apl_widget_level.apl_widget_levelSelected .apl_widget_panel img {
margin:0;
}这方面的主要问题是复杂性:每条规则都有3-5个选择器,因此很难确定哪条规则适用。这里有25条规则用于用文本设计四个按钮。不会有那么难的!
一些背景:这个CSS样式是一个小部件,它显示四个位图图像,其中一个是从一个使用CSS精灵的位图中选择的。未选定的图像来自大位图的一行,处于选定状态的图像来自另一行。所选图像被放入比未选定图像的框更宽和更高的框中。
那么,是否有一个程序可以将其简化为认知上可管理的东西呢?是否有一个工具可以识别哪些值是不必要的,因为它们被更具体的选择器所取代?是否有处理CSS的最佳实践,这样您就不会获得不必要的选择性路径?
更新: 2010-08-31 12:25
因此,我研究了较少作为概念化CSS代码的一种方法。因为我的代码没有更少,所以我查找了css2less。下面是css2less在所讨论的代码上生成的内容的摘录:
.apl_widget_fourLevel {
margin:0 auto 1em;
overflow:hidden;
.apl_widget_level.apl_widget_level1 {
.apl_widget_panel {
img {
left:-5px;
}
}
}
.apl_widget_level.apl_widget_level2 {
.apl_widget_panel {
img {
left:-105px;
}
}
}
.apl_widget_level.apl_widget_level3 {
.apl_widget_panel {
img {
left:-205px;
}
}
}
.apl_widget_level.apl_widget_level4 {
.apl_widget_panel {
img {
left:-305px;
}
}
}
....
}所以事情是这样的: apl_widget_levelX实际上是独一无二的。我认为一个好的工具可以产生这样的结果:
img#apl_widget_level1 { left:-5px; }
img#apl_widget_level2 { left:-105px; }
img#apl_widget_level3 { left:-205px; }
img#apl_widget_level4 { left:-305px; }
.apl_widget_fourLevel {
margin:0 auto 1em;
overflow:hidden;
....
}对选定的/未选定的元素的类似注释。
我喜欢答案的方向,但我正在寻找工具,使我的生活更容易。该文件中的完整CSS代码为2500行,整个套件为11000行。
更新: 2010-09-01 09:50
这就是我亲手把它变成的东西:
ul.apl_widget_content {
width: 492px;
height: 140px;
position: relative;
}
ul.apl_widget_content li {
background: url(/home/hbrown/tmp/widget_fourlevel_1.png) no-repeat;
list-style: none;
display: inline;
position: absolute;
text-align:center;
text-transform:uppercase;
}
#apl_widget_level1 {
left:5px; top: 0px;
background-position: -13px -300px;
width: 86px; height: 133px;
}
#apl_widget_level2 {
left:105px; top: 0px;
background-position: -113px -300px;
width: 86px; height: 133px;
}
#apl_widget_level3 {
left:205px; top: 0px;
background-position: -213px -300px;
width: 86px; height: 133px;
}
#apl_widget_level4 {
left:305px; top: 0px;
background-position: -313px -300px;
width: 86px; height: 133px;
}
#apl_widget_level1s {
left:5px; top: 0px;
background-position: -5px 0px;
width:102px; height: 133px;
}
#apl_widget_level2s {
left:105px; top: 0px;
background-position: -105px 0px;
width:102px; height: 133px;
}
#apl_widget_level3s {
left:205px; top: 0px;
background-position: -205px 0px;
width:102px; height: 133px;
}
#apl_widget_level4s {
left:305px; top: 0px;
background-position: -305px 0px;
width:102px; height: 133px;
}
div.apl_widget_label {
padding-top: 35px;
font-size: 85%;
font-weight:normal;
top: 20px;
line-height:1em;
}
.selected .apl_widget_label {
padding-top: 15px;
}
div.apl_widget_value {
font-size:24px;
margin-top:10px;
}
.selected div.apl_widget_value {
margin-top:15px;
}
.apl_widget_value a {
text-decoration:none;
color:#FFF;
}以前是175行。现在75行。大部分代码(40行)用于CSS的快速运行。
更新2010-09-01 11:30
HTML现在看起来像:
<ul class="apl_widget_content">
<li id="apl_widget_level1">
<div class="apl_widget_label">Level </div>
<div class="apl_widget_value"><a href="#">1</a></div>
</li>
<li id="apl_widget_level2">
<div class="apl_widget_label">Level</div>
<div class="apl_widget_value"><a href="#">2</a></div>
</li>
<li id="apl_widget_level3s" class="selected">
<div class="apl_widget_label">Level</div>
<div class="apl_widget_value"><a href="#">3</a></div>
</li>
<li id="apl_widget_level4">
<div class="apl_widget_label">Level</div>
<div class="apl_widget_value"><a href="#">4</a></div>
</li>
</ul>HTML以前是这样的:
<div class="apl_widget_strand_fourLevel apl_widget_fourLevelMini">
<div class="apl_widget_content">
<div class="apl_widget_level apl_widget_level1 ">
<div class="apl_widget_label">Level</div>
<div class="apl_widget_value"><a href="#">1</a></div>
<div class="apl_widget_panel">
<img alt="" src="widget_fourlevel_1.png">
</div>
</div>
<div class="apl_widget_level apl_widget_level2 ">
<div class="apl_widget_label">Level</div>
<div class="apl_widget_value"><a href="#">2</a></div>
<div class="apl_widget_panel">
<img alt="" src="widget_fourlevel_1.png">
</div>
</div>
<div class="apl_widget_level apl_widget_level3 apl_widget_levelSelected">
<div class="apl_widget_label">Level</div>
<div class="apl_widget_value"><a href="#">3</a></div>
<div class="apl_widget_panel">
<img alt="" src="widget_fourlevel_1.png">
</div>
</div>
<div class="apl_widget_level apl_widget_level4 ">
<div class="apl_widget_label">Level</div>
<div class="apl_widget_value"><a href="#">4</a></div>
<div class="apl_widget_panel">
<img alt="" src="widget_fourlevel_1.png">
</div>
</div>
</div>
</div>发布于 2010-09-02 14:11:22
基于已发布的HTML,我建议进行以下更改:
内部类apl_widget_label和apl_widget_value是不必要的,可以简单地用惟一的元素(在li中是唯一的)替换。这可能会使选择器稍微长一些,但结构更好,可读性更强。此外,链接周围的div也是不必要的,因为链接可以直接样式化。
<ul class="apl_widget_content">
<li id="apl_widget_level1">
<div>Level </div><a href="#">1</a>
</li>
...使用
.apl_widget_content li div {
padding-top: 35px;
font-size: 85%;
font-weight:normal;
top: 20px;
line-height:1em;
}
.apl_widget_content li.selected div {
padding-top: 15px;
}
.apl_widget_content li a {
font-size:24px;
margin-top:10px;
text-decoration:none;
color:#FFF;
display: block;
}
.apl_widget_content li.selected a {
margin-top:15px;
}还可以将级别规则中的top、width和height属性移动到ul.apl_widget_content li(.selected)规则:
ul.apl_widget_content li {
...
top: 0px;
width: 86px;
height: 133px;
}
ul.apl_widget_content li.selected {
width:102px;
}
#apl_widget_level1 {
background-position: -13px -300px;
}如果您能够去掉“所选级别”if (以s结尾的if),那就太好了,但是我想不出一种仍然支持IE6的合理方法。
我只看到您已经将li设置为display: inline,同时保持块元素在它们中的位置。您需要小心处理,因为尽管CSS是技术正确的,但它的精确呈现并没有真正定义。您可以考虑使用display: inline-block或float: left。
发布于 2010-08-31 16:16:45
以下只是一些评论,很难对这样的问题给出明确的答案(尤指)。当HTML结构不可用时。
我真正得到的第一件事是的长类名。当你在课堂上重复这么多时,我觉得你做错了什么。名字像
.apl_widget_fourLevel .apl_widget_level.apl_widget_level1 .apl_widget_panel img真的应该缩短为(类似):
.apl_widget .fourlevel .panel img特别是当你的选择器基本上是90%重复的时候,比如
.apl_widget_level.apl_widget_level1这是没有意义的!在CSS中,级联保证继承,因此添加前缀--所有类名--都是必要的。当然,如果您已经到了为类名建立索引的地步,那么是时候将它们替换为id了,比如
#level1它可能看起来很小,但如果您有紧凑的、较少重复的选择器,那么它确实会使CSS更易于维护--至少您不会花那么多时间扫描选择器。
如果小部件的HTML结构在整个代码中是相同的,那么实际上可以将一些类交换为元素。当然,这会降低样式的可重用性,但鉴于小部件通常与页面的其他部分不共享相同的结构和设计,更简单的小部件样式应该可以在类上省去。选择器,如(例如)
.profile img当然,这样做比只给img一个类更好--这是您正在做的事情,同时也很容易维护。
您可能需要做的其他事情是只为特殊情况编写代码,就像这个非常简单的例子。
a {
color: white;
background: #666;
text-decoration: none;
}
a.special {
color: #B8E9FF;
}
a.brilliant {
color: #FFAFAF;
}另外,删除在每种情况下保持不变的重复类。再次,充分利用级联的潜力。
3-5个选择器最大是正常的。不过,他们中的每一个人都是3-5岁。CSS选择器在逻辑上应该从简单到复杂,因为增加了更多的情况。因此,尝试找到小部件的基础,定义一个缺省值,然后按您的方式编写代码。
代码片段本身并不太糟糕,只是包含了太多和过长的类名。但是,自下而上的重写通常会导致优化(尤指优化)。如果项目的需求自上一次开发人员以来发生了变化(我们不再需要支持IE6了,好吧!)但是,在没有看到结构的情况下,很难找到明确的解决方案。
发布于 2010-08-31 15:53:51
如果只使用四个按钮,我会在现代浏览器中将页面向上拉起,并使用开发工具包(火狐中的Firebug、Opera中的Dragonfly、Safari/Chrome中的WebKit开发工具)来检查这些按钮,并查看每个按钮上的有效样式。
https://stackoverflow.com/questions/3610649
复制相似问题