代码之家  ›  专栏  ›  技术社区  ›  hughdbrown

如何简化CSS代码

  •  2
  • hughdbrown  · 技术社区  · 14 年前

    我正在使用一段类似这样的现有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精灵。未选定的图像来自大位图的一行,处于选定状态的图像来自另一行。选定的图像将放入比未选定图像的框更宽和更高的框中。


    更新:2010-08-31 12:25

    less 作为概念化CSS代码的一种方式。因为我的代码不是less,所以我查了一下 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\u和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 spring。


    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>
    
    5 回复  |  直到 11 年前
        1
  •  1
  •   RoToRa    14 年前

    根据发布的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;
    }
    

    s ),但我想不出一个合理的方式仍然支持IE6。

    我只是看到你已经设定了 display: inline display: inline-block float: left

        2
  •  3
  •   Yi Jiang G-Man    14 年前

    下面只是一些评论;对于这样的问题很难给出明确的答案,尤其是当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
    

    索引 id s、 就像

    #level1
    

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


    .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了,万岁!)但同样,如果看不到结构,就很难做出明确的解决方案。

        3
  •  1
  •   ngroot    14 年前

        4
  •  0
  •   mwgriffith    14 年前

    你可能想过去看看 this article 我读了不久,它有一个非常好的概述,赞成的和反对的组织你的css。我还要看一看文章的底部,它有一些链接到更多的信息。

    从外观上看,您的小部件样式确实与classitis有点过火,但至少它是有文档记录的,我无法计算我看到未文档化css类的次数。

        5
  •  0
  •   pleasedontbelong    14 年前

    例如:

    /* 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 {
    

    为什么不创建另一个名为“mini display”的类,然后您的元素将如下所示:

    <div class=".apl_widget_label mini-display">..</div>
    

    你的css是:

    .mini-display{..}
    

    如果你不喜欢。。。我见过一些人创建这样的类

    <div class="left margin-auto big red ...">..</div>
    

    其中每个类更改元素上特定的内容(即left=>浮动:左;). 他们有一个他们经常使用的类库。

    推荐文章