【问题标题】:Jquery CSS method: better writingJquery CSS方法:更好的写作
【发布时间】:2014-07-18 17:24:11
【问题描述】:

我正在编写一个插件,我需要用户自定义它的功能,而不是在外部 CSS 中。我有一个带有一些默认样式的对象,可以被用户覆盖。但是我需要根据其他功能设置widthmarginLeft。 因此,根据我的经验,我会通过在 css 方法中传递默认样式(由用户提供)来添加它,但如果不是通过添加 .css() 方法的新行,我将无法添加更多字符串。

有没有更好的方法来编写这段代码?

var style: {
    'position': 'fixed',
    'top': 0,
    'left': 0,
    'bottom': 0
};

$( 'div' ).css( style )
          .css({
              width: 300,
              marginLeft: -300,
          });

【问题讨论】:

标签: jquery css plugins jquery-plugins


【解决方案1】:

您可以使用传递给插件的设置扩展默认值

var styles = $.extend(
    {  // defaults
        position : 'fixed',
        top      : 0,
        left     : 0,
        bottom   : 0
    },
    settings, // settings object passed in
    {
        width      : 300, // always overwrites the above
        marginLeft : -300,
    }
)

$('div').css(styles);

您会注意到,如果存在相同的键,最后传递的对象将始终覆盖之前的对象。
这通常是插件使用用户传入的对象扩展默认设置的方式,编写起来并不容易,但在遇到相同键时对象覆盖彼此的值的方式更具可扩展性。

【讨论】:

    【解决方案2】:

    使用 .extend() 它将两个或多个对象的内容合并到第一个对象中。

    var theirStyles = {
       'position' : 'absolute',
       'top' : '0',
       'left' : '0',
       'bottom' : '0',
       'margin' : '0',
       'font-size' : '30px'
    };
    
    var myStyles = {
       'width' : '300px',
       'margin-left' : '-300px'
    };
    
    
    var combinedStyles = $.extend({},  myStyles, theirStyles);
    
    
    $('div').css(combinedStyles);
    

    希望有帮助!

    FIDDLE

    【讨论】:

    • 遇到同一个键时会覆盖其他值吗?
    • 是的。如果您查看 jsfiddle(使用 Chrome 开发人员工具)并检查“工作”一词,您会注意到 width: 300px 存在,但 margin-left:-300px 已替换为 margin:0
    • 如果您需要它,请在 $.extend 中切换两个变量。 var combinedStyles = $.extend({}, theirStyles, myStyles); 然后 myStyles 会覆盖 theirStyles。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2012-05-08
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多