是否应该针对每个屏幕尺寸将大型CSS媒体查询文件拆分为单独的文件?


19

我正在一个响应式设计网站上提供各种屏幕尺寸的内容。我有针对5个不同“步骤”的媒体查询,而CSS文件约为30 Kb。

最好将其拆分为单独的文件,并使它们类似于以下内容:

<link rel='stylesheet' media='screen and (min-width: 701px) and (max-width: 900px)' href='css/medium.css' />

还是应该将它们保存在一个CSS文件中?

更新:我只是想补充一点,我主要关心的是跨浏览器/设备页面的打开/呈现速度,而不是易于开发。


是否存在grunt / webpack / whatever插件来获取单个CSS文件并将其拆分为多个文件,并通过媒体查询将其分开?这样一来,您可以说可以通过一个整体文件来简化开发过程,并且可以优化单独文件的速度。
凯文·惠勒2015年

Answers:


16

我认为这实际上取决于您发现最容易开发的内容以及可以帮助您保持整洁的样式表的内容。

在拆分时,我唯一想到的真正缺点是,如果元素的属性出现在所有样式表中,则必须更新5个单独的文件才能进行更改(而不是并排出现在一个位置)。

根据帖子的答案,浏览器将下载所有样式表,无论如何,因此拆分分辨率不是节省带宽的方法:https : //stackoverflow.com/questions/16657159/when-using-media-queries-does-a电话加载非相关查询和图像


在您链接的那篇文章中,您知道他所说的“这是CSSOM的局限性”的意思吗?
DisgruntledGoat 2014年

1
CSS对象模型-dev.w3.org/csswg/cssom-我认为这定义了CSS的处理方式,因此我认为他所指的局限性在于没有模型可以更节省带宽地处理此类样式办法。
理查德B

3
虽然它不是下载保护程序,但它在某种程度上是可行的。浏览器将匹配的媒体查询链接优先于不匹配的媒体查询链接。匹配的css文件将阻止页面渲染,而不匹配的css文件将被浏览器下载的优先级降低,并且根本不会阻止页面渲染。同样,一旦拆分,您可以使用js进行有条件的下载(如果要保存并绑定)。
达洛尔2015年

4

这在某种程度上取决于您要实现的目标:是要使页面加载速度更快还是要使开发更轻松?

如果您针对后者,则可以使用多个工作表,但这仅是一个优先事项。我发现使用一个大文件最容易,因为这使您可以大致了解已声明的所有样式。

如果您想要一个更快的加载页面,而不是最好的选择,那就是最大程度地减少请求数量,因为请求开销很大。此外,您可以自己保留开发版本并在Web上使用最少的CSS(我发现YUI是一个好方法:http : //www.refresh-sf.com/yui/)。

此外,我会尝试优化CSS本身。您可以尝试合并非常相似的类,例如:

.bold-and-italic { font-weight: bold; text-style: italic; }

可以转换为:

.bold { font-weight: bold; }
.italic { text-style: italic; }

唯一的事情是您必须将html从略微更改<span class="bold-and-italic">foo bar</span><span class="bold italic">foo bar</span>

我可以强烈建议您看一下Bootstrap(http://getbootstrap.com),这些家伙在将类划分为多个“子类”方面做得很好。

我希望这有帮助。


1
以样式命名的类是错误的形式。如果要这样做,也可以只放入样式属性。最好将类命名为逻辑。赞.important
dalore

4

最好只有一个CSS文件,但要缩小并gzip文件。假设您之前有30KB的空间,那么经过压缩(去除空格)和gzip后,您可能会将文件大小减小到大约5KB。

拆分可能会为您带来更多的加速,但仅限于某些情况。

  • 您必须确保每次仅加载一个样式表-否则,您将需要两个或多个HTTP请求,这些请求本身具有开销,这至少会部分抵消较小文件大小的收益。要做到这一点,这是足够的,只是分裂样式表,并插入多个<link>不同的媒体属性标签都有效,浏览器似乎加载所有<link>编辑样式,无论媒体查询(感谢@cimmanon这个信息,不知道) 。
  • 样式表之间共享的CSS规则的数量必须很小-否则,多个样式表中的每个样式表都需要包含所有通用规则,因此几乎具有原始样式的大小。
  • 您使用CSS预处理器(或类似的预处理器),因此可以在5个样式表中使用相同的代码段。

另外:不要过早优化。仅在遇到性能问题时才这样做。


3
值得注意的是,如果您在<link rel="stylesheet" />所有媒体查询特定文件中都使用标记,则将无法阻止浏览器下载它们。您将不得不在服务器端使用浏览器嗅探或使用JavaScript来检查视口尺寸并注入适当的样式表。这些都不是很好的选择。
cimmanon14年

1
我有点惊讶,但是您是对的-我认为将媒体属性添加到<link>-tag会阻止加载不匹配的样式表。为什么浏览器会这样做?当然,这是拆分样式表的唯一最重要的原因。
2014年

他们这样做是因为您的屏幕可以更改,如果您使用的是移动电话,并且将其从纵向旋转到横向旋转,屏幕宽度突然会有所不同。或者,您可以在桌面上调整浏览器窗口的大小,或者如果您具有多显示器设置,则将窗口拖动到另一个屏幕上。如果浏览器未提前下载所有CSS资产,并且发生了上述任何一种情况,则重新呈现页面会有所延迟
MrCarrot

最好将它们分开。如今,大多数浏览器都是spdy浏览器(您的站点使用https和spdy应该是正确的),并且使用spdy将多个连接多路复用到同一连接中,因此文件的数量现在不再重要。此外,浏览器还会将优先级较低的不匹配媒体查询的CSS文件下载到文件中,更重要的是不会阻塞页面渲染。
达洛尔2015年

3

您应该根据媒体查询拆分CSS文件,因为CSS文件受到渲染阻止。

当浏览器构建DOM时,它必须首先等待并加载所有CSS文件。如果某些CSS文件仅基于某些媒体查询来加载,则可以减少页面加载时间。

这也适用于向JavaScript脚本标记添加异步;例如:<script src='myfile.js' async></script>

DOM不必等待JS文件加载。仅当DOM的构造在onload上不需要任何JavaScript时,才添加异步。


我听说它声称,如果您确实不希望异步脚本潜在地延迟渲染,请在window.onload事件上执行它们,而不要使用异步。
凯文·惠勒

2

我倾向于这样说。

对于生产,请始终将它们保存在一个文件中;原因是它对浏览器更有效,并且这是从开发到生产时的首要利益(IMO)。

发展是另一回事。我倾向于将媒体查询拆分为任意元素,例如:

.foo { // .. some css }
.foo:hover, .foo:focus { // hover css }
@media screen and (max-width: 400px) {
    .foo { // .. some differentcss }
}

通常,如果我要更改元素,我不需要到处寻找CSS(尽管您可以使用grep之类的东西...)。

但是,我要说的一件事是,值得考虑站点本身,开发过程等等。如果您真的认为将它们分成基于屏幕大小的文件是值得的,那就试试吧。制作该站点的副本(如果可能),并尝试使用该副本-如果使副本更容易,请使用该副本。您无需遵循一种开发所有网站的千篇一律的范例。


1

简单:使用1个样式表,并向其中添加注释,以使查找和更改CSS样式更加容易,例如:

//sheet 1 (mobile device 800 px)
code

//sheet 2 (mobile device 768 px)
code

//sheet 3 (mobile device 480 px)
code

//sheet 4 (desktop size 1024 px)
code

如果您愿意,可以使用多个样式表,并为每个特定大小调用它们。


-1

我宁愿看看Bootstrap。它是包含所有CSS的1个CSS文件。它可以在几乎99%的浏览器上运行,并且响应速度非常快。

单击实时演示进行放大(Ctrl +=放大,Ctrl -=缩小,Ctrl 0=正常)或在您的手机上打开以查看其呈现方式。


2
他已经编写了30kb的CSS,如何切换到引导程序可能会有好处?
史蒂夫·桑德斯

那样说,是的,我同意30kb的CSS是重做的任务。我只是将其复制并粘贴到不同的样式表中,所有这些都取决于它的结构,您可以复制并重命名css文件并删除所有不必要的部分。
Regardt Ogies Myburgh 2014年
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.