Một bộ chọn CSS để có được div hiển thị cuối cùng


161

Một câu hỏi chọn CSS khó, không biết liệu nó có khả thi hay không.

Hãy nói rằng đây là cách bố trí HTML:

<div></div>
<div></div>  
<div></div>  
<div style="display:none"></div>
<div style="display:none"></div>  

Tôi muốn chọn cái cuối cùng div, được hiển thị (nghĩa là không display:none) sẽ là cái thứ ba divtrong ví dụ đã cho. Xin lưu ý, số divs trên trang thực có thể khác nhau (ngay cả số s display:none).

Câu trả lời:


62

Bạn có thể chọn và định kiểu này bằng JavaScript hoặc jQuery, nhưng CSS không thể làm điều này.

Ví dụ: nếu bạn đã triển khai jQuery trên trang web, bạn có thể thực hiện:

var last_visible_element = $('div:visible:last');

Mặc dù hy vọng bạn sẽ có một lớp / ID bao quanh các div bạn đang chọn, trong trường hợp đó, mã của bạn sẽ trông như sau:

var last_visible_element = $('#some-wrapper div:visible:last');

22
câu hỏi nói rõ ràng là không có "Bộ chọn CSS của JQuery", nói "Bộ chọn CSS", đây phải là ANSWER = P
AgelessEssence

2
Đây thực sự là câu trả lời cho câu hỏi ban đầu. Người hỏi không bao giờ đề cập đến javascript hoặc jquery và những thẻ đó đã được thêm bởi một người trả lời khác. 1nfected - bạn có thực sự muốn jQuery không? Nếu vậy, xin vui lòng thực sự đặt nó trong câu hỏi của bạn. Nếu không, bạn nên chấp nhận câu trả lời này thay vào đó.
jep

Tôi nghĩ rằng jQuery được chấp nhận bởi OP. Đó là giải pháp được chấp nhận, sau tất cả.
Giấc mơ siêu thực

7
Whhyyyy là câu trả lời đầu tiên allllwaaayyysss jquery? Đây là một câu trả lời javascript cho một câu hỏi CSS . CSS! == javascript
dudewad

2
@dudewad: Xem phần cuối của câu đầu tiên: "nhưng CSS không thể làm điều này." Câu trả lời có thể để nó ở đó, không có sự thay thế nào trong tầm nhìn ... hoặc cung cấp một giải pháp thay thế. Nhưng câu trả lời này ít nhất đã thực hiện được sự chuyên cần của mình khi thực sự tuyên bố rằng CSS không thể làm những gì đang được hỏi (mặc dù nó không giải thích rõ tại sao ). Mặt khác, một câu trả lời chỉ xuất hiện trên một giải pháp JavaScript mà không thừa nhận bản chất CSS của câu hỏi đáng bị chỉ trích.
BoltClock

23

Câu trả lời thực sự cho câu hỏi này là, bạn không thể làm điều đó. Các lựa chọn thay thế cho các câu trả lời chỉ dành cho CSS không phải là câu trả lời chính xác cho câu hỏi này, nhưng nếu các giải pháp JS được bạn chấp nhận, thì bạn nên chọn một trong các câu trả lời của JS hoặc jQuery tại đây. Tuy nhiên, như tôi đã nói ở trên, câu trả lời đúng, chính xác là bạn không thể thực hiện điều này trong CSS một cách đáng tin cậy trừ khi bạn sẵn sàng chấp nhận :nottoán tử với [style*=display:none]các bộ chọn phủ định như vậy, chỉ hoạt động trên các kiểu nội tuyến và nói chung là kém giải pháp.


Đầu tiên, tôi đồng ý với bạn nhưng tôi nghĩ rằng việc sử dụng :nottoán tử như bạn đã nêu có thể hoạt động trong một số trường hợp nhất định. Ví dụ: điều này hoạt động hoàn hảo cho tình huống của tôi khi tôi có các phần tử ẩn có điều kiện JS, sau đó thêm các kiểu nội tuyến và do đó giải pháp của bạn thực sự hoạt động hoàn hảo :)
doz87

1
Chà, tôi đoán là cái gì hiệu quả :) Tôi chỉ là một người theo chủ nghĩa duy tâm và tôi muốn nhấn mạnh nơi mọi thứ không phải là tốt nhất, điều quan trọng là có thể phân biệt được đâu là 'hacky' và cái gì không phải vì nó làm cho tất cả chúng ta lập trình tốt hơn
dudewad

Vâng tôi nghe thấy, tôi đồng ý rằng giải pháp này không nên được sử dụng như một giải pháp css duy nhất cho truy vấn OP, tôi nghĩ rằng nó hoạt động rất tốt khi được sử dụng cùng với JS.
doz87

Bạn cũng có thể sử dụng một lớp CSS để ẩn các phần tử (thay vì kiểu nội tuyến). Nếu đó là trường hợp, bạn cũng có thể phủ nhận bộ chọn cho lớp ẩn đó. Điều này luôn chọn giống nhau những gì được ẩn bởi vì cả hai đều được đặt bởi cùng một lớp CSS. Vì vậy, câu trả lời của bạn đi đúng hướng nhưng không đủ xa. :-)
ygoe

8

Nếu bạn có thể sử dụng các kiểu nội tuyến, thì bạn có thể làm điều đó hoàn toàn với CSS.

Tôi đang sử dụng điều này để thực hiện CSS trên phần tử tiếp theo khi phần trước xuất hiện:

div [style = 'display: block;'] + bảng {
  bộ lọc: làm mờ (3px);
}

1
Tôi sẽ thay đổi nó [style*='display: block']vì nó có thể có display: block !important;hoặc chỉ <div style="display: block">:-)
OZZIE

Nó hoạt động với tôi trong một tệp css như thế này .btn-group > .btn.d-none + .btn(được sử dụng cho các nhóm đầu vào của bootstrap "
Jean-Charbel VANNIER

7

Tôi nghĩ rằng không thể chọn theo giá trị css (hiển thị)

biên tập:

theo ý kiến ​​của tôi, sẽ có ý nghĩa khi sử dụng một chút jquery ở đây:

$('#your_container > div:visible:last').addClass('last-visible-div');

6

Giải pháp thuần túy (ví dụ: khi bạn không sử dụng jQuery hoặc khung công tác khác cho những thứ khác và không muốn tải xuống chỉ cho nhiệm vụ này):

<div>A</div>
<div>B</div>  
<div>C</div>  
<div style="display:none">D</div>
<div style="display:none">E</div>    

<script>
var divs = document.getElementsByTagName('div');
var last;

if (divs) {
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].style.display != 'none') {
            last = divs[i];           
        }
    }
}

if (last) {
    last.style.background = 'red';
}
</script>

http://jsfiddle.net/uEeaA/90/


Cảm ơn đoạn trích, câu trả lời không phải của jQuery! Tuy nhiên, điều này không hoạt động khi có nhiều yếu tố cha mẹ để áp dụng cho: jsfiddle.net/uEeaA/100 - bạn có thể giúp tôi xây dựng giải pháp cho những người khác hoạt động không? Tôi cần nó, những người khác cần nó, vì vậy hãy giúp đỡ :)
mnsth

Tôi nhận ra đây là một chủ đề cũ, nhưng đối với bất kỳ du khách trong tương lai, bạn có thể làm một cái gì đó dọc theo dòng của jsfiddle.net/uEeaA/103
XEC

Tôi muốn bỏ phiếu này chỉ vì bạn đã bỏ jQuery - tốt cho bạn. Khiếu nại duy nhất của tôi là một div có thể bị ẩn khỏi chế độ xem theo nhiều cách, không chỉ dựa trên tham số kiểu. Rất nhanh: [1] chiều rộng và chiều cao có thể được đặt thành 0, [2] thang đo biến đổi có thể là 0, [3] và chúng ta có thể đặt nó ra khỏi khu vực có thể xem được.
Markus


2

theo cách khác, bạn có thể làm điều đó với javascript, trong Jquery bạn có thể sử dụng một cái gì đó như:

$('div:visible').last()

* sậy


2

CSS không thể thực hiện được, tuy nhiên bạn có thể làm điều này với jQuery.

NHU CẦU DEMO

jQuery:

$('li').not(':hidden').last().addClass("red");

HTML:

<ul>
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
        <li class="hideme">Item 4</li>    
</ul>

CSS:

.hideme {
    display:none;
}

.red {
    color: red;
}

jQuery (giải pháp trước):

var $items = $($("li").get().reverse());

$items.each(function() {

    if ($(this).css("display") != "none") {
        $(this).addClass("red");
        return false;
    }

});

3
Đó là rất nhiều jQuery cho $('li:visible:last').addClass('red').
alex

Huh? $('li').not(':hidden').last().addClass("red");
martynas

0

Nếu bạn không còn cần các yếu tố ẩn, chỉ cần sử dụng element.remove()thay vì element.style.display = 'none';.


-6

Điều này làm việc cho tôi.

.alert:not(:first-child){
    margin: 30px;
}

3
bạn không trả lời câu hỏi
Serginho
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.