2012-03-16 62 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