单个巨大的.css文件与多个较小的特定.css文件?[关闭]


258

拥有一个包含将在几乎所有页面上使用的样式元素的单个Monster .css文件有什么好处?

我在想,为了便于管理,我想将不同类型的CSS提取到几个文件中,并在我的主文件中包含每个文件,这<link />有什么不好吗?

我觉得这样比较好

  1. positions.css
  2. button.css
  3. table.css
  4. copy.css

  1. site.css

您有没有看到一种相对于另一种方法的陷阱?


1
这是一个非常老的问题,但是面对同样的问题,我发现这是最好的解决方案,以防其他人进入此页面。用PHP压缩并通过单个请求发送的多个文件。
Francisco Presencia,2012年

3
@FrankPresenciaFandos可以在低流量站点上执行此操作,但是在高流量站点上反复运行此脚本似乎有点困难。如果您使用的是构建脚本,则可以兼得两全,而且由于从未运行过php脚本,因此仍然可以保持高性能的Web服务器。
Chase Florell

2
它仅在每次更改CSS时才运行,然后您必须包括生成的CSS文件。
Francisco Presencia

Answers:


85

像Sass或LESS这样的CSS编译器是一种不错的选择。这样,您将能够为该站点交付一个最小化的CSS文件(它将比普通的单个CSS源文件小得多,并且速度更快),同时保持最佳的开发环境,并将所有内容整齐地分成组件。

Sass和LESS具有变量,嵌套和其他使CSS易于编写和维护的其他方式的优点。高度推荐。我现在个人使用Sass(SCSS语法),但是以前使用LESS。两者都很棒,具有相似的好处。用编译器编写CSS后,如果没有CSS,就不太可能想做。

http://lesscss.org

http://sass-lang.com

如果您不想弄乱Ruby,那么适用于Mac的LESS编译器非常有用:

http://incident57.com/less/

或者您可以使用CodeKit(由同一个人):

http://incident57.com/codekit/

WinLess是一个Windows GUI,用于连接LESS

http://winless.org/


2
在这里更改我接受的答案,因为这确实是最近的方式。当我最初询问时,我觉得Sass或LESS尚未真正起飞。
Nate

144

这是一个很难回答的问题。我认为这两种选择都有其优缺点。

我个人不喜欢阅读单个巨大的CSS文件,并且维护它非常困难。另一方面,将其拆分会导致额外的http请求,这可能会减慢速度。

我认为这是两件事之一。

1)如果您知道自己的CSS永远不会改变,那么我将在开发阶段构建多个CSS文件(以提高可读性),然后在上线之前手动组合它们(以减少http请求)

2)如果您知道不时要更改CSS,并且需要保持可读性,那么我将构建单独的文件并使用代码(假设您使用某种编程语言)在以下位置将它们组合在一起运行构建时间(运行时最小化/组合是资源消耗)。

无论使用哪种方法,我都强烈建议在客户端进行缓存,以进一步减少http请求。

编辑:
我发现这个博客展示了如何在运行时仅使用代码就结合CSS。值得一看(尽管我自己还没有测试过)。

编辑2:
我已经决定在设计时使用单独的文件,并采用最小化和组合的构建过程。这样,我可以在开发时拥有单独的(可管理的)css,并在运行时拥有适当的整体式缩小文件。而且我仍然拥有我的静态文件,并减少了系统开销,因为我没有在运行时进行压缩/压缩。

注意:对于那些在那里购物的人,我强烈建议在您的构建过程中使用捆绑程序。无论是从IDE内部构建,还是从构建脚本构建,捆绑程序都可以通过Windows中包含的捆绑程序执行,exe也可以在已经运行node.js的任何计算机上运行。


除了更少的HTTP请求之外,单个整体文件还有什么优势?我的CSS可能会随着时间而变化,但是用户数量会非常少,大多数通过高速连接进行访问。因此,我认为使用多个文件的优势将远胜于更少的HTTP请求...
Nate 2010年

1
较少的HTTP请求是原因。留住访客是第一要务,因此,如果您的网页加载速度缓慢,他们停留的可能性就较小。如果您有能力合并(我看到您正在使用asp.net),那么我强烈建议您这样做。这是两全其美。
Chase Florell '02

3
“因此,我认为多个文件的优势将远胜于更少的http请求……”不,不,不……完全相反。对于高速连接,处理HTTP请求所花费的时间是瓶颈。默认情况下,大多数浏览器一次只下载两个文件,因此浏览器将执行2个请求,等待,快速下载css文件,再发送2个请求,等待,快速下载文件。与一个HTTP请求一个css文件相反,它可以快速下载。与服务器的通信将是较慢的部分。
Isley Aardvark'2

1
您可以使用单独的样式表来构建和测试功能,并在构建时将它们组合为一个mongo。这样,您无需维护一个mongo文件,而是维护许多较小的文件。我们这样做是为了压缩所有空白和注释,使人类易于阅读但对您的网页毫无意义。
不退款

2
现在http2减少了较少请求的优势,因此将有一个最新的答案。
DD。

33

我更喜欢在开发过程中使用多个CSS文件。这样,管理和调试就容易得多。但是,我建议在部署时改用CSS最小化工具(如YUI Compressor),它将CSS文件合并为一个整体文件。


@Randy Simon-但是,如果我们总是直接在ftp上直接编辑CSS,该怎么办?
Jitendra Vyas,2010年

15
我不知道您的设置,但这对我来说似乎不是一个好主意。在推出变更之前,您应该先进行测试。
兰迪·西蒙

1
@RandySimon YUI Compressor链接已损坏。
改革

16

你想要两个世界。

您需要多个CSS文件,因为您的理智浪费了。

同时,最好有一个大文件。

解决方案是采用某种机制将多个文件合并为一个文件。

一个例子是

<link rel="stylesheet" type="text/css" href="allcss.php?files=positions.css,buttons.css,copy.css" />

然后,allcss.php脚本处理文件的串联并传送它们。

理想情况下,脚本将检查所有文件的修改日期,如果其中任何文件发生更改,则创建一个新的组合,然后返回该组合,然后对照If-Modified HTTP标头进行检查,以免发送多余的CSS。

这使您两全其美。同样适用于JS。


7
但是,运行时压缩/最小化会增加系统开销。您必须权衡利弊。如果您的网站流量很高,这不是最佳解决方案。
Chase Florell 2011年

5
@ChaseFlorell -你只是做压缩/缩小一次,并将它缓存
塞勒

@Siler,我知道,这就是为什么我发布答案的原因。stackoverflow.com/a/2336332/124069
Chase Florell,2014年

14

只包含一个CSS文件对于页面的加载时间会更好,因为这意味着更少的HTTP请求。

拥有几个CSS文件意味着开发更容易(至少,我认为是这样:每个应用程序模块一个CSS文件使事情变得更容易)

因此,在两种情况下都有充分的理由...


一个可以让您充分利用这两个想法的解决方案是:

  • 使用几个小的CSS文件进行开发
    • 即更容易开发
  • 要为您的应用程序创建一个构建过程,该过程将这些文件“组合”为一个
    • 该构建过程还可以缩小该大文件,顺便说一句
    • 显然,这意味着您的应用程序必须具有一些配置内容,才能从“多文件模式”切换到“单文件模式”。
  • 在生产中仅使用大文件
    • 即更快地加载页面

也有一些软件可以在运行时(而不是在构建时)组合CSS文件。但是在运行时执行此操作意味着要消耗更多的CPU (并且显然需要一些缓存机制,以免过于频繁地重新生成大文件)


13

从历史上看,拥有单个CSS文件的主要优势之一是使用HTTP1.1时的速度优势。

但是,截至2018年3月,超过80%的浏览器现在支持HTTP2,这允许浏览器同时下载多个资源以及能够抢先推送资源。所有页面只有一个CSS文件意味着文件大小超出了必要。通过适当的设计,除了易于编码之外,我看不到这样做的任何优势。

HTTP2以获得最佳性能的理想设计是:

  • 有一个核心CSS文件,其中包含所有页面使用的通用样式。
  • 在单独的文件中包含页面特定的CSS
  • 使用HTTP2推送CSS可以最大程度地减少等待时间(可使用cookie来防止重复推送)
  • (可选)在折叠式CSS上方分离并先推送,然后再加载其余CSS(适用于低带宽移动设备)
  • 如果要加快将来的页面加载速度,也可以在页面加载后为网站或特定页面加载剩余的CSS。

1
这应该是公认的现代答案RE性能。其他一些答复已过时。
SparrwHawk

如果您要构建SPA(单页应用程序),那么我认为最好的设计是将所有CSS和JS都构建为两个完整文件。“ app.js”和“ vendor.js”所有的html和样式都编译为vendor.js中的内联JS,这意味着“ bootstrap.css和bootstrap.js”都在vendor.js中,并且通过源映射最小化为“ vendor.min.js”。与应用程序相同,只是现在您使用html到js内联翻译程序,因此即使您的应用程序html也位于js文件中。您可以将它们托管在CDN上,浏览器将对其进行缓存。您甚至可以将图像编译为样式并转换为JS。
瑞安·曼

12

整体样式表确实提供了很多好处(在其他答案中有描述),但是根据样式表文档的整体大小,您可能会在IE中遇到问题。IE有一个限制,即它将从一个文件中读取多少个选择器。限制为4096个选择器。如果您使用的是整体样式表,那么您将需要拆分它。此限制只会使它在IE中变得丑陋。

这适用于IE的所有版本。

请参阅Ross Bruniges博客MSDN AddRule页面


7

有一个转折点,拥有多个css文件有益。

一个拥有超过1M页的网站(普通用户可能只看到其中的5个)的样式表可能具有巨大的比例,因此,通过进行大量的初始下载来尝试节省每个页面加载单个额外请求的开销是错误的经济。

将参数扩展到极限-就像建议为整个Web维护一个大的样式表。显然是荒谬的。

尽管每个站点的转折点都不同,所以没有硬性规定。这将取决于每页唯一CSS的数量,页数以及普通用户在使用该网站时可能经常遇到的页数。


是。这是我来这里的问题。每个人都专注于开发与生产。当然,您的开发环境可能与实际站点有所不同,但是哪个对实际站点更好?似乎没有人真正解决这个问题。您是否知道找到临界点的任何资源?
Dominic P

5

我通常有一些CSS文件:

  • 用于重置和全局样式的“全局” css文件
  • 逻辑分组页面的“模块”特定css文件(可能是结帐向导中的每个页面等)
  • 用于页面上替代的“页面”特定css文件(或将其放在单个页面上的块中)

我不太关心CSS文件的多个页面请求。大多数人的带宽都不错,我敢肯定还有其他优化措施比将所有样式组合到一个单一的CSS文件中具有更大的影响。折衷是在速度和可维护性之间,而我始终倾向于可维护性。不过,YUI压缩器听起来很酷,我可能必须检查一下。


这就是我的工作,对我来说一直很好。每个页面最多可以获得3个CSS文件,这非常合理
Ricardo Nunes

4

我更喜欢多个CSS文件。这样一来,您就可以更轻松地交换“皮肤”。一个整体文件的问题在于它可能会失控并且难以管理。如果您想要蓝色背景但又不想更改按钮怎么办?只需更改您的背景文件。等等。


问题是,从开发人员的角度来看,这是相当自私的。完成后,您几乎不必回头,但是访问者都必须等待页面加载不必要的CSS文件。(我认为
Java脚本

3
@rockin:清除缓存后检查我的5-CSS文件站点之一时,我发现加载所有CSS所需的总时间少于十分之一秒。如果人们不能等那么久,我认为他们需要更多的利他林或其他产品。更大的问题是对广告网站的回调(如doubleclick等),这可能会导致巨大的延迟,就像过去一周在该网站上所看到的那样。
罗布斯托

Firebug和YSlow一起是测试站点速度的绝佳工具。这应该可以使您准确地表示站点的速度。
Chase Florell'2

4

也许看看指南针,这是一个开放源代码CSS创作框架。它基于Sass,因此它支持诸如变量,嵌套,mixins和import之类的很棒的东西。如果要保留单独的较小CSS文件但将它们自动合并为1(避免多次缓慢的HTTP调用),则导入尤其有用。指南针为此添加了一大堆预定义的mixin,可轻松处理跨浏览器的内容。它是用Ruby编写的,但是可以很容易地在任何系统上使用。


3

这是最好的方法:

  1. 使用所有共享代码创建通用的CSS文件
  2. 将所有特定页面的CSS代码插入到同一页面中,在标记上,或对每个页面使用style =“”

这样,您只有一个带有所有共享代码的CSS和一个HTML页面。顺便说一句(我知道这不是正确的主题),您还可以在base64中编码图像(但也可以使用js和css文件来编码)。这样,您可以将更多的http请求减少到1。


2

SASS和LESS使得这一切真正成为问题。开发人员可以设置有效的组件文件,并在编译时将它们全部合并。在SASS中,您可以在开发时关闭“压缩模式”,以便于阅读,然后再将其打开以进行生产。

http://sass-lang.com http://lesscss.org

最后,无论您使用哪种技术,都只需要一个缩小的CSS文件。更少的CSS,更少的HTTP请求,更少的服务器需求。


1

单个CSS文件的优点是传输效率。每个HTTP请求意味着对每个请求的文件的HTTP标头响应,并且占用带宽。

我将CSS作为PHP文件提供,在HTTP标头中使用“ text / css” mime类型。这样,我可以在服务器端拥有多个CSS文件,并使用PHP包括在用户请求时将它们推送到单个文件中。每个现代的浏览器都会接收带有CSS代码的.php文件,并将其作为.css文件进行处理。


因此,如果我使用的是ASP.NET,那么.ASHX通用处理程序将是理想的选择,它将它们组合到一个文件中以兼顾两者的优点?
Nate

是的,我会在运行时使用IHttpHandler组合您的CSS(请参见上面答案中的#2)
Chase Florell 2010年

@Nate:在ASP.Net中工作时,我们使用模板文件来完成相同的操作。
罗布斯托

@Robusto,您能解释一下什么是模板文件吗?我想我从未听说过。我使用了App_Themes,但是仍然没有结合CSS。
Chase Florell'2

1
只是作为更新。使用IHttpHandler或PHP文件在服务器端结合CSS可以节省带宽并加快请求的速度,但同时也会增加服务器上不必要的负载。最好的方法是在网站的构建/发布过程中结合/最小化CSS / JS。这样,您就拥有了一个静态文件,该文件不进行任何服务器处理。无所不包,无处可去。
Chase Florell 2011年

1

您可以只使用一个css文件来提高性能,然后注释掉以下部分:

/******** Header ************/
//some css here

/******* End Header *********/


/******** Footer ************/
//some css here

/******* End Footer *********/

等等


4
这样做并没有使它更容易维护,因为我仍然需要滚动几英里无关的css才能达到我想要的目标……
Nate 2010年

2
@Nate:您是否考虑过切换到具有良好搜索功能的文本编辑器?我个人的喜好是单个css文件,我从不滚动它。我只输入“ / classname”(我使用vi派生词)和bam-我在那个课上。
戴夫·谢罗曼

3
在多开发人员环境中也很难维护。您上面的示例中的“标题”是什么?如果其他人不是在地理上思考,而是在基本设计元素(如按钮或菜单)方面思考,而其他人却在思考不同,该怎么办?如果菜单在标题中,该去哪里?如果不是呢?我认为在单独的文件中强制执行这种规则比较容易。为什么应用程序开发人员不仅仅使用所有修饰来创建一个巨大的应用程序类,而不使用具有类层次结构的框架?似乎与我相似。
罗布斯托

如果您不记得要查找的班级名称怎么办?或者您如何决定在哪里添加新课程?
内特2010年

如果只是几个页面的网站,那实际上没什么大不了的。只是建议另一种做事方式。
fish鱼2010年

1

我正在使用Jammit处理我的CSS文件,并使用许多不同的文件来提高可读性。Jammit并不会在将产品部署到生产环境中之前完成所有合并和压缩文件的工作。这样,我正在开发许多文件,但在生产中只有一个文件。


0

捆绑的样式表可能会节省页面加载性能,但是样式越多,浏览器在您所在页面上呈现动画的速度就越慢。这是由于您的页面上可能没有大量未使用的样式而导致的,但浏览器仍然需要计算。

参见:https : //benfrain.com/css-performance-revisited-selectors-bloat-expensive-styles/

捆绑样式表的优点: -页面加载性能

样式表捆绑 在一起的缺点: -行为较慢,在滚动,交互性,动画,

结论: 要解决这两个问题,对于生产而言,理想的解决方案是将所有css捆绑到一个文件中以保存在http请求上,但是使用javascript从该文件中提取您所在页面的css并用其更新页眉。

为了知道每页需要哪些共享组件并降低复杂性,最好声明此特定页面使用的所有组件-例如:

<style href="global.css" rel="stylesheet"/>
<body data-shared-css-components="x,y,z">

-1

我为CSS开发创建了一种系统的方法。这样,我就可以利用永远不变的标准。首先,我从960网格系统开始。然后,我为基本布局,边距,填充,字体和大小创建了一行CSS。然后,根据需要将它们串在一起。这使我可以在所有项目中保持一致的布局,并一遍又一遍地使用相同的CSS文件。因为它们不是特定的。这是一个示例:---- div class =“ c12 bg0 m10 p5 white fl” / div ---这意味着该容器的宽度为12列,利用bg0的边距为10px填充为5,文本为白色,并且浮动剩下。我可以通过删除或添加新的样式来轻松更改此样式-我称之为“轻型”样式-无需创建具有所有这些属性的单个类;在编写页面代码时,我只是简单地组合了单个样式。这使我可以创建样式的任何组合,并且不会限制我的创造力,也不会导致我创建大量相似的样式。您的样式表变得更加易于管理,最小化,并允许您反复使用它。我发现这种方法非常适合快速设计。我也不再首先在PSD中进行设计,而是在浏览器中进行设计,这也节省了时间。另外,因为我还为背景和页面设计属性创建了一个命名系统,所以我在创建新项目时只需更改图像文件即可。(bg0 =根据我的命名系统生成的主体背景)这意味着如果我以前有一个白色一个项目的背景,只需将其更改为黑色就意味着在下一个项目中,bg0将是黑色背景或另一张图像...


12
你知道什么段落吗?
2012年

这是Bootstrap或其他工具所采用的“ UI框架”,一旦您知道自己可以使用的词典,这全都与学习曲线和所用术语的接受有关。尽管如此,我仍然可以想到一些非常具体的实例,在这些实例中,您的示例将难以满足设计师的要求。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.