晚上好。
我有一个带有 +20 css 文件导入的 html 页面。如何将这些连接到一个 css 文件中并仅提取与 html 页面相关的 css 规则?
晚上好。
我有一个带有 +20 css 文件导入的 html 页面。如何将这些连接到一个 css 文件中并仅提取与 html 页面相关的 css 规则?
这个问题不能解决OP的问题。但是,它留在这里作为来自搜索引擎的客人的参考。
您的方法略有缺陷。
请允许我将您重定向到 Chris Coyer @ CSS-Tricks 的一篇精彩文章:一二或三。
这是简短的版本,根据这种方法,每个页面最多应该有 3 个 CSS 文件:
原因是,不会更改的文件会被缓存。这意味着,用户只会下载一次 CSS 文件(假设它没有更改),并且在以后的访问中,文件将从用户的机器上加载,从而节省了宝贵的时间和带宽。
如果您提供一个文件,该文件是根据用户正在查看的页面生成的,那么您将失去缓存能力。因此,虽然文件大小会更小,但您需要一遍又一遍地下载文件。
tl;博士
制作一个保持静态的全局 CSS 文件,将其缩小并提供服务。然后制作一堆更具体的 CSS 文件,在您的网站/应用程序的不同部分提供。在您需要第三页特定文件的地方不会发生太多。
创建一个空白的 CSS 文件。将所有 CSS 复制到该文件中。缩小新的 CSS 文件。导入新的 CSS 文件并删除对所有其他 CSS 文件的引用。留给浏览器“只提取与html页面相关的css规则”。
我想不出一个简单的解决方案。但是如果你使用 jQuery,你可以试试下面的代码。它在 CSS 中搜索 DOM 中的每个元素并将其输出。只需将其粘贴到<script type="text/javascript"></script>
您部分的标签中<head>
,并确保包含 jQuery。
仅使用 Chrome 和一个简单的测试站点进行了测试,但它也应该适用于更复杂的样式表和 DOM 结构。
$(function(){
var styles = new Array;
$('body, body *').each(function(index, element){
//Get all stylesheets
var sheets = document.styleSheets;
for(var i in sheets) {
//For every stylesheet...
var rules = sheets[i].rules || sheets[i].cssRules;
for(var r in rules) {
//Check or every rule if it matches the element & check if already appended
if($(element).is(rules[r].selectorText) &&
$.inArray(rules[r].cssText,styles) == -1){
//Append CSS to array
styles.push(rules[r].cssText);
}
}
}
});
//Output
$('body').text(styles.join(''));
});