日期:2014-05-17 浏览次数:20642 次
一直忙没更新,总结下近期开发中使用的关于提取css渲染树样式的方法
?
提取渲染样式
IE从domElement.currentStyle对象中提取即时计算的样式
标准浏览器使用window.getComputedStyle方法获取
IE下还有个runtimeStyle对象,可以应用样式又不改变DOM的style属性,
理解为runtimeStyle用于运行时写入样式,currentStyle用于为读取渲染后的样式
* jQuery的css()方法已经处理了二者的兼容,可以通过css()方法提取渲染后的样式值,但在实际应用还会遇到一些问题,下面说一说解决这些问题的方法
?
?
伪类样式获得方法
标准浏览器通过getComputedStyle方法可以获得伪类style对象,如下方法
window.getComputedStyle(domElement,':after);
jQuery css()方法中后边参数都是null,所以无法去取伪类的样式.
ie不支持此方发,只能通过,遍历样式表对象,匹配选择器进行查找,这种方式需要css写的比较标准及约定好选择器特征才能准确有效的找到所需样式
?
... var more=$('span.morelink'); if(window.getComputedStyle){ style=window.getComputedStyle(more[0],':after'); }else{ style=getStyleSheet('span.morelink a:after'); } //ie中从styleSheets中获取 function getStyleSheet(selector){ var sheets=document.styleSheets,regxp=new RegExp(".*"+selector+"\\s*$","i"); for(var is=sheets.length-1;is>=0;is--){//反向,由css下部向上查找 var rules=sheets[is].rules||sheets[is].cssRules; for(var ir=rules.length-1;ir>=0;ir--){ var rule=rules[ir]; if(rule.selectorText&®xp.test(rule.selectorText)){ return rule.style; } } } }
?
?
?
获取颜色十六进制标准值
?在ie中通过获得渲染样式 color 或 backgroundColor 得到的值一般是#FFFFFF这种16进制的形式
而在ff等标准浏览器得到的是rgb(255, 0, 0)这种形式,可以用以下方法都转换成16进制形式.
在chrome浏览器中透明(transparent)会得到rgba(0, 0, 0, 0),在方法中也处理了.
?
function rgb2hex(rgb) { if('rgba(0, 0, 0, 0)'==rgb)rgb='transparent'; var m= rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i); if(!m)return rgb; function hex(x) { return ("0" + parseInt(x).toString(16)).slice(-2); } return "#" + hex(m[1]) + hex(m[2]) + hex(m[3]); }
?
?
?
获取background-position值
在ie中渲染样式中不能获得background-position,对应的样式被拆成background-position-x和background-position-y
通过以下方法可获得
?
//以下使用jquery css()方法获得渲染样式 function getBackgroundPosition(t){ var v=t.css('background-position'); if(!v){ v=t.css('background-position-x')+' '+t.css('background-position-y'); } return v; }
?
当background-position中使用百分比时,在ie中不能获得渲染样式的百分比值,只能获得即时计算的px值
如样式设置 background-position:20% 10px ,ie中只能获得对应的px值.(宽度、高度、top、left等值也是如此)
如需获得百分比值,可以在样式表对象中遍历获得.(同上使用getStyleSheet方法)
?
?
2012-5-11更新
?
从当前页面所有样式中(包括import引用的css)查找指定文件中与参数匹配的选择器的样式
selectorRegExp--筛选选择器的正则表达式
cssFileName--css文件名(可选参数)
项目中使用直接粘过来
Ex.fn.getStyle4Sheet=function(selectorRegExp,cssFileName){ var sheets=document.styleSheets,regexp=selectorRegExp; var styles=[]; var fNameRegex=new RegExp('(.*/)?'+cssFileName+'(\\?.*)?'); for(var is=sheets.length-1;is>=0;is--){ var sheet=sheets[is],imports=sheet.imports||getImports(sheet.cssRules); var rules=sheet.rules||sheet.cssRules; if(!cssFileName||fNameRegex.test(sheet.href)){ var t=getStyle4Rules(rules,regexp); } try{ findInImports(imports,cssFileName,regexp); }catch(e){} } var style=styles.length?{}:null; for(var i=styles.length-1;i>=0;i--){ for(var k in styles[i]){ var v=styles[i][k]; if(v!=''||i==styles.length-1)style[k]=v; } } return style; function getImports(rs){ var result=[]; if(!rs)return result; for(var i=0,n=rs.length;i<n;i++){ if(rs[i].type==3)result.push(rs[i]); } return result; } function findInImports(imports,cssFileName,regexp){ for(var i=0,n=imports.length;i<n;i++){ var imp=imports[i]; if(!cssFileName||fNameRegex.test(imp.href)){ var rules=imp.rules||imp.styleSheet.cssRules; var t=getStyle4Rules(rules,regexp); }