堆叠 jQuery CSS 声明在 IE8 中不起作用

Stacking jQuery CSS declaration doesn't work in IE8

此 fiddle 提供了我正在努力实现的精简示例。缺少很多,但所有相关代码都在那里。

看看this fiddle。目标是粉红色框填满宽度可用的 space(margin-left 在 CSS 中定义的间隙)并且它具有与黄色部分相同的高度。不幸的是,只有第一个 属性 (min-height) 被应用。

$(".banana + .strawberry").css({
    "minHeight": function () {
        var $this = $(this),
            banana = $this.prev(".banana"),
            bh = banana.outerHeight();
        return bh;
    },
    "width": function () {
        // Many variables, but they allow a highly
        // customized CSS file
        var $this = $(this),
            margin_l = parseInt($this.css("marginLeft"), 10),
            margin_r = parseInt($this.css("marginRight"), 10),
            padding_l = parseInt($this.css("paddingLeft"), 10),
            padding_r = parseInt($this.css("paddingRight"), 10),
            border_l = parseInt($this.css("borderLeftWidth"), 10),
            border_r = parseInt($this.css("borderRightWidth"), 10),
            parent = $(this).parent(),
            pw = parent.width(),
            banana = $this.prev(".banana"),
            bw = banana.outerWidth();

        console.log(margin_l);
        return (pw - bw - margin_l - margin_r - padding_l - padding_r - border_l - border_r);
    }
});

出于某种原因,所有浏览器都接受此代码,但 IE8 不接受。在我的网站上,我使用的是 jQuery 1.11.2。我在仿真模式下测试了 IE8。我还尝试提醒 function 中的一些文本应该 return 正确的宽度值,但即使这样也不起作用。你不能用 IE8 在 jQuery 中堆叠 CSS 属性,这些属性都依赖于 return 一个值的函数吗?

IE8 和更低 return "auto"(默认值)在 $this.css("marginRight") 和 "medium" 上 $this.css("borderRightWidth")$this.css("borderLeftWidth") 所以 parseInt("auto")parseInt("medium") 将 return NaN
您可以像这样 CSS 将这些属性的默认值设置为 0

.strawberry {
    background: #FC5A8D;
    margin-left: 10px;
    padding: 8px;
    margin:0;
    border:0;
}     

或者您可以在每个 parseInt() 之后添加 || 0 这样每个 var 默认为 0 而不是像这样的 NaN

$(".banana + .strawberry").css({
    "minHeight": function () {
        var $this = $(this),
            banana = $this.prev(".banana"),
            bh = banana.outerHeight();
        return bh;
    },
    "width": function () {
        var $this = $(this),
            margin_l = parseInt($this.css("marginLeft"), 10)||0,
            margin_r = parseInt($this.css("marginRight"), 10)||0,
            padding_l = parseInt($this.css("paddingLeft"), 10)||0,
            padding_r = parseInt($this.css("paddingRight"), 10)||0,
            border_l = parseInt($this.css("borderLeftWidth"), 10)||0,
            border_r = parseInt($this.css("borderRightWidth"), 10)||0,
            parent = $(this).parent(),
            pw = parent.width(),
            banana = $this.prev(".banana"),
            tw = banana.outerWidth();        
            return (pw - tw - margin_l - margin_r - padding_l - padding_r - border_l - border_r);
    }
});