- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
此脚本包含在包含任何已声明样式(不包括由 style=""
设置的样式)的 HTML 文档中时,会将优化的样式表输出到页面。该脚本使用以下方法...
@
或 :
规则以保留响应式样式。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>';
future 的观众:这在 github 上可用 optiCSS (读:赏心悦目)
最佳答案
这看起来不错,我只有一个小建议。
按如下方式更改您的代码:
for (j = 0; rule = rules[j]; j++) {
var styles = rule.style, style, k;
var elements = document.querySelectorAll(rule.selectorText);
if(elements.length) {
for(k = 0; style = styles[k]; k++) {
...
}
console.log(rule.cssText);
}
}
这将阻止没有任何匹配 HTML 的规则的输出。
在 this Fiddle ,li
规则是随你的代码一起输出的,但是经过上面的修改后它没有输出。
下一个挑战是简化那些font
、border
、padding
……样式。
html { margin-right: 0px; margin-left: 0px; height: 100%; }
body { margin-right: 0px; margin-left: 0px; height: 100%; margin-top: 0px; }
body { margin-bottom: 5px; background-color: rgb(255, 0, 0); }
@media (max-width: 500px) {
body { background: blue; }
}
这里是如何把它变成这样的:
html {margin-right:0px;margin-left:0px;height:100%;}
body {margin-right:0px;margin-left:0px;height:100%;margin-top:0px;margin-bottom:5px;background-color:rgb(255 0 0);}
@media (max-width: 500px) {
body { background: blue; }
}
在此过程中,您将获得两个对象:
html {"margin-right":"0px;","margin-left":"0px;","height":"100%;"}
body {"margin-right":"0px;","margin-left":"0px;","height":"100%;","margin-top":"0px;","margin-bottom":"5px;","background-color":"rgb(255, 0, 0);"}
首先,将媒体查询输出分开,因为您不希望它受到影响:
var ruleText = "", mediaText = "";
...
if (styles.length) {
ruleText += rule.cssText + "\n";
}
} else {
mediaText += rule.cssText + "\n";
}
然后把这个放在你的循环之后:
var inp= ruleText.split('\n'),
out= '',
selectors= {};
inp.forEach(function(val) {
if(val) {
var selector= val.split(/ *{/)[0],
styles= val.split(/{ */)[1].split('}')[0].split(/; */);
selectors[selector]= selectors[selector] || {};
styles.forEach(function(val) {
if(val) {
var st= val.split(/ *: */);
selectors[selector][st[0]]= st[1]+';';
}
});
}
});
for(var i in selectors) {
out+= i+' '+JSON.stringify(selectors[i]).replace(/[,"]/g,'')+'\n';
}
document.body.innerHTML= '<pre>'+out+mediaText+'</pre>';
为简单起见,上面的代码假定 CSS 中没有包含双引号、分号、逗号或花括号的字符串内容。这会使事情变得有些复杂。
关于javascript - 具有通用属性的 CSSRules 组选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519899/
我正在尝试使用 JavaScript 获取所有 CSS 规则。在某些页面上我成功了,在某些页面上我没有成功。 例如,在 StackOverflow 中,我使用的是: console.log( docu
我有这个非常简单的 HTML 页面,我正在尝试获取 #poulet 的 CSSRules,但是当我访问 documents.styleSheets[0].cssRules 时,我在 Chrome v5
借助此答案 (get all css classes background & color properties values),我可以获得所有 CSS 类背景和颜色属性值。它在我使用内部 CSS 代
当我尝试访问外部域上托管的某些 CSS 文件时,我在 Firebug 中收到此错误: Security error" code: "1000 rules = styleSheets[i].cssRul
有没有办法检查 CSS 选择器(通过 document.styleSheets[666].rules[1984].selectorText 获得)是否匹配特定元素? 我要求一个跨浏览器的纯 javas
我在我的 Wordpress 网站的自定义 javascript 中使用这个函数。 var addRule = (function (sheet) { if(!sheet) return;
此脚本包含在包含任何已声明样式(不包括由 style="" 设置的样式)的 HTML 文档中时,会将优化的样式表输出到页面。该脚本使用以下方法... 忽略任何 @ 或 : 规则以保留响应式样式。 将规
这实际上不需要太多内容,因为代码本身是不言自明的。但是,只需要逃避写这个上下文的条件。如何如何通过更改样式表的 cssRule 的 cssText 来更新样式元素的 innerHTML? HTML:
我尝试使用 $.cssRule() plugin并发现在 FireBug 中调试这些规则很不方便,因为每个规则似乎都附加到我页面上加载的每个 css 文件,因此定义了很多次。 Source code表
我想动态更改页面上某些文本的 CSS 样式(背景颜色)。为此,我正在尝试更改 CSSRule。由于所需样式存在大约 10 个 CSSRule,因此我正在使用 selectedText 访问所需的 CS
我想使用 Javascript 更改特定的类属性值,但通过类名本身而不是使用任何整数作为指针 (cssRules[i]) 或循环所有类以查找匹配的“selectorText”值. 这是为了更改页面内可
有什么区别: document.styleSheets[0].cssRules 和 document.styleSheets[0].rules 我注意到 IE8 和更早版本也支持第二个。但是这两个对象
我的 chrome 扩展程序需要修改用户页面上的某些 css 规则。通过 document.styleSheets 访问样式只能访问从同一域内链接的样式。 document.styleSheets 数
如何检查 document.styleSheets[i] 对象中是否存在属性 cssRules? 我发现我无法使用 if ( sheets[i].hasOwnProperty("cssRules")
CSSRule DOM interface包含对应于每种类型的 CSS 规则的常量。规则的类型可以用像这样的语句来测试 someRule.type == CSSRule.STYLE_RULE 我正在使
我有一个样式标签,其 css 属性添加了 insertRule功能。 我尝试了 Element.cloneNode(tree),但它不包含 cssRules // Add a style tag to
显然在 JavaScript 中,我们可以通过执行以下操作来查找整个文档的所有 CSS 规则: - document.styleSheets[0].rules || document.styleShe
当我检查网站时, 我从 document.styleSheets[x].cssRules 中看到了 cssRules 但是,对于这个网站 stackoverflow.com,当我使用 Chrome 浏
我需要更改现有的全局 CSS 规则,然后我访问 document.styleSheets,获取我的规则并修改它。 我通过访问 selectorText 属性修改选择器。 CSS代码 .cla
代码如下: http://jsfiddle.net/salman/2hyYg/ http://jsfiddle.net/salman/2hyYg/show/ 您会注意到 alert(document.
我是一名优秀的程序员,十分优秀!