如何从一个元素移动所有计算的CSS样式并使用JavaScript将它们应用于不同的元素?

时间:2010-09-27 22:33:10

标签: jquery

我有一个外部样式表,它将某些样式应用于给定元素。我希望能够将这些样式(使用JavaScript)完全移动到不同的元素,而无需事先了解正在应用的样式。

CSS:

td { padding: 5px }
div { }

HTML:

<td>
    <div>
        Apply the TD styles to this DIV (instead of the TD).
    </div>
</td>

JavaScript:

$(document).ready(function(){
    $('tr').children('td').each(function(){
        //move the td styles to div
    });
});

我怎样才能做到这一点?

更新:要明确,我无法控制CSS。我无法知道可以应用哪些样式。我试图解决的问题是能够获取元素并复制其样式(可能是未知的)并将它们应用于不同的元素。

9 个答案:

答案 0 :(得分:8)

这是我想出的解决方案,它混合了document.defaultView.getComputedStyle和jQuery的.css():

<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" >            </script>
    <link href="style.css" type="text/css" rel="stylesheet" />
</head>
<body>
    <div id="test" style="background-color: #FF7300">
        <p>Hi</p>
    </div>
    <a href="#" id="button">Apply styles</a>
    <script>
        $("#button").click(function() {
            var element = document.getElementById("test");
             $("#victim").css(document.defaultView.getComputedStyle(element, null));
        });
    </script>
    <div id="victim">
        <p>Hi again</p>
    </div>
</body>

//style.css 
#test {
    border: 3px solid #000000;
}

这样做是复制计算出的样式对象,包括style.css和内联样式,并使用jQuery的.css()

将其设置为另一个div。

我希望我没有误解这个问题,而这正是你所需要的。

编辑:我忘了的是你要求'移动'风格而不是复制它。使用jQuery的.removeClass()并使用.attr()删除样式属性来删除前一个div中的样式非常简单,但是你必须记住,如果有任何样式规则应用于元素的ID,那么无法阻止它们被应用。

答案 1 :(得分:2)

编辑:这个答案是在问题澄清之前写的。

提供您的元素ID,如下所示:

<td id="td_element" style="padding:5px">
    <div id="div_element">
        Apply the TD styles to this DIV (instead of the TD).
    </div>
</td>

并使用

var td_element = $('#td_element')
$('#div_element').attr('style', td_element.attr('style'));
td_element.removeAttr('style');

当然你可以使用一个类 - 或者你可以使用以前的javascript代码中的元素。您需要自己决定引用元素的最佳方法。

答案 2 :(得分:2)

我知道这看起来很粗糙但是有效。最初从<td>复制所有计算出的样式并将其应用到<div>很容易this plugin from Mike Dunn。麻烦的一点是在复制后从<td>删除样式。 From what I can tell,您唯一能做的就是使用.css()手动将其重置为默认值。

<强> Working Example

$.fn.copyCSS = function (source) {
    var dom = $(source).get(0);
    var dest = {};
    var style, prop;
    if (window.getComputedStyle) {
        var camelize = function (a, b) {
                return b.toUpperCase();
        };
        if (style = window.getComputedStyle(dom, null)) {
            var camel, val;
            if (style.length) {
                for (var i = 0, l = style.length; i < l; i++) {
                    prop = style[i];
                    camel = prop.replace(/\-([a-z])/, camelize);
                    val = style.getPropertyValue(prop);
                    dest[camel] = val;
                }
            } else {
                for (prop in style) {
                    camel = prop.replace(/\-([a-z])/, camelize);
                    val = style.getPropertyValue(prop) || style[prop];
                    dest[camel] = val;
                }
            }
            return this.css(dest);
        }
    }
    if (style = dom.currentStyle) {
        for (prop in style) {
            dest[prop] = style[prop];
        }
        return this.css(dest);
    }
    if (style = dom.style) {
        for (prop in style) {
            if (typeof style[prop] != 'function') {
                dest[prop] = style[prop];
            }
        }
    }
    return this.css(dest);
};

$('td').click(function () {
    $('div').copyCSS('td');

    $('td').removeAttr('style');

    $("td").css({
        'font-family': 'none',
            'font-size': 'none',
            'font-weight': 'none',
            'font-style': 'none',
            'color': '#000',
            'text-transform': 'none',
            'text-decoration': 'none',
            'letter-spacing': 'none',
            'word-spacing': 'none',
            'line-height': 'none',
            'text-align': 'none',
            'vertical-align': 'none',
            'direction': 'none',
            'background-color': 'transparent',
            'background-image': 'none',
            'background-repeat': 'none',
            'background-position': 'none',
            'background-attachment': 'none',
            'opacity': '1',
            'width': 'none',
            'height': 'none',
            'top': '',
            'right': '',
            'bottom': '',
            'left': '',
            'margin-top': '0',
            'margin-right': '0',
            'margin-bottom': '0',
            'margin-left': '0',
            'padding-top': '0',
            'padding-right': '0',
            'padding-bottom': '0',
            'padding-left': '0',
            'border-top-width': '0',
            'border-right-width': '0',
            'border-bottom-width': '0',
            'border-left-width': '0',
            'border-top-color': '0',
            'border-right-color': '0',
            'border-bottom-color': '0',
            'border-left-color': '0',
            'border-top-style': '0',
            'border-right-style': '0',
            'border-bottom-style': '0',
            'border-left-style': '0',
            'position': 'static',
            'display': '',
            'visibility': 'visible',
            'z-index': 'auto',
            'overflow-x': 'auto',
            'overflow-y': 'auto',
            'white-space': 'normal',
            'clip': 'auto',
            'float': 'none',
            'clear': 'none',
            'cursor': 'default',
            'list-style-image': 'none',
            'list-style-position': '0',
            'list-style-type': 'disc',
            'marker-offset': '',
            'padding': '0',
            'transition': 'none',
            'border-radius': 'none'
    });
});

注意:显然我没有为所有可能的样式添加重置。

答案 3 :(得分:1)

编辑:代码更正

$('div').attr('style', $('td').attr('style'));

如果您想要移动,请稍后添加此行

$('td').attr('style', '');

我意识到这看起来很做人,但我没有其他选择器可以在这里工作。通常,您希望使用id或类而不是实际属性来执行此操作。

答案 4 :(得分:1)

不要移动样式是我的简答 - 找另一种方式。加载样式表后可以加载另一个样式表吗?如果是这样,添加一个样式表,覆盖您必须引用的样式表中定义的td和div填充。

答案 5 :(得分:0)

将实际的TD风格应用于课程怎么样?然后只需修改TD和DIV的类。或者您无法访问样式表?

CSS:

.class_name { padding: 5px }

HTML:

<td class="class_name">
    <div>
        Apply the TD styles to this DIV (instead of the TD).
    </div>
</td>

JavaScript:

$(document).ready(function(){
    $('.class_name').removeClass('class_name').children('div').addClass('class_name');
});

答案 6 :(得分:0)

您可以尝试以下步骤来复制样式表和<style>标记中特定元素定义的样式(代码有点冗长):

  1. 使用ajax获取原始样式表的内容。以及每个<style>代码的内容
  2. 将css内容解析为数组
  3. 对于已解析样式表中的每个选择器,将其dom元素与目标dom元素(从中复制样式)进行比较。如果其中任何一个匹配,则将与数学选择器对应的样式应用于所需元素
  4. 以下是代码:

    <html>
        <head>
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
            <style>
            #source { width: 100px; height: 100px; background-color: black; }
            </style>
            <link rel="stylesheet" href="style.css">
        </head>
        <body>
           <table>
                <tr>
                    <td id="source"></td>
                </tr>
           </table>
           <div id="target"></div>
        </body>
    
        <script>
        var source = $('#source'); // source
        var target = $( '#target' ); // target
    
        $( 'link[rel="stylesheet"]' ).each( function() {
              $.get( $(this).attr( 'href' ), {}, function( data ) {
                     var css_obj = parse_css( data );
                     copy_css( css_obj, source, target );
              });
        });
    
        $( 'style' ).each( function() {
            var css = $(this).text();
            var css_obj = parse_css( css );
            copy_css( css_obj, source, target );
        })
    
        function copy_css( css_obj, source, target ) {
            for( selector in css_obj ) {
                if( $(selector)[0] === source[0] ) { // compare raw dom elements 
                    for( prop in css_obj[selector] ) {
                        target.css( prop, css_obj[selector][prop] );
                    }
                }                             
            }
        }
    
    
        function parse_css( css ) { 
            var css = css.replace( /[\s\n\t]+/g, ' ' ); // remove extra spaces, tabs and newlines
            css = css.replace( /\/\*(.|\n)+\*\//g, '' ); // remove comments
            css = css.split( '}' );  // split into groups
            var css_obj = []; // array to hold parsed css
    
            for( i in css ) {
                if( css[i] == false ) continue;
                var chunks = css[i].split( '{' );
                var selector = $.trim( chunks[0] );
                var style_defs = [];
                chunks = chunks[1].split( ';' );
                for( j in chunks ) {
                    if( chunks[j] == false ) continue;
                    var style_def = chunks[j].split( ':' );
                    var property = $.trim( style_def[0] );
                    var value = $.trim( style_def[1].replace( /\;$/, '' ) );
                    style_defs[property] = value;
                }
                css_obj[selector] = style_defs;
            }
            return css_obj;
        }
    
        </script>
    

答案 7 :(得分:0)

我是这样做的:

var elFrom = document.getElementById('fromID');
var computedStyle = document.defaultView.getComputedStyle(elFrom,null);
$.each(computedStyle,function(key,value) {
    $('#toID').css(value,$(elFrom).css(value));
});

答案 8 :(得分:-1)

从提供的答案中得到更广泛的解决方案..

<强> HTML

<td style="padding:5px">
    <div class="inherit">
        Apply the TD styles to this DIV (instead of the TD).
    </div>
</td>

<强> JS

$('.inherit')
     .attr('style', $(this)
                    .parents('td')
                    .attr('style')
          )
     .parents('td')
     .removeAttr('style');