将所有样式从一个元素复制到另一个元素

jne*_*ney 52 javascript css jquery

如何从元素A到元素B获得每种样式(甚至是继承的)?在javascript或使用jquery.

让我们告诉我有一个元素<p class="foo">...</p>,我追加新元素<div />,除了内容外,它们看起来都是一样的.

sdl*_*rhc 49

如果您不关心IE,那么您可以这样做:

var p = document.getElementById("your_p_id");
var div = document.createElement("div");
div.innerHTML = "your div content";
div.style.cssText = document.defaultView.getComputedStyle(p, "").cssText;
Run Code Online (Sandbox Code Playgroud)
#your_p_id {
  color: #123124;
  background-color: #decbda;
}
Run Code Online (Sandbox Code Playgroud)
<textArea id="your_p_id">Hello world!</textArea>
Run Code Online (Sandbox Code Playgroud)

这适用于内联,嵌入和继承的样式.

编辑:并且通过"不关心IE",我当然意味着"除了Webkit之外什么都不关心".

更新:这适用于当前版本的Chrome(19),Safari(5),Firefox(12)和IE(9).它也适用于某些版本的旧版本,例如IE8.

  • 为什么不使用`window.getComputedStyle`而不是`document.defaultView`,它指向同一个东西?使用全局窗口变量更为常见. (3认同)
  • 根据 https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle:在许多在线代码示例中, getCompulatedStyle 是从 document.defaultView 对象中使用的。在几乎所有情况下,这是不必要的,因为 getCompulatedStyle 也存在于窗口对象上。defaultView 模式很可能是 (1) 人们不想为窗口编写规范和 (2) 制作一个在 Java 中也可用的 API 的某种组合。然而,有一种情况必须使用defaultView的方法:当使用Firefox 3.6访问框架样式时。 (2认同)

小智 5

实际上,sdleihssirhc的答案不适用于Firefox,因为getComputedStyle(p, "").cssText它将返回一个空字符串,这是一个由来已久的已知错误:https : //bugzilla.mozilla.org/show_bug.cgi?id=137687

还支持Firefox的解决方案是迭代getComputedStyle属性并手动创建CSS字符串:

const styles = window.getComputedStyle(node);
if (styles.cssText !== '') {
    clonedNode.style.cssText = styles.cssText;
} else {
    const cssText = Object.values(styles).reduce(
        (css, propertyName) =>
            `${css}${propertyName}:${styles.getPropertyValue(
                propertyName
            )};`
    );

    clonedNode.style.cssText = cssText
}
Run Code Online (Sandbox Code Playgroud)

  • `Object.values(styles)` 在 Firefox (78.0.2) 上返回 **353** 元素的数组,在 Chrome (84.0.4147.125) 上返回 **833** 元素,在 Safari 上返回 **923** 元素 ( 13.1.2)。`Array.from(styles)` 在 Firefox、Chrome 和 Safari 上分别返回 **353**、**317** 和 **491** 元素,因此我建议更改为 `Array.from`。 (2认同)

Jea*_*uis 1

尝试复制每个 CSS 属性,如下所示:

$("#target").css("border", $("#source").css("border"));
$("#target").css("background", $("#source").css("background"));
Run Code Online (Sandbox Code Playgroud)
#source {
  background-color: #dfeacb !important;
  color: #bbae4e !important;
  border: 1px solid green !important;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textArea id="source">Hello world!</textArea>
<textArea id="target">Hello world!</textArea>
Run Code Online (Sandbox Code Playgroud)

为什么不?您可以创建可能包含所有属性的字典。

  • 像这样执行一次可能没问题,但在循环中,这确实不聪明。因为您单独获取每个属性并将其设置为单独的。 (2认同)