傳統方式遍歷 DOM 元素逐個修改 style 屬性效率低。直接向 CSSStyleSheet 插入規則,瀏覽器自動匹配應用,性能更優、代碼更簡潔。
var sheets = document.styleSheets; // StyleSheetList var sheet = sheets[0]; // 取第一個 // 檢查 media 類型,避免誤改 print 樣式表 console.log(sheet.media.mediaText); // "all", "screen", "print" 等
var sheet = (function() {
var style = document.createElement('style');
// 可設置 media: style.setAttribute('media', 'screen');
// WebKit 補丁:必須先 appendChild 文本節點
style.appendChild(document.createTextNode(''));
document.head.appendChild(style);
return style.sheet; // 返回 CSSStyleSheet
})();
sheet.insertRule('header { float: left; opacity: 0.8; }', 0);
// 參數:完整 CSS 規則字符串、插入索引
sheet.addRule('#myList li', 'float: left; background: red !important;', 1);
// 參數:選擇器、樣式聲明、索引 (默認 -1 追加)
function addCSSRule(sheet, selector, rules, index) {
if (sheet.insertRule) {
sheet.insertRule(selector + '{' + rules + '}', index);
} else {
sheet.addRule(selector, rules, index);
}
}
// 使用
addCSSRule(document.styleSheets[0], 'header', 'float: left; color: #333;');
sheet.insertRule('@media only screen and (max-width: 1140px) { header { display: none; } }');
var mqStyle = document.createElement('style');
mqStyle.setAttribute('media', 'only screen and (max-width: 1024px)');
mqStyle.appendChild(document.createTextNode(''));
document.head.appendChild(mqStyle);
mqStyle.sheet.insertRule('header { display: none; }', 0);
href 為不同源) 無法讀取 cssRules (安全限制)insertRule 或創建獨立 <style>!important 可覆蓋索引順序掌握 CSSStyleSheet.insertRule/addRule 及動態創建 <style> 技術,能實現高性能、可維護的動態樣式管理。現代項目推薦優先使用 insertRule,配合封裝函數兼容舊 IE。媒體查詢場景可選擇完整規則插入或獨立媒體樣式表兩種模式。