问题
微软的IE浏览器支持文档解释了在Internet Explorer 6-9:
- 第31个风格的标签后,所有的风格标签不适用。
- 第一4,095规则之后的所有样式规则不适用。
- 在使用了@import规则不间断的导入外部样式表导入其他样式表,样式表是超过三个层次的深度被忽略的页面。
有很多的这个问题的证据脚本演示 。 又见祝福 。
解决方案所需
我们需要一种方法来通过在资产管道链轮产生,以保持最大选择数低于4096编译的样式,并链接分头他们部署Rails应用程序的HTML。 我们如何能够通过处理资产(尤其是样式表)的编译输出作为参数的方法,然后可以修改这些文件?
见下尝试了一个地方开始。 如果有人可以帮助我找到一种方法,使任何操作(或一个全新的解决方案),这将是太棒了!
现有的解决方案的尝试
祝福创建通过拆分样式表,以保持每一片的最大选择数下的极限来解决这个问题。 祝福在node.js中的服务器上运行 我还没有看到一个Ruby等价呢。 埃里克领域试图成为指南针编译祝福资产 (在节点中运行),但解决方案取决于指南针处理资产编译,因而似乎并不与资产管道的工作。 注意,不是链接到多个样式表,保佑增加@include
语句到第一片,这可能是去,以避免接触标记的方式。
当基督教彼得斯(@crispy) 发现了这个问题 ,他实现了一个分流器一样祝福也通过罗盘输出到自定义模块,它的Rails 3.1之前,伟大的工作。 后来,他改编与与Rails资产管道整合SprocketsEngine他的分路器 。 我试图实施新的代码,但它似乎并没有自动功能(尽管在控制台手动调用时分离器工作正常)。
相关信息
有关在IE 6-9的CSS限制的详细信息,请参阅以下相关问题:
- 难道IE 8对每个页面样式表的数量限制吗?
- Internet Explorer的CSS规则的限制
我们有一个自动化的(尽管在某种程度上别扭)解决方案生产工作为Rails 3.1的应用程序与地方资产的管道。 瑞安已经在引用他的问题的解决,但我试着拿出一个更全面的答案。
资产管线管,并通过不同的链轮引擎的资产。
所以,你可能有如ie.css.sass.erb
通过再培训局链轮引擎运行,然后传递到萨斯链轮引擎等,但它始终是在一个文件,一个文件了。
在这个特殊的问题,我们希望能有1个入站文件和n外送文件。 我们还没有找到一种方法,使这可能与链轮。 但是,我们发现了一个解决办法:
提供一个ie.css.sass
,其中包括完整的样式表和一个ie_portion2.css.sass.split2
刚刚导入完整ie.css文件:
//= include 'ie.css'
对于split2
文件扩展名,我们注册一个链轮引擎:
require 'css_splitter'
Rails.application.assets.register_engine '.split2', CssSplitter::SprocketsEngine
当与split2扩展评估资产,我们通过其内容到CssSplitter并指示它提取部分2(> 4095种选择):
require 'tilt'
module CssSplitter
class SprocketsEngine < Tilt::Template
def self.engine_initialized?
true
end
def prepare
end
def evaluate(scope, locals, &block)
part = scope.pathname.extname =~ /(\d+)$/ && $1 || 0
CssSplitter.split_string data, part.to_i
end
end
end
这也将工作进一步件(split3,...)。
CSS的分路器识别有效的地方,样式表可在低于4096个选择被分成几部分并返回请求的一部分。
其结果是,你必须在头部连结,并分别预编译ie_portion2.css。
我希望我的修订CSS分配器要点是完全够应用解决方案。
更新:
上述CssSplitter mentionend已发行的创业板现在: https://github.com/zweilove/css_splitter
我在生产中使用的解决方案是非常简单的,不是自动的,但工作得很好。 对我来说这是应该做的明显的事情,所以也许你已经想到它,不喜欢它 - 无论哪种方式,在这里我们去:
我假设你使用的青菜,如果没有,我想你应该:)
首先 ,分裂您application.css.scss
:在单独的文件,如application_a.css.scss
和application_b.css.scss
其次 ,在你application.css.scss
文件,使用:
@import "application_a"
@import "application_b"
第三 ,你的布局模板,既包括完整的文件,或者两个部分:
<!--[if !IE]><!-->
# link to application.css.scss
<!--<![endif]-->
<!--[if IE]>
# link to application_a.css.scss
# link to application_b.css.scss
<![endif]-->
附注:不要通过资产管道产生样式表清单文件,通过SASS做到这一点,它的@import
声明,其他的一切都会导致问题。