こんばんは。
+20cssファイルのインポートを含むhtmlページがあります。これらを1つのcssファイルに連結し、htmlページに関連するcssルールのみを抽出するにはどうすればよいですか?
こんばんは。
+20cssファイルのインポートを含むhtmlページがあります。これらを1つのcssファイルに連結し、htmlページに関連するcssルールのみを抽出するにはどうすればよいですか?
この質問はOPの問題を解決しません。ただし、検索エンジンから到着するゲストのための参照としてここに残されています。
あなたのアプローチには少し欠陥があります。
Chris Coyer @ CSS-Tricks:One TwoorThreeによるすばらしい記事にリダイレクトさせてください。
これが短いバージョンです。このアプローチによると、各ページには最大3つのCSSファイルが必要です。
その理由は、変更されないファイルがキャッシュされるためです。つまり、ユーザーはCSSファイルを1回だけダウンロードし(変更されないと仮定)、今後のアクセス時にファイルがユーザーのマシンから読み込まれるため、貴重な時間と帯域幅を節約できます。
ユーザーが表示しているページに基づいて生成された1つのファイルを提供すると、そのキャッシュ機能が失われます。そのため、ファイルサイズは小さくなりますが、ファイルを何度もダウンロードする必要があります。
tl; dr
静的なままであるグローバルCSSファイルを作成し、それを縮小して提供します。次に、サイト/アプリのさまざまなセクションで提供される、より具体的なCSSファイルの束を作成します。その3番目のページ固有のファイルが必要な場合はあまり起こりません。
簡単な解決策は考えられません。ただし、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(''));
});
空のCSSファイルを作成します。すべてのCSSをそのファイルにコピーします。新しいCSSファイルを縮小します。新しいCSSファイルをインポートし、他のすべてのCSSファイルへの参照を削除します。「htmlページに関連するcssルールのみを抽出する」ためにブラウザに任せてください。