【问题标题】:Move only some CSS styles from one element to another仅将一些 CSS 样式从一个元素移动到另一个元素
【发布时间】:2013-03-15 13:13:37
【问题描述】:

我创建了一个 jQuery 插件,它采用 HTML 表格,使其可排序,并修复页眉和页脚。示例见http://jsfiddle.net/aXDzz/(点击create创建表)。

效果很好,但最近需要在表格周围添加一些填充或边距。这导致了一些问题。

我的插件基本上用<div>替换了原来的<table>,其中包含一个<table>作为标题,一个<div>实习生包含一个<table>作为正文,一个<table>作为页脚.我的意图是让用户将 CSS 应用于原始表格,并且在使用我的插件时,CSS 会适当地转移。然而,如上所述,我将<div> 包裹在表格周围,以便现在应将边距或填充应用于<div> 而不是<table>

所以,看起来我需要将任何适用于 <table> 外部的 CSS 移动到 <div> (例如边距),然后留下任何适用于 <table> 内部的 CSS,例如单独的行颜色。

我该怎么做?还是有更好的方法我应该实施这个?谢谢

PS。请随时批评我的插件,因为这是我的第一次尝试。

【问题讨论】:

  • 所有这些表格都是用于表格数据,还是仅用于布局?
  • @Blazemonger:这个问题没有说明“使用表格进行布局”,并且提供的 JSFiddle 示例没有使用表格进行布局。它使用表格作为表格 - 这并没有错。
  • @Blazemonger。表格数据。但我想定位桌子。
  • @JamesDonnelly 正确。但是我将如何定位桌子? (除了让用户知道定位最近创建的 DIV)
  • @user1032531 另见XY-problem

标签: javascript jquery html css jquery-plugins


【解决方案1】:

我尝试根据您的需要修改this 插件:

(function($){
    $.fn.copyStyle = function(jqCopyTo,styleStartsWith,overideStyle){
        var dom = this.get(0);
        var style;
        var returns = {};
        if(window.getComputedStyle){
            var camelize = function(a,b){
                return b.toUpperCase();
            };
            style = window.getComputedStyle(dom, null);
            for(var i = 0, l = style.length; i < l; i++){
                var prop = style[i];
                for(var m = 0; m < styleStartsWith.length; m++){
                    if(prop.lastIndexOf(styleStartsWith[m], 0) === 0)  {
                        var camel = prop.replace(/\-([a-z])/g, camelize);
                        var val = style.getPropertyValue(prop);
                        returns[camel] = val;
                        overideStyle==true ? $(this).css(prop,0):null;
                    }
                }
            };
        };
        if(style = dom.currentStyle){
            for(var prop in style){
                for(var m = 0; m < styleStartsWith.length; m++){
                    if(prop.lastIndexOf(styleStartsWith[m], 0) === 0) { 
                        returns[prop] = style[prop];
                        overideStyle==true ? $(this).css(prop,0):null;
                    }
                }
            };
        };
        //copy 
        $(jqCopyTo).css(returns);
        return this;
    }

})(jQuery);

在这样的结构上:

#inner {
  margin:20px;
  padding:20px;
  background-color:#F00;
}
#wrapper {
  background-color:#f80;
}

html:

<div id="wrapper">
    <div id="inner">
        Table Content
    </div>
</div>

你可以像这样使用这个插件:

$("#inner").copyStyle("#wrapper",["margin","padding"],true); 

结果是内部 div 的边距和填充被覆盖,并且样式被添加到 wrapper-div。您可以使用最后一个布尔指标来处理覆盖行为。

这是jsFiddle 上的完整示例。我不能保证它适用于所有浏览器(刚刚测试过 Firefox 和 ie9)

【讨论】:

  • 谢谢 Jan,不知道我是否会更好地在桌子周围放置一个 div,或者只是添加适用于自动生成的 div 的 css(这很神秘但有效)或使用你的解决方案,但您的解决方案肯定回答了我的具体问题,非常感谢!
【解决方案2】:

我检查了您的代码,并尝试将边距应用于您的表格:

.myTable {
    width:600px;
    matgin-left: 50px;
}

然后我看到了问题所在。但是后来我查看了代码,并且您指定了固定宽度

<div style="width: 618px; overflow-y: auto; max-height: 300px;"><table id="myTable" class="myTable">

这似乎导致了问题。

看看:

width: 618px;

如果我正确理解了这个问题,这算不上好。也许您可以尝试在插件中找到计算宽度的位置,然后将边距包含在计算宽度中。到目前为止我还没有找到。插件很长..

当我放 665px 时,它看起来有点好..

也许这就是解决方案。

【讨论】:

  • 我可以使用$(this).css('margin-left')移动边距,然后将其应用到外部&lt;div&gt;。但是,用户可能添加了边距而不是左边距,所以需要这样做。它在哪里结束......
  • 我明白了。我已将 margin-left 用于测试目的,只是为了看看它在哪里中断。我并不是建议将其作为解决方案,并将其添加到 CSS 中。我的意思是宽度计算得不好,这就是它断裂的原因。至少在我看来。您可以更新插件以计算宽度以包括边距、填充等。
  • 谢谢阿列克斯。但是,我认为我需要修改插件,或者将表格包装在 div 中并定位 div(但是,这两个并不理想,因为典型用户不知道这样做)。
猜你喜欢
  • 2015-03-07
  • 2011-05-28
  • 2012-09-27
  • 1970-01-01
  • 2010-11-19
  • 2013-07-20
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
相关资源
最近更新 更多