管理CSS爆炸

我一直非常依赖CSS来开发我正在开发的网站。 现在,所有CSS样式都以每个标签为基础进行应用,因此现在我试图将其移至更多外部样式,以帮助进行任何未来更改。

但现在的问题是,我注意到我得到了“CSS爆炸”。 我很难决定如何在CSS文件中最好地组织和抽象数据。

我在网站中使用了大量的div标签,从基于表格的网站迁移而来。 所以我得到了很多像这样的CSS选择器:

div.title {
  background-color: blue;
  color: white;
  text-align: center;
}

div.footer {
  /* Styles Here */
}

div.body {
  /* Styles Here */
}

/* And many more */

这还不算太糟糕,但是因为我是初学者,所以我想知道是否可以就如何最好地组织CSS文件的各个部分提出建议。 我不想为我的网站上的每个元素都有一个单独的CSS属性,并且我总是希望CSS文件非常直观且易于阅读。

我的最终目标是简化CSS文件的使用,展示他们提高Web开发速度的能力。 这样,将来可能在本网站上工作的其他人也将采用良好编码实践的做法,而不是像我那样选择它。


这个问题问得好。 无论我看到什么,CSS文件都会在一段时间后失控 - 特别是,但不仅仅是在团队中工作时。

以下是我自己试图遵守的规则(并非我总是设法遵守)。

  • 早期重构,经常重构。 经常清理CSS文件,将同一类的多个定义融合在一起。 立即删除过时的定义。

  • 在修复错误期间添加CSS时,请留下一条评论,告诉他们该做什么(“这是为了确保该框左对齐IE <7”)

  • 避免冗余,例如在.classname.classname:hover定义相同的事物。

  • 使用评论/** Head **/建立一个清晰的结构。

  • 使用有助于保持恒定风格的美化工具。 我使用Polystyle ,我非常开心(花费15美元,但花费的很好)。 我相信也有免费的(更新:例如基于CSS Tidy的 Code Beautifier ,我还没有用过自己的开源工具,但看起来非常有趣。)

  • 建立合理的课程。 请参阅下面的一些注意事项。

  • 使用语义,避免DIV汤 - 例如,使用<ul> s作为菜单。

  • 将所有内容定义为尽可能低的级别(例如, body的默认字体系列,颜色和大小),并尽可能使用inherit

  • 如果你有非常复杂的CSS,也许CSS预编译器有帮助。 我正打算很快考虑xCSS的原因。 还有其他几个人。

  • 如果在一个团队中工作,突出强调CSS文件质量和标准的必要性。 每个人都擅长编程语言的编码标准,但很少人意识到这对于CSS也是必需的。

  • 如果在团队中工作,请考虑使用版本控制。 它使事情更容易跟踪,编辑更容易解决的冲突。 这真的很值得,即使你只是“进入”HTML和CSS。

  • 不要使用!important 。 不仅因为IE = <7不能处理它。 在一个复杂的结构中,“重要”的使用经常会诱使改变一个行为的来源无法找到,但这对于长期维护是毒害的。

  • 建立合理的班级

    这就是我喜欢构建明智的课程的方式。

    我首先应用全局设置:

    body { font-family: .... font-size ... color ... }
    a { text-decoration: none; }
    

    然后,我确定页面布局的主要部分 - 例如顶部区域,菜单,内容和页脚。 如果我编写了好的标记,这些区域将与HTML结构相同。

    然后,我开始构建CSS类,尽可能多地指定祖先,并尽可能地将相关类分组。

    div.content ul.table_of_contents 
    div.content ul.table_of_contents li 
    div.content ul.table_of_contents li h1
    div.content ul.table_of_contents li h2
    div.content ul.table_of_contents li span.pagenumber
    

    把整个CSS结构想象成一棵具有越来越具体定义的树,远离你的根。 你想保持尽可能低的班级数量,并且你想尽可能少地重复自己。

    例如,假设您有三个级别的导航菜单。 这三个菜单看起来不同,但它们也具有某些特征。 例如,它们都是<ul> ,它们都具有相同的字体大小,并且这些项目都是彼此相邻的(而不是ul的默认渲染)。 此外,没有任何菜单有任何项目符号点( list-style-type )。

    首先,定义一个名为menu的类的共同特征:

    div.navi ul.menu { display: ...; list-style-type: none; list-style-image: none; }
    div.navi ul.menu li { float: left }
    

    然后,定义三个菜单中每一个的特定特征。 1级高40像素; 级别2和3 20像素。

    注意:您也可以为此使用多个类,但Internet Explorer 6 在多个类中存在问题 ,所以此示例使用了id s。

    div.navi ul.menu#level1 { height: 40px; }
    div.navi ul.menu#level2 { height: 20px; }
    div.navi ul.menu#level3 { height: 16px; }
    

    菜单的标记如下所示:

    <ul id="level1" class="menu"><li> ...... </li></ul>
    <ul id="level2" class="menu"><li> ...... </li></ul>
    <ul id="level3" class="menu"><li> ...... </li></ul>
    

    如果你在页面上有语义相似的元素 - 比如这三个菜单 - 首先尝试找出共同点,然后将它们放到一个类中; 然后计算出特定的属性并将它们应用于类,或者如果您必须支持Internet Explorer 6,则需要使用ID。

    其他HTML技巧

    如果将这些语义添加到HTML输出中,设计人员可以稍后使用纯CSS来自定义网站和/或应用程序的外观,这是一个很大的优势和节省时间的方法。

  • 如果可能的话,给每个页面的主体一个独特的类: <body class='contactpage'>这使得向页面特定的调整添加到样式表非常容易:

    body.contactpage div.container ul.mainmenu li { color: green }
    
  • 在自动构建菜单时,尽可能多添加CSS上下文,以便稍后扩展样式。 例如:

    <ul class="mainmenu">
     <li class="item_first item_active item_1"> First item </li> 
     <li class="item_2"> Second item </li> 
     <li class="item_3"> Third item </li> 
     <li class="item_last item_4"> Fourth item </li> 
    </ul>
    

    这样,每个菜单项都可以根据其语义上下文来访问样式:无论是列表中的第一个还是最后一个项目; 无论是当前活动的项目; 和数量。

  • 请注意 ,上述示例中所述的多个类的分配在IE6中无法正常工作 。 有一个解决方法 ,使IE6能够处理多个类; 我还没有尝试过,但看起来很有前途,来自Dean Edwards。 在此之前,您必须设置对您而言最重要的课程(商品编号,活动或第一个/最后一个)或使用ID。 (booo IE6!)


    这里只是4个例子:

  • CSS约定/代码布局模型
  • 在编写我的第一个样式表时,我应该遵循哪些CSS标准?
  • 什么是整理CSS的最佳方法?
  • 最佳实践 - CSS样式表格式
  • 在所有4中,我的答案都包含了下载和阅读Natalie Downe的PDF CSS系统的建议。 (PDF中包含了很多不在幻灯片中的笔记,所以请阅读PDF!)。 注意她对组织的建议。

    编辑(2014/02/05)四年后,我会说:

  • 使用CSS预处理器,并将文件管理为partials(我个人比较喜欢Sass with Compass,但Less不错,还有其他的)
  • 阅读OOCSS,SMACSS,BEM或getbem等概念。
  • 看看Bootstrap和Zurb Foundation等流行的CSS框架是如何构建的。 不要打折不那么流行的框架 - 因纽特人是一个有趣的框架,但也有很多其他人。
  • 在持续集成服务器和/或像Grunt或Gulp这样的任务运行器上,将文件与构建步骤结合/缩小。

  • 不要在CSS中编写标题

    只是将部分分割成文件。 任何CSS评论,应该就是这样,评论。

    reset.css
    base.css
    somepage.css
    someotherpage.css
    some_abstract_component.css
    

    使用脚本将它们合并为一个; 如有必要。 你甚至可以有一个很好的目录结构,只需要你的脚本递归扫描.css文件。

    如果您必须编写标题,请在文件的开头提供TOC

    TOC中的标题应与您稍后编写的标题完全相同。 搜索标题是一种痛苦。 为了增加这个问题,如果有人想知道在你的第一个头文件后面有另一个头文件吗? PS。 在编写TOC时,不要在每行的开头添加doc-like *(星号),这只会让选择文本变得更加恼人。

    /* Table of Contents
       - - - - - - - - -
       Header stuff
       Body Stuff
       Some other junk
       - - - - - - - - -
     */
    ...
    /* Header Stuff 
     */
    ...
    /* Body Stuff 
     */
    

    在规则中写入注释,而不是在块之外

    首先,当你编辑脚本时,你有50/50的机会可以关注规则块之外的内容(特别是如果它是一个巨大的文本循环;))。 其次,(几乎)不存在你需要外部“评论”的情况。 如果它在外面,它是标题的99%,所以保持它的样子。

    将页面拆分为组件

    在大多数情况下,组件应具有position:relative ,无paddingmargin 。 这大大简化了%规则,并允许absolute:position简单得多absolute:position元素的absolute:position ,因为如果存在绝对定位的容器,绝对定位的元素将在计算toprightbottomleft属性时使用容器。

    HTML5文档中的大多数DIV通常都是一个组件。

    一个组件也可以被认为是页面上的一个独立单元。 用外行人的话来说,像对待类似黑盒子的东西是有道理的。

    再次访问QA页面示例:

    #navigation
    #question
    #answers
    #answers .answer
    etc.
    

    通过将页面拆分为组件,可以将工作分解为易于管理的单元。

    将规则与累积效应放在同一行上。

    例如, bordermarginpadding (但不是outline )都会添加到正在设置的元素的尺寸和大小。

    position: absolute; top: 10px; right: 10px;
    

    如果它们在一条线上不可读,至少要把它们放在一起:

    padding: 10px; margin: 20px;
    border: 1px solid black;
    

    尽可能使用简写:

    /* the following... */
    padding-left: 10px;
    padding-right: 10px;
    /* can simply be written as */
    padding: 0 10px;
    

    切勿重复选择器

    如果你有更多的同一个选择器的实例,你很可能会不可避免地结束同一个规则的多个实例。 例如:

    #some .selector {
        margin: 0;
        font-size: 11px;
    }
    ...
    #some .selector {
        border: 1px solid #000;
        margin: 0;
    }
    

    当你可以使用id / classes时,避免使用TAG作为选择器

    首先关闭DIV和SPAN标签是例外:永远不要使用它们! ;)只使用它们来附加一个类/ ID。

    这个...

    div#answers div.answer table.statistics {
        border-collapse: collapsed;
        color: pink;
        border: 1px solid #000;
    }
    div#answers div.answer table.statistics thead {
        outline: 3px solid #000;
    }
    

    应该这样写:

    #answers .answer .statistics {
        border-collapse: collapsed;
        color: pink;
        border: 1px solid #000;
    }
    #answers .answer .statistics thead {
        outline: 3px solid #000;
    }
    

    因为额外悬挂的DIV没有给选择器添加任何内容。 他们也强制一个不必要的标签规则。 例如,如果要更改从某个divarticle .answer ,您的样式会打破。

    或者如果你更喜欢更清晰的话:

    #answers .answer .statistics {
        color: pink;
        border: 1px solid #000;
    }
    #answers .answer table.statistics {
        border-collapse: collapsed;
    }
    #answers .answer .statistics thead {
        outline: 3px solid #000;
    }
    

    原因是border-collapse属性是一个特殊的属性,只有在应用于table时才有意义。 如果.statistics不是table ,则不适用。

    通用规则是邪恶的!

  • 如果可以的话,避免编写通用/魔法规则
  • 除非它是用于CSS重设/重设,所有的通用魔法都应该适用于至少一个根组件
  • 他们不会节省你的时间,他们让你的头部爆炸; 以及使维护成为一场噩梦。 当你写规则时,你可能知道他们在哪里申请,但是这并不能保证你的规则不会在以后混淆你。

    添加到这个通用规则是令人困惑和难以阅读的,即使你对你正在设计的文档有一些想法。 这并不是说你不应该写通用规则,除非你真的打算让它们成为通用规则,否则就不要使用它们,甚至它们会尽可能多地向选择器中添加范围信息。

    像这样的东西...

    .badges {
        width: 100%;
        white-space: nowrap;
    }
    
    address {
        padding: 5px 10px;
        border: 1px solid #ccc;
    }
    

    ...具有与在编程语言中使用全局变量相同的问题。 你需要给他们的范围!

    #question .userinfo .badges {
        width: 100%;
        white-space: nowrap;
    }
    
    #answers .answer .userinfo address {
        padding: 5px 10px;
        border: 1px solid #ccc;
    }
    

    基本上读作:

    components                   target
    ---------------------------- --------
    #answers .answer   .userinfo address
    -------- --------- --------- --------
    domain   component component selector 
    

    无论何时我知道的组件是页面上的单例,我都喜欢使用ID; 您的需求可能会有所不同。

    注意:理想情况下,您应该写得够好。 然而,提及选择器中的更多组件相比提到更少的组件而言是更宽容的错误。

    让我们假设你有一个pagination组件。 你可以在你的网站的很多地方使用它。 这将是您编写通用规则时的一个很好的例子。 比方说,你display:block单个页面的链接,并给他们一个深灰色的背景。 为了让他们可见,你必须有这样的规则:

    .pagination .pagelist a {
        color: #fff;
    }
    

    现在让我们说你使用你的分页作为答案列表,你可能会遇到类似这样的事情

    #answers .header a {
        color: #000;
    }
    ...
    .pagination .pagelist a {
        color: #fff;
    }
    

    这会使你的白色链接变黑,而你不想要。

    修复它的不正确方法是:

    .pagination .pagelist a {
        color: #fff !important;
    }
    

    解决这个问题的正确方法是:

    #answers .header .pagination .pagelist a {
        color: #fff;
    }
    

    复杂的“逻辑”评论不工作:)

    如果你写下类似这样的话:“这个价值取决于等值线和等高线的差距”,这是不可避免的,你会犯一个错误,它会像一幢房子一样掉下来。

    保持你的评论简单; 如果您需要“逻辑操作”,请考虑SASS或LESS之类的CSS模板语言之一。

    你如何写一个彩色托盘?

    离开这个结束。 为您的整个颜色托盘提供一个文件。 没有这个文件,你的风格应该在规则中仍然有一些可用的颜色托盘。 您的颜色托盘应覆盖。 您可以使用非常高级别的父组件(例如#page )链接选择器,然后将您的样式编写为自足规则块。 它可以只是颜色或更多。

    例如。

    #page #header .description,
    #page #categories .description,
    #page #answers .answer .body
    {
        color: #222; background: #fff; 
        border-radius: 10px;
        padding: 1em;
    }
    

    这个想法很简单,您的颜色托盘是独立于基础样式的样式表,您可以将它们级联到一起。

    名字较少,需要较少的内存,使代码更易于阅读

    使用更少的名字更好。 理想情况下,使用非常简单(和简短!)的词语:文本,正文,标题。

    我还发现简单单词的组合比较容易理解,然后有一长串“合适”的单词:postbody,posthead,userinfo等。

    即使有些陌生人进来阅读你的风格汤(就像你自己几周后一样),也只需要了解哪里使用了单词,而不是每个选择器的使用位置,这样就可以保持词汇量小。 例如.this每当一个元素被假定为“所选项目”或“当前项目”等时,就使用这个。

    自己清理

    编写CSS就像吃东西,有时候你会留下一团糟。 确保你清理了那个烂摊子,否则垃圾代码就会堆积如山。 删除不使用的课程/ ID。 删除不使用的CSS规则。 确保一切都很好,你没有冲突或重复的规则。

    如果您按照我的建议,将一些容器当作您的样式中的黑盒子(组件),在选择器中使用这些组件,并将所有内容保存在一个专用文件中(或者用TOC和头文件正确拆分文件),然后工作要容易得多......

    您可以使用诸如firefox扩展程序Dust-Me Selectors(提示:将其指向您的sitemap.xml)的工具,以帮助您找到隐藏在您的css核心和carnies中的一些垃圾。

    保留一个unsorted.css文件

    假设你正在设计一个QA网站,并且你已经有了一个“答案页面”的样式表,我们将会调用answers.css 。 如果您现在需要添加大量新的CSS,请将其添加到unsorted.css样式表中,然后重构到answers.css样式表中。

    有几个原因:

  • 在完成后重构速度更快,然后搜索规则(可能不存在)并注入代码
  • 你会写出你将删除的东西,注入代码只会使删除代码变得更加困难
  • 附加到原始文件很容易导致规则/选择器重复
  • 链接地址: http://www.djcxy.com/p/87429.html

    上一篇: Managing CSS Explosion

    下一篇: How does ?#iefix solve web fonts loading in IE6