Làm cách nào để ẩn phần tử bằng Twitter Bootstrap và hiển thị nó bằng jQuery?


235

Giả sử tôi tạo một phần tử HTML như thế này,

<div id="my-div" class="hidden">Hello, TB3</div>
<div id="my-div" class="hide">Hello, TB4</div>
<div id="my-div" class="d-none">Hello, TB4</div>

Làm cách nào tôi có thể hiển thị và ẩn phần tử HTML đó khỏi jQuery / Javascript.

JavaScript:

$(function(){
  $("#my-div").show();
});

Kết quả: (với bất kỳ trong số này).

Tôi muốn các yếu tố trên được ẩn.

Cách đơn giản nhất để ẩn phần tử bằng Bootstrap và hiển thị nó bằng jQuery là gì?


Để giữ cho câu hỏi này có liên quan, tôi đã sửa đổi nó để hoạt động trên cả Bootstraps, vì câu trả lời chỉ là một sự khác biệt trong tên lớp.
Evan Carroll

Câu trả lời:


392

Câu trả lời đúng

Bootstrap 4.x

Bootstrap 4.x sử dụng .d-nonelớp mới . Thay vì sử dụng một trong hai .hidden hoặc .hidenếu bạn đang sử dụng Bootstrap 4.x, hãy sử dụng .d-none.

<div id="myId" class="d-none">Foobar</div>
  • Để hiển thị nó: $("#myId").removeClass('d-none');
  • Để ẩn nó: $("#myId").addClass('d-none');
  • Để chuyển đổi nó: $("#myId").toggleClass('d-none');

(nhờ bình luận của Fangming)

Bootstrap 3.x

Đầu tiên, đừng sử dụng .hide! Sử dụng .hidden. Như những người khác đã nói, .hidebị phản đối,

. leather có sẵn, nhưng nó không phải lúc nào cũng ảnh hưởng đến trình đọc màn hình và không được chấp nhận kể từ phiên bản 3.0.1

Thứ hai, sử dụng .toggleClass () , .addClass ().removeClass () của jQuery

<div id="myId" class="hidden">Foobar</div>
  • Để hiển thị nó: $("#myId").removeClass('hidden');
  • Để ẩn nó: $("#myId").addClass('hidden');
  • Để chuyển đổi nó: $("#myId").toggleClass('hidden');

Đừng sử dụng lớp css .show, nó có trường hợp sử dụng rất nhỏ. Các định nghĩa của show, hiddeninvisiblelà trong các tài liệu .

// Classes
.show {
  display: block !important;
}
.hidden {
  display: none !important;
  visibility: hidden !important;
}
.invisible {
  visibility: hidden;
}

4
Cảm ơn bạn rất nhiều Tôi đã tự hỏi stackoverflow cho một cái gì đó như thế này trong thời gian dài cho câu trả lời đơn giản. Cảm ơn bạn
Kết quả tìm kiếm Kết quả web Pi

Bất cứ ai cũng có ý tưởng về các phương thức: show () và hide () cho sau đó là gì?
danh sách kiểm tra

9
Sau đó, bạn không thể làm động nó (ví dụ. fadeIn()). Do đó sử dụng lớp collapsethay vì hidden. Và sau đó tất nhiên không có nhu cầu sử dụng removeClass, addClassvv
TheStoryCoder

2
Đối với Bootstrap 4 bạn phải sử dụng .hidden-xs-up. v4-alpha.getbootstrap.com/layout/responsive-utilities/ Khăn Ngoài ra còn có hiddenthuộc tính HTML5. v4-alpha.getbootstrap.com/content/reboot/ từ
Chloe

1
@Kangur jQuery .hide()không phải là .hidelớp của bootstrap . Phương thức jQuery hoạt động tốt, nhưng nó không phải là cách bootstrap. Các thư viện Bootstrap phụ thuộc vào việc bao gồm lớp .hidden trên phần tử để xác định nó không có ở đó. jQuery không thêm điều đó - trừ khi bạn hack nó như ở đây: stackoverflow.com/a/27439371/124486 , trong trường hợp đó bạn có thể phá vỡ những thứ cụ thể khác của jQuery.
Evan Carroll

65

Đơn giản:

$(function(){
  $("#my-div").removeClass('hide');
});

Hoặc nếu bạn bằng cách nào đó muốn lớp vẫn ở đó:

$(function(){
  $("#my-div").css('display', 'block !important');
});

1
Đây là một plugin jQuery cho phép bạn sử dụng các lớp .show () và. Suede () ngay cả với các lớp 'ẩn' và 'ẩn' của bootstrap. gist.github.com/zimkies/8360181
zimkies

9
Theo tài liệu của Bootstrap,. Leather có sẵn, nhưng nó không phải lúc nào cũng ảnh hưởng đến trình đọc màn hình và không được chấp nhận kể từ phiên bản 3.0.1. Sử dụng .hidden hoặc .sr-only thay thế.
bjtilley

18

Sử dụng bootstrap .collapse thay vì .hidden

Sau này trong JQuery, bạn có thể sử dụng .show () hoặc. Suede () để thao tác với nó


16

Giải pháp này không được chấp nhận. Sử dụng giải pháp bình chọn hàng đầu.

Các hidelớp học rất hữu ích để giữ cho nội dung ẩn trên tải trang.

Giải pháp của tôi cho vấn đề này là trong quá trình khởi tạo, chuyển sang ẩn của jquery:

$('.targets').hide().removeClass('hide');

Sau đó show()hide()nên hoạt động như bình thường.


1
. leather bị phản đối kể từ phiên bản 3.0.1
Evan Carroll

2
Ok, sử dụng .hidden kể từ phiên bản 3.0.1
Dustin Graham

Trong trường hợp này, có thể có các nội dung nhấp nháy được hiển thị trong vài giây trước khi ẩn với JS.
Sergei Romanov

Gọi. DA () lần đầu tiên áp dụng hiển thị: none; vào thẻ kiểu. Điều này xảy ra trước khi loại bỏ lớp ẩn. Nếu bạn có nó theo thứ tự đó, nó không nên nhấp nháy.
Dustin Graham

14

Một cách khác để giải quyết sự phiền toái này là tạo lớp CSS của riêng bạn mà không đặt! Quan trọng ở cuối quy tắc, như sau:

.hideMe {
    display: none;
}

và được sử dụng như vậy:

<div id="header-mask" class="hideMe"></div>

và bây giờ jQuery ẩn hoạt động

$('#header-mask').show();

Nó phá vỡ vấn đề được đặt ra bằng cách sử dụng các lớp của bootstrap. Tại sao downvote giải pháp ngắn và đơn giản này?
dbrin

Bởi vì giải pháp ngắn và đơn giản này không trả lời được câu hỏi đặc biệt yêu cầu sử dụng các lớp của bootstrap3. Chưa kể, trong khi đơn giản, .hidden trong Bootstrap được định nghĩa là .hidden { display: none !important; visibility: hidden !important; }
Evan Carroll

2
và đó chính xác là vấn đề, các phương thức ẩn và hiển thị của JQuery không hoạt động tốt với css này.
dbrin

5

Phương pháp @ Dustin-graham vạch ra là cách tôi cũng làm như vậy. Cũng cần nhớ rằng bootstrap 3 hiện sử dụng "ẩn" thay vì "ẩn" theo tài liệu của họ tại getbootstrap . Vì vậy, tôi sẽ làm một cái gì đó như thế này:

$(document).ready(function() {
    $('.hide').hide().removeClass('hide');
    $('.hidden').hide().removeClass('hidden');
});

Sau đó, bất cứ khi nào sử dụng jQuery show()hide()các phương thức, sẽ không có xung đột.


Thật thanh lịch và đơn giản - bạn chỉ cần khắc phục một thiếu sót Bootstrap thông thường. Tôi sẽ sử dụng hiddenlớp và sau đó thử làm show()trong jQuery và sẽ không có gì xảy ra. Giải pháp của bạn khắc phục điều này rất dễ dàng và tôi không nghĩ về nó.
Volomike

5

Bắt đầu phần tử như vậy:

<div id='foo' style="display: none"></div>

Và sau đó, sử dụng sự kiện bạn muốn hiển thị, như vậy:

$('#foo').show();

Cách đơn giản nhất để đi tôi tin.


3

HTML:

<div id="my-div" class="hide">Hello, TB3</div>

Javascript:

$(function(){
    //If the HIDE class exists then remove it, But first hide DIV
    if ( $("#my-div").hasClass( 'hide' ) ) $("#my-div").hide().removeClass('hide');

    //Now, you can use any of these functions to display
    $("#my-div").show();
    //$("#my-div").fadeIn();
    //$("#my-div").toggle();
});

2

Tôi thích sử dụng toggleClass:

var switch = true; //it can be an JSON value ...
$("#my-div").toggleClass('hide', switch);

Điều này sẽ là tuyệt vời, nhưng switchhoàn toàn không cần thiết.
Evan Carroll

2
$(function(){

$("#my-div").toggle();

$("#my-div").click(function(){$("#my-div").toggle()})

})

// bạn thậm chí không phải thiết lập #my-div .hidecũng không !important, chỉ cần dán / lặp lại việc chuyển đổi trong chức năng sự kiện.


2

Gần đây đã gặp phải vấn đề này khi nâng cấp từ 2,3 lên 3,1; hoạt ảnh jQuery của chúng tôi ( slideDown ) đã bị hỏng vì chúng tôi đang ẩn trên các thành phần trong mẫu trang. Chúng tôi đã đi theo con đường tạo ra các phiên bản cách nhau của các lớp Bootstrap mà bây giờ mang quy tắc quan trọng!

.rb-hide { display: none; }
.rb-pull-left { float: left; }
etc...

3.1 không hỗ trợ. Da, nó có .hidden.
Evan Carroll

2

Câu trả lời của Razz là tốt nếu bạn sẵn sàng viết lại những gì bạn đã làm.

Đã gặp rắc rối tương tự và giải quyết nó như sau:

/**
 * The problem: https://github.com/twbs/bootstrap/issues/9881
 * 
 * This script enhances jQuery's methods: show and hide dynamically.
 * If the element was hidden by bootstrap's css class 'hide', remove it first.
 * Do similar in overriding the method 'hide'.
 */
!function($) {
    "use strict";

    var oldShowHide = {'show': $.fn.show, 'hide': $.fn.hide};
    $.fn.extend({
        show: function() {
            this.each(function(index) {
                var $element = $(this);
                if ($element.hasClass('hide')) {
                    $element.removeClass('hide');
                }
            });
            return oldShowHide.show.call(this);
        },
        hide: function() {
            this.each(function(index) {
                var $element = $(this);
                if ($element.hasClass('show')) {
                    $element.removeClass('show');
                }
            });
            return oldShowHide.hide.call(this);
        }
    });
}(window.jQuery);

Vứt nó đi khi Bootstrap đi kèm với một sửa chữa cho vấn đề này.


1
Có cần thiết hay tối ưu để kiểm tra xem lớp có tồn tại trước khi bạn gọi .removeClass()hay .addClass()không?
Evan Carroll

Ngoài ra, không .removeClass()làm việc trên tập hợp? Bạn không thể gọi một cách đơn giản$(this).removeClass('show')
Evan Carroll


2

Cập nhật : Từ bây giờ, tôi sử dụng .collapse$('.collapse').show().


Dành cho Bootstrap 4 Alpha 6

Đối với Bootstrap 4 bạn phải sử dụng .hidden-xs-up.

https://v4-alpha.getbootstrap.com/layout/responsive-utilities/#av Available- classes

Các lớp .hidden - * - up ẩn phần tử khi khung nhìn ở điểm dừng nhất định hoặc rộng hơn. Ví dụ: .hidden-md-up ẩn một yếu tố trên chế độ xem trung bình, lớn và cực lớn.

Ngoài ra còn có hiddenthuộc tính HTML5.

https://v4-alpha.getbootstrap.com/content/reboot/#html5-hidden-attribution

HTML5 thêm một thuộc tính toàn cầu mới có tên [hidden], được đặt theo kiểu hiển thị: không có mặc định. Mượn ý tưởng từ PureCSS, chúng tôi cải thiện mặc định này bằng cách làm cho [hidden] {display: none! Quan trọng; } để giúp ngăn màn hình của nó vô tình bị ghi đè. Mặc dù [hidden] không được hỗ trợ bởi IE10, nhưng tuyên bố rõ ràng trong CSS của chúng tôi lại xoay quanh vấn đề đó.

<input type="text" hidden>

Cũng .invisiblecó ảnh hưởng đến bố cục.

https://v4-alpha.getbootstrap.com/utilities/invisible-content/

Lớp .invisible có thể được sử dụng để chuyển đổi chỉ mức độ hiển thị của một phần tử, có nghĩa là màn hình của nó không bị sửa đổi và phần tử vẫn có thể ảnh hưởng đến dòng chảy của tài liệu.


1

cả ẩn và ẩn đều không được dùng nữa và sau đó bị xóa, không còn tồn tại trong các phiên bản mới. Bạn có thể sử dụng các lớp d-none / d-sm-none / vô hình vv tùy theo nhu cầu của bạn. Lý do có thể chúng bị xóa là vì ẩn / ẩn hơi khó hiểu trong bối cảnh CSS. Trong CSS, để ẩn (ẩn) được sử dụng để hiển thị, không hiển thị. tầm nhìn và hiển thị là những thứ khác nhau.

Nếu bạn cần một lớp cho khả năng hiển thị: ẩn, thì bạn cần lớp vô hình từ các tiện ích hiển thị.

Kiểm tra bên dưới cả tiện ích hiển thị và hiển thị:

https://getbootstrap.com/docs/4.1/utilities/visibility/

https://getbootstrap.com/docs/4.1/utilities/display/


1

Sử dụng đoạn mã sau cho Bootstrap 4, mở rộng jQuery:

(function( $ ) {

    $.fn.hideShow = function( action ) {

        if ( action.toUpperCase() === "SHOW") {
            // show
            if(this.hasClass("d-none"))
            {
                this.removeClass("d-none");
            }

            this.addClass("d-block");

        }

        if ( action.toUpperCase() === "HIDE" ) {
            // hide
            if(this.hasClass("d-block"))
            {
                this.removeClass("d-block");
            }

            this.addClass("d-none");
      }

          return this;
    };

}( jQuery ));
  1. Đặt mã trên vào một tập tin. Giả sử "myJqExt.js"
  2. Bao gồm tệp sau khi jQuery đã được bao gồm.

  3. Sử dụng nó bằng cú pháp

    $ (). hideShow ('ẩn');

    $ (). hideShow ('hiển thị');

hy vọng các bạn tìm thấy nó hữu ích. :-)


0

Bootstrap, JQuery, không gian tên ... Có gì sai với một đơn giản:

var x = document.getElementById('my-div');
x.className.replace(/\bhide\b/, ''); //remove any hide class
x.style.display = ''; //show
x.style.display = 'none'; //hide

Bạn có thể tạo một chức năng trợ giúp nhỏ, tuân thủ KISS:

function mydisplay(id, display) {
    var node = (typeof id == 'string') ? document.getElementById(id) : id;
    node.className.replace(/\bhide\b/, '');
    if (node) {
        if (typeof display == 'undefined') {
            display = (node.style.display != 'none');
        } else if (typeof display == 'string' && display == 'toggle') {
            display = mydisplay(node, !mydisplay(node));
        } else {
            node.style.display = (display) ? '' : 'none';
        }
    }
    return display;
}
is_hidden = mydisplay('my-div'); //actual state
mydisplay('my-div', false); //hide
mydisplay('my-div', true); //show
mydisplay('my-div', 'toggle'); //toggle state

0

Dựa trên các câu trả lời ở trên, tôi vừa thêm các hàm của riêng mình và điều này càng không mâu thuẫn với các hàm jquery có sẵn như. Suede (), .show (), .toggle (). Hy vọng nó giúp.

    /*
     * .hideElement()
     * Hide the matched elements. 
     */
    $.fn.hideElement = function(){
        $(this).addClass('hidden');
        return this;
    };

    /*
     * .showElement()
     * Show the matched elements.
     */
    $.fn.showElement = function(){
        $(this).removeClass('hidden');
        return this;
    };

    /*
     * .toggleElement()
     * Toggle the matched elements.
     */
    $.fn.toggleElement = function(){
        $(this).toggleClass('hidden');
        return this;
    };

0

Tôi đã giải quyết vấn đề của mình bằng cách chỉnh sửa tệp CSS Bootstrap, xem tài liệu của họ:

.ẩn giấu:

.hide is available, but it does not always affect screen readers and is deprecated as of v3.0.1

.hide {
  display: none !important;
}

.hidden là những gì chúng ta cho là sử dụng bây giờ, nhưng thực tế nó là:

.hidden {
  display: none !important;
  visibility: hidden !important;
}

JQuery "fadeIn" sẽ không hoạt động vì "khả năng hiển thị".

Vì vậy, đối với Bootstrap mới nhất,. Leather không còn được sử dụng nữa, nhưng nó vẫn nằm trong tệp min.css. Vì vậy, tôi đã rời khỏi .hidden AS IS và chỉ loại bỏ "! quan trọng" khỏi lớp ". leather" (được cho là không được chấp nhận). nhưng bạn cũng có thể ghi đè lên CSS của chính mình, tôi chỉ muốn tất cả ứng dụng của mình hoạt động giống nhau nên tôi đã thay đổi tệp CSS Bootstrap.

Và bây giờ jQuery "fadeIn ()" hoạt động.

Lý do mà tôi đã thực hiện điều này so với các đề xuất ở trên là vì khi bạn "removeClass ('. Hide')", đối tượng ngay lập tức được hiển thị và bạn bỏ qua hình ảnh động :)

Tôi hy vọng nó đã giúp người khác.


0

Câu trả lời sáng sủa hơn

Trong Bootstrap 4, bạn ẩn phần tử:

<p id="insufficient-balance-warning" class="d-none alert alert-danger">Pay me</p>

Sau đó, chắc chắn, bạn có thể hiển thị nó theo nghĩa đen:

if (pizzaFundsAreLow) {
  $('#insufficient-balance-warning').removeClass('d-none');
}

Nhưng nếu bạn thực hiện theo cách ngữ nghĩa, bằng cách chuyển trách nhiệm từ Bootstrap sang jQuery, thì bạn có thể sử dụng các đặc tính jQuery khác như fading:

if (pizzaFundsAreLow) {
  $('#insufficient-balance-warning').hide().removeClass('d-none').fadeIn();
}

-1

Twitter Bootstrap cung cấp các lớp để chuyển đổi nội dung, xem https://github.com/twbs/bootstrap/blob/3ee5542c990817324f0a07b97d01d1fe206fd8d6/less/utilities.less .

Tôi hoàn toàn mới với jQuery và sau khi đọc tài liệu của họ, tôi đã tìm đến một giải pháp khác để kết hợp Twitter Bootstrap + jQuery.

Đầu tiên, giải pháp để 'ẩn' và 'hiển thị' một phần tử (lớp wsis-sụp đổ) khi nhấp vào phần tử khác (lớp wsis-toggle), là sử dụng .toggle .

jQuery(document).ready(function() {
    jQuery(".wsis-toggle").click(function(){
        jQuery(".wsis-collapse").toggle();
    });
});

Bạn cũng đã ẩn phần tử .wsis-collapsebằng cách sử dụng lớp Twitter Bootstrap (V3) .hidden:

.hidden {
  display: none !important;
  visibility: hidden !important;
}

Khi bạn nhấp vào .wsis-toggle, jQuery sẽ thêm một kiểu nội tuyến:

display: block

!importanttrong Bootstrap Twitter, kiểu nội tuyến này không có hiệu lực, vì vậy chúng tôi cần xóa .hiddenlớp, nhưng tôi sẽ không đề xuất .removeClasscho việc này! Bởi vì khi jQuery sẽ ẩn thứ gì đó một lần nữa, nó cũng thêm một kiểu nội tuyến:

display: none

Điều này không giống với lớp .hidden của Twitter Bootstrap, cũng được tối ưu hóa cho AT (trình đọc màn hình). Vì vậy, nếu chúng tôi muốn hiển thị div ẩn, chúng tôi cần loại bỏ .hiddenlớp Twitter Bootstrap, vì vậy chúng tôi sẽ loại bỏ các tuyên bố quan trọng, nhưng nếu chúng tôi ẩn lại, chúng tôi muốn có .hiddenlại lớp! Chúng tôi có thể sử dụng [.toggleClass] [3] cho việc này.

jQuery(document).ready(function() {
    jQuery(".wsis-toggle").click(function(){
        jQuery(".wsis-collapse").toggle().toggleClass( "hidden" );
    });
});

Bằng cách này, bạn tiếp tục sử dụng lớp ẩn mỗi khi nội dung bị ẩn.

Cả .showlớp trong TB thực sự giống với kiểu nội tuyến của jQuery, cả hai 'display: block'. Nhưng nếu .showlớp tại một thời điểm nào đó sẽ khác, thì bạn chỉ cần thêm lớp này:

jQuery(document).ready(function() {
    jQuery(".wsis-toggle").click(function(){
        jQuery(".wsis-collapse").toggle().toggleClass( "hidden show" );
    });
});

@EvanCarroll, tại sao nó phức tạp? Tôi cũng đã đọc câu trả lời của bạn và tôi thấy bạn đề nghị sử dụng toggleClass mà tôi cũng làm, vì vậy tôi không hiểu bình luận của bạn.
dùng2312234
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.