【问题标题】:How to copy all user provided styles from one object to another如何将所有用户提供的样式从一个对象复制到另一个对象
【发布时间】:2017-01-03 09:08:17
【问题描述】:

有人问here 关于如何将 css 样式从一个对象复制到另一个对象的问题。普遍接受的答案是:

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;

但是,我的情况有点不同。我有一个脚本,它创建一个span 来假定select 标记,然后隐藏select。这允许更简单的 CSS 样式,因为我可以更轻松地设置 span 的样式,相对于坚定的 select 标签。

当我使用cssText 复制从选择应用到跨度的任何样式时,它最终看起来像一个选择标记。由于所有内置样式也都应用于跨度,而不仅仅是用户输入,因此我必须将所有这些 css 属性覆盖几十个,这违背了首先拥有跨度标签的目的。

有没有办法只复制用户提供的样式而不是用于设置元素样式的整个样式表?

到目前为止,我已经能够通过将 classid 从 select 转移到 span 来转移应用的样式,但我面临的挑战是将样式直接应用于 select 标签(即在 style/样式表,内容为:select { blah : bloh;})

【问题讨论】:

  • 如何应用用户定义的样式?使用类?如果是,则应用相同的类
  • 您需要旧浏览器支持吗?
  • 你只想要 style 属性中的样式吗?
  • 如果可能,需要广泛的浏览器支持

标签: javascript html css


【解决方案1】:

试试这样的:

function ApplyStyles(select, span) {
    var select = document.querySelector(select);
    var span = document.querySelector(span);
    var sheets = document.styleSheets;

    for(var i = 0; i < sheets.length; i++) {
        var rules = sheets[i].cssRules || sheets[i].rules;   
        for(var r = 0; r < rules.length; r++) {
            var rule = rules[r];
            var selectorText = rule.selectorText;
            if(document.querySelector(selectorText) == select){
        for(var l = 0; l < rule.style.length; l++){
            span.style[rule.style[l]] = rule.style[rule.style[l]];
        }
            }
        }
    }
}

然后像这样使用函数:

ApplyStyles("#selection", "#span");

这是一个 JSFiddle 例如:https://jsfiddle.net/rsLnaw56/2/

它的工作原理是查找应用于select 元素的所有外部样式并将其应用于span 元素。

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2022-12-04
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多