首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何简化CSS代码

如何简化CSS代码
EN

Stack Overflow用户
提问于 2010-08-31 15:37:05
回答 5查看 1.9K关注 0票数 2

我正在使用如下所示的现有CSS代码(摘自更大的代码体):

代码语言:javascript
复制
.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在所讨论的代码上生成的内容的摘录:

代码语言:javascript
复制
.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实际上是独一无二的。我认为一个好的工具可以产生这样的结果:

代码语言:javascript
复制
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

这就是我亲手把它变成的东西:

代码语言:javascript
复制
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现在看起来像:

代码语言:javascript
复制
<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以前是这样的:

代码语言:javascript
复制
<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>
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-02 14:11:22

基于已发布的HTML,我建议进行以下更改:

内部类apl_widget_labelapl_widget_value是不必要的,可以简单地用惟一的元素(在li中是唯一的)替换。这可能会使选择器稍微长一些,但结构更好,可读性更强。此外,链接周围的div也是不必要的,因为链接可以直接样式化。

代码语言:javascript
复制
<ul class="apl_widget_content">
    <li id="apl_widget_level1">
        <div>Level </div><a href="#">1</a>
    </li>
   ...

使用

代码语言:javascript
复制
.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;
}

还可以将级别规则中的topwidthheight属性移动到ul.apl_widget_content li(.selected)规则:

代码语言:javascript
复制
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-blockfloat: left

票数 1
EN

Stack Overflow用户

发布于 2010-08-31 16:16:45

以下只是一些评论,很难对这样的问题给出明确的答案(尤指)。当HTML结构不可用时。

我真正得到的第一件事是的长类名。当你在课堂上重复这么多时,我觉得你做错了什么。名字像

代码语言:javascript
复制
.apl_widget_fourLevel .apl_widget_level.apl_widget_level1 .apl_widget_panel img

真的应该缩短为(类似):

代码语言:javascript
复制
.apl_widget .fourlevel .panel img

特别是当你的选择器基本上是90%重复的时候,比如

代码语言:javascript
复制
.apl_widget_level.apl_widget_level1

这是没有意义的!在CSS中,级联保证继承,因此添加前缀--所有类名--都是必要的。当然,如果您已经到了为类名建立索引的地步,那么是时候将它们替换为id了,比如

代码语言:javascript
复制
#level1

它可能看起来很小,但如果您有紧凑的、较少重复的选择器,那么它确实会使CSS更易于维护--至少您不会花那么多时间扫描选择器。

如果小部件的HTML结构在整个代码中是相同的,那么实际上可以将一些类交换为元素。当然,这会降低样式的可重用性,但鉴于小部件通常与页面的其他部分不共享相同的结构和设计,更简单的小部件样式应该可以在类上省去。选择器,如(例如)

代码语言:javascript
复制
.profile img

当然,这样做比只给img一个类更好--这是您正在做的事情,同时也很容易维护。

您可能需要做的其他事情是只为特殊情况编写代码,就像这个非常简单的例子。

代码语言:javascript
复制
a {
  color: white;
  background: #666;
  text-decoration: none;
}

a.special {
  color: #B8E9FF;
}

a.brilliant {
  color: #FFAFAF;
}

另外,删除在每种情况下保持不变的重复类。再次,充分利用级联的潜力。

3-5个选择器最大是正常的。不过,他们中的每一个人都是3-5岁。CSS选择器在逻辑上应该从简单到复杂,因为增加了更多的情况。因此,尝试找到小部件的基础,定义一个缺省值,然后按您的方式编写代码。

代码片段本身并不太糟糕,只是包含了太多和过长的类名。但是,自下而上的重写通常会导致优化(尤指优化)。如果项目的需求自上一次开发人员以来发生了变化(我们不再需要支持IE6了,好吧!)但是,在没有看到结构的情况下,很难找到明确的解决方案。

票数 3
EN

Stack Overflow用户

发布于 2010-08-31 15:53:51

如果只使用四个按钮,我会在现代浏览器中将页面向上拉起,并使用开发工具包(火狐中的Firebug、Opera中的Dragonfly、Safari/Chrome中的WebKit开发工具)来检查这些按钮,并查看每个按钮上的有效样式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3610649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档