6

I am using jquery .toggle() to show a div on a page that has display:none on page load. However, under the default settings jquery inserts display:block, where I would want display:table-cell. How can I achieve this? My attempt so far:

<div class="mydiv" style"display:none">test</div>

.mydiv {
display:table-cell;
}

$("a#showdiv").click(function() {
    $(".mydiv").toggle();
4

4 回答 4

17

改为使用.toggleClass()并使用 css 进行样式设置..

html

<div class="mydiv table-hidden">test</div>

css

.mydiv {
    display:table-cell;
}
.mydiv.table-hidden{
    display:none;
}

jQuery

$("a#showdiv").click(function() {
    $(".mydiv").toggleClass('table-hidden');
}
于 2013-08-04T19:11:08.583 回答
3

使用 CSS 设置样式@Gaby aka G. Petrioli或使用.css()jQuery 中的方法。

HTML

<div class="mydiv">test</div>

jQuery

$("a#showdiv").click(function() {
    if($(".mydiv").css("display") == "none"){
      $(".mydiv").css("display", "table-cell");
    } else {
      $(".mydiv").css("display", "none");
    }
});
于 2013-08-05T13:45:03.300 回答
2

你所拥有的应该已经工作了。

在 jQuery 中,除非元素的 style 属性display最初设置为 以外的其他值none,否则当show调用 时,它所做的只是删除 style 属性以进行显示。它不会将其设置为阻塞。

您可以在这个小提琴中亲自看到,当单击按钮时,displayCSS 中设置的就是元素设置的内容。

这是jQuery 源代码中的相关代码:

function showHide( elements, show ) {
    var display, elem, hidden,
        values = [],
        index = 0,
        length = elements.length;

    for ( ; index < length; index++ ) {
        elem = elements[ index ];
        if ( !elem.style ) {
            continue;
        }

        values[ index ] = data_priv.get( elem, "olddisplay" );
        display = elem.style.display;
        if ( show ) {
            // Reset the inline display of this element to learn if it is
            // being hidden by cascaded rules or not
            if ( !values[ index ] && display === "none" ) {
                elem.style.display = "";
            }

            // Set elements which have been overridden with display: none
            // in a stylesheet to whatever the default browser style is
            // for such an element
            if ( elem.style.display === "" && isHidden( elem ) ) {
                values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
            }
        } else {

            if ( !values[ index ] ) {
                hidden = isHidden( elem );

                if ( display && display !== "none" || !hidden ) {
                    data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") );
                }
            }
        }
    }

    // Set the display of most of the elements in a second loop
    // to avoid the constant reflow
    for ( index = 0; index < length; index++ ) {
        elem = elements[ index ];
        if ( !elem.style ) {
            continue;
        }
        if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
            elem.style.display = show ? values[ index ] || "" : "none";
        }
    }

    return elements;
}

我应该注意,切换类通常会更快,因为要检查的信息更少。

于 2013-08-04T19:29:51.847 回答
1
.display-none {
    display: none;
}
div.display-table-cell {
    display: table-cell;
}

<button id="showdiv">Show/Hide</button>
<div class="mydiv display-none">test</div>
<div class="mydiv display-none">test</div>
<div class="mydiv display-none">test</div>
<div class="mydiv display-none">test</div>

$("#showdiv").click(function() {
    $(".mydiv").toggleClass('display-table-cell');
});

http://jsfiddle.net/7q27y/

如果您也了解 CSS 优先级,那么从技术上讲,您不需要div.后者:

div.display-table-cell {
    display: table-cell;
}

http://jsfiddle.net/7q27y/

当然,这是由于它的优先级以及它落在另一个语句之后的事实,否则两者都会计算为相同的优先级。看:

http://jsfiddle.net/7q27y/2/

于 2013-08-04T19:11:19.553 回答