2012-03-16 58 views
1

我想创建一个循环,以便可以遍历元素中定义的所有CSS属性。我的目标是创建一个合并两个元素样式的函数。转到HTMLElement中的每个CSS值,合并CSS样式

<span id="a1" style="font-family:verdana;">Hello</span> 
<span id="a2" style="font-size:15;">World</span>​ 

而且JS函数看起来是这样的:

function mergeStyle (obj,target){ 
    $.each(test.style.CSSStyleDeclaration,function(){ // This will not work? 
     // Add to target 
    }) 
    return; 
}; 

+0

你想重复的特性呢?两者中的任何一个都有优先权吗? – Th0rndike 2012-03-16 15:04:31

+0

为什么?浏览器在内部将会再次分离属性。由于在CSS中没有用于对属性进行分组的统一规则,因此您必须每次都根据具体情况进行合并。 – Blazemonger 2012-03-16 15:07:14

+0

只需要内联样式吗? – ShankarSangoli 2012-03-16 15:07:57

回答

3

我建议使用类,而不是,因为你需要不健全是一个很好的设计。如果你仍然想它虽然,这应该工作:

$.fn.mergeCSS = function(other) { 
    var $this = $(this), 
     $other = $(other), 
     style = $other.get(0).style; 

    $.each(style, function(i, name) { 
    $this.css(name, style[name]); 
    }); 

    return this; 
}; 

元素的.style属性包含它的风格; CSSStyleDeclaration.style的构造函数,它不是元素特定的。

用法:

$("<p style='color:green'>").mergeCSS("<p style='background-color:red'>"); 
// <p style='color: green; background-color: red; '> 

它改变,并返回第一个元素。

+0

哦,这是一个甜美的!谢谢! – 2012-03-16 15:13:56

1

我想出了这个解决方案,为我的作品:

function mergeStyle (obj,target){ 
    for(var i = 0; i<obj.style.length; i++){ 
     var stylename = obj.style[i]; 
     if(target.style[stylename]=="")   
      target.style[obj.style[i]] = obj.style[stylename]; 
     }; 
    }; 
}; 

3

在最简单的形式,如果你想只适用从样式到B那么你可以试试这个。

工作演示 - http://jsfiddle.net/rDdMu/1/

+0

这是一个简单的。 – 2012-03-16 15:25:09

+1

一个警告是,一些浏览器需要一个字面';'在两个cssText字符串之间:target.style.cssText + =';'+ obj.style.cssText;更好的浏览器在cssText字符串的末尾插入分号,但重复不会伤害它们。 – kennebec 2012-03-16 16:02:32