我想知道是否有人知道一个工具会积极地重写CSS以更有效地压缩样式。例如我想:
.foo { color : red; font-size: 16px; height: 20px; }
.bar { color : red; font-size: 16px; height: 30px; }
被压缩为:
.foo, .bar { color : red; font-size : 16px; }
.foo { height : 20px; }
.bar { height : 30px; }
要清楚的是,我所知道的所有缩小器,如YUI Compressor,只删除空格并可能加入一些属性(如font-family
和font-size
到font
)。我正在寻找一些愿意完全重写文件结构的东西。
如果没有这个,如果有人知道任何人对此背后的压缩逻辑所做的任何工作,那么该信息将不胜感激。如果我找不到,我正在考虑写自己的,但有一百万件要考虑,比如margin-top
覆盖了margin
的一部分,选择器特异性&包括订单等等...那么如何有效地压缩信息的工作,重复选择器或属性会更有效吗?
答案 0 :(得分:8)
我不知道任何积极的CSS缩小工具,但您可以使用以下方法:
margin:1px 0 0 0;
至margin-top:1px; margin-left:0px;
...)。div
,p > span
,#myid
)和B(唯一属性,例如display:block;
}的组合组成。 ,color:#deadbeef;
)。c
中的元素使用适当的权重函数b
。这可以是给定元素b
或accumulated lenght of properties - accumulated length of selectors
的邻居数。你的选择。您可能会注意到,通过使用此方法,您将获得二分图。现在尝试以下贪婪算法(伪代码):
margin-top:0px;margin-left:1px
)。请注意,实际压缩取决于您的体重功能。因为它是一个贪婪的算法,它可能会返回一个缩小的CSS,但我相信有人会发布一个反例。另请注意,在删除 Z 中的元素后,您必须更新权重函数。
如果我没有弄错的话,算法将始终终止并将在O(|B|^2*|A|
)中运行。如果您使用堆并对每个邻接列表中的属性进行排序(设置时间O(|B|*|A|log(|A|)
)),您将获得O(|B|*|A|* (log(|B|)+log(|A|))
)。
答案 1 :(得分:4)
CSS Tidy就像一个冠军!
答案 2 :(得分:2)
你见过YUI Compressor吗?
答案 3 :(得分:0)
答案 4 :(得分:0)
名为CSS Tools的项目声称要这样做。