你如何混合jQuery和IE CSS黑客?

时间:2011-06-25 16:01:44

标签: javascript jquery css

假设我想将div的display属性设置为inline-block。在CSS中我会做类似以下的事情:

#divid {
    display:inline-block;

    /* And now for IE6 and IE7 */
    zoom:1;
    *display:inline;
}

但现在假设我希望能够使用纯JavaScript或jQuery动态地将div的display属性更改为inline-block。还假设我不知道相关页面的HTML和CSS;我刚刚通过了div,我需要改变它的属性。如果我不担心IE6和IE7,那很简单:

$("#divid").css("display", "inline-block");

但是尝试处理IE6和IE7并不简单。以下不起作用:

$("#divid").css("*display", "inline");

有没有人有任何想法?

3 个答案:

答案 0 :(得分:6)

编辑:正如@thirtydot指出的那样,这来自.animate方法,在执行.css时不会应用。

我能想到的最好的选择是自己使用类似的东西。您可以检测内联块元素是否需要layout hack,并根据具体情况设置属性。

if ( !jQuery.support.inlineBlockNeedsLayout ) {
    $("#divid").css("display", "inline-block");
} else {
    $("#divid").css("display", "inline");
    $("#divid").css("zoom", "1");
}

- 旧答案 -

如果您只是$("#divid").css("display", "inline-block");

,jQuery应自动执行此操作

来自jQuery source

if ( jQuery.css( this, "display" ) === "inline" &&
        jQuery.css( this, "float" ) === "none" ) {
    if ( !jQuery.support.inlineBlockNeedsLayout ) {
        this.style.display = "inline-block";

    } else {
        display = defaultDisplay( this.nodeName );

        // inline-level elements accept inline-block;
        // block-level elements need to be inline with layout
        if ( display === "inline" ) {
            this.style.display = "inline-block";

        } else {
            this.style.display = "inline";
            this.style.zoom = 1;
        }
    }
}

答案 1 :(得分:0)

只需使用jQuery来应用CSS类,并使用条件注释在IE 6和7中为该类指定不同的规则。这将大大简化您的Javascript。

答案 2 :(得分:0)

这可能有些问题,但它似乎对我有用。如有必要,请编辑。在您的javascript中的某处添加此代码将挂钩到jQuery.css并使IE7正确显示内联块。

(function($) {
    // first, check to see if cssHooks are supported
    if ( !$.cssHooks ) {
        return;
    }

    $.cssHooks["display"] = {
        get: function( elem, computed, extra ) {
            if($.support.inlineBlockNeedsLayout && elem.style.display == 'inline' && elem.style.zoom == '1') {
                return 'inline-block';
            }
            return elem.style.display;
        },
        set: function( elem, value ) {
            try {
                if($.support.inlineBlockNeedsLayout && value == 'inline-block') {
                    elem.style.zoom = '1';
                    elem.style.display = 'inline';
                    return;
                }
                elem.style.display = value;
            } catch(e){}
        }
    };
})(jQuery);

用法:

$('selector').css('display', 'inline-block');