【发布时间】:2015-08-11 17:58:13
【问题描述】:
当包含在包含任何已声明样式(不包括由style="" 设置的样式)的 HTML 文档中时,此脚本将向页面输出优化的样式表。该脚本使用以下方法...
- 忽略任何
@或:规则以保持响应式样式不变。 - 将规则分成单个选择器规则,以便我们稍后测试继承。
- 删除适用于文档中不存在的选择器的规则,感谢 @RickHitchcock 的贡献。
- 以相同的格式(不包括百分比)检索声明的样式和计算的样式,然后相互比较两个值,然后删除属性并再次检查。
- 如果声明的值与计算的值匹配并且通过删除属性值发生变化,则设置保持标志。这告诉我们该属性是否对元素有影响,如果没有元素受到该属性的影响...删除它。
- 如果剩余的
CSSRule中没有属性,则删除该规则。 - 作为副作用,大多数不更改浏览器默认设置的选择器将被删除(除非使用
font而不是font-*和类似的,这将激活该属性的其余设置)。李>
在包含与动态元素相关的样式的网站上运行此脚本时,我只是将它们包装在媒体查询中
@media (min-width: 0px) {
/* This says that these styles always apply */
}
问题
如何将具有共同属性的选择器分组?
(Demo)
var stylesheets = document.styleSheets, stylesheet, i;
var ruleText = "";
if(stylesheets && stylesheets.length) {
for (i = 0; (stylesheet = stylesheets[i]); i++) {
var rules = stylesheet.rules, rule, j;
if(rules && rules.length) {
for (j = 0; (rule = rules[j]); j++) {
if(rule.type === rule.STYLE_RULE) {
if(rule.selectorText.indexOf(',') >= 0) {
var newRules = [];
var selectors = rule.selectorText.split(','), selector, k;
for(k = 0; (selector = selectors[k]); k++) {
var styles = rule.style, style, l;
var elements = document.querySelectorAll(selector.trim()), element, l;
if(elements.length) {
var styleString = '';
for(m = 0; (style = styles[m]); m++) {
styleString += style + ': ' + styles.getPropertyValue(style) + "; ";
}
newRules.push((selector.trim() + ' { ' + styleString.trim() + ' }'));
}
}
stylesheet.deleteRule(j);
for(k = 0; (rule = newRules[k]); k++) {
stylesheet.insertRule(rule, j);
}
}
}
}
for (j = 0; (rule = rules[j]); j++) {
if(rule.type === rule.STYLE_RULE && rule.selectorText.indexOf(':') < 0) {
var styles = rule.style, style, k;
var elements = document.querySelectorAll(rule.selectorText);
if(elements && elements.length) {
for(k = 0; (style = styles[k]); k++) {
var value = styles.getPropertyValue(style);
if(value.indexOf('%') < 0) {
var elements = document.querySelectorAll(rule.selectorText), element, m;
var keep = false;
for(m = 0; (element = elements[m]); m++) {
var computed = window.getComputedStyle(element).getPropertyValue(style);
var match1 = value === computed;
styles.removeProperty(style);
var computed = window.getComputedStyle(element).getPropertyValue(style);
var match2 = value === computed;
styles.setProperty(style, value);
if( match1 && !match2 ) {
keep = true;
}
}
if(!keep) {
styles.removeProperty(style);
}
}
}
ruleText += rule.cssText + "\n";
}
} else {
ruleText += rule.cssText + "\n";
}
}
}
}
}
document.body.innerHTML = '<pre>' + ruleText + '<pre>';
未来的观众:这可以在 github 上以 optiCSS 的形式获得(阅读:令人赏心悦目)
【问题讨论】:
标签: javascript jquery html css optimization