Selektor CSS untuk mendapatkan div terakhir yang terlihat

162

Pertanyaan pemilih CSS yang rumit, tidak tahu apakah itu mungkin.

Katakanlah ini adalah tata letak HTML:

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

Saya ingin memilih yang terakhir div, yang ditampilkan (mis. Tidak display:none) yang akan menjadi yang ketiga divdalam contoh yang diberikan. Pikiran Anda, jumlah divs pada halaman nyata dapat berbeda (bahkan display:noneyang).

Vishal Shah
sumber

Jawaban:

63

Anda dapat memilih dan menata ini dengan JavaScript atau jQuery, tetapi CSS saja tidak dapat melakukan ini.

Misalnya, jika Anda menerapkan jQuery di situs, Anda bisa melakukan:

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

Meskipun mudah-mudahan Anda akan memiliki kelas / ID melilit div yang Anda pilih, dalam hal ini kode Anda akan terlihat seperti:

var last_visible_element = $('#some-wrapper div:visible:last');
Mimpi nyata
sumber
22
pertanyaannya dengan jelas mengatakan tidak "a JQuery CSS Selector", mengatakan "A SELECTOR CSS", ini harus diterima JAWABAN = P
AgelessEssence
2
Ini memang jawaban untuk pertanyaan awal. Penanya tidak pernah menyebutkan javascript atau jquery dan tag itu ditambahkan oleh penjawab lain. 1nfected - apakah Anda benar-benar menginginkan jQuery? Jika demikian, tolong sebutkan itu dalam pertanyaan Anda. Jika tidak, Anda harus menerima jawaban ini sebagai gantinya.
jep
Saya pikir jQuery dapat diterima oleh OP. Bagaimanapun, itu adalah solusi yang diterima.
Surreal Dreams
7
Whhyyyy adalah jquery allllwaaayyysss jawaban pertama? Ini adalah jawaban javascript untuk pertanyaan CSS . CSS! == javascript
dudewad
2
@dudewad: Lihat bagian terakhir dari kalimat pertama: "tapi CSS saja tidak bisa melakukan ini." Jawabannya bisa berhenti begitu saja, tanpa ada alternatif yang terlihat ... atau memberikan alternatif. Tetapi jawaban ini setidaknya telah melakukan uji tuntas dalam menyatakan bahwa CSS tidak dapat melakukan apa yang diminta (meskipun tidak menjelaskan mengapa ). Di sisi lain, jawaban yang hanya berbunyi pada solusi JavaScript tanpa mengakui sifat CSS dari pertanyaan itu patut dikritik.
BoltClock
23

Jawaban sebenarnya untuk pertanyaan ini adalah, Anda tidak bisa melakukannya. Alternatif untuk jawaban khusus CSS bukan jawaban yang benar untuk pertanyaan ini, tetapi jika solusi JS dapat Anda terima, maka Anda harus memilih salah satu dari jawaban JS atau jQuery di sini. Namun, seperti yang saya katakan di atas, jawaban yang benar dan benar adalah bahwa Anda tidak dapat melakukan ini dengan andal di CSS kecuali Anda bersedia menerima :notoperator dengan [style*=display:none]dan penyeleksi negatif lainnya, yang hanya bekerja pada gaya inline, dan secara keseluruhan buruk larutan.

dudewad
sumber
Pertama, saya setuju dengan Anda tetapi saya berpikir bahwa menggunakan :notoperator seperti yang Anda nyatakan dapat bekerja dalam keadaan tertentu. Misalnya, ini berfungsi dengan baik untuk situasi saya di mana saya memiliki elemen bersembunyi JS bersyarat yang kemudian menambahkan gaya sebaris dan dengan demikian solusi Anda benar-benar berfungsi dengan baik :)
doz87
1
Nah, kalau begitu saya kira apa yang berhasil :) Saya hanya sedikit yang idealis dan saya suka menekankan di mana hal-hal yang tidak terbaik, yang penting untuk dapat membedakan apa yang 'hacky' dan apa yang bukan karena itu membuat kita semua programmer lebih baik.
dudewad
Ya saya dengar, saya setuju bahwa solusi ini tidak boleh digunakan sebagai solusi css hanya untuk permintaan OP, saya pikir ini bekerja dengan sangat baik ketika digunakan bersama dengan JS.
doz87
Anda mungkin juga menggunakan kelas CSS untuk menyembunyikan elemen (bukan gaya inline). Jika itu masalahnya, Anda bisa meniadakan pemilih untuk kelas persembunyian itu. Ini selalu memilih apa yang tersembunyi karena keduanya diatur oleh kelas CSS yang sama. Jadi jawaban Anda masuk ke arah yang benar tetapi tidak cukup jauh. :-)
ygoe
8

Jika Anda dapat menggunakan gaya sebaris, maka Anda dapat melakukannya murni dengan CSS.

Saya menggunakan ini untuk melakukan CSS pada elemen berikutnya ketika yang sebelumnya terlihat:

div [style = 'display: block;'] + table {
  filter: blur (3px);
}
Alex Grande
sumber
1
Saya akan mengubahnya ke [style*='display: block']karena bisa display: block !important;atau hanya <div style="display: block">:-)
OZZIE
Ini berfungsi untuk saya dalam file css seperti ini .btn-group > .btn.d-none + .btn(digunakan untuk kelompok input bootstrap "
Jean-Charbel VANNIER
7

Saya pikir itu tidak mungkin untuk memilih dengan nilai css (tampilan)

edit:

menurut pendapat saya, masuk akal untuk menggunakan sedikit jquery di sini:

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

Solusi JS murni (mis. Ketika Anda tidak menggunakan jQuery atau kerangka kerja lain untuk hal-hal lain dan tidak ingin mengunduh itu hanya untuk tugas ini):

<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/

harimau kumbang
sumber
Terima kasih atas cuplikannya, satu-satunya balasan non-jQuery! Namun, ini tidak berfungsi ketika memiliki beberapa elemen induk untuk diterapkan ke: jsfiddle.net/uEeaA/100 - dapatkah Anda membantu saya membangun solusi untuk orang lain yang berfungsi? Saya membutuhkannya, orang lain membutuhkannya, jadi tolong bantu :)
mnsth
Saya menyadari ini adalah utas lama, tetapi bagi pengunjung masa depan, Anda dapat melakukan sesuatu di sepanjang jsfiddle.net/uEeaA/103
xec
Saya ingin memilih ini hanya b / c Anda menjatuhkan jQuery - baik pada Anda. Satu-satunya keluhan saya adalah div dapat disembunyikan dari pandangan dalam banyak hal, tidak hanya berdasarkan parameter style. Cepat nyata: [1] lebar dan tinggi dapat diatur ke 0, [2] skala transformasi dapat 0, [3] dan kita dapat menempatkannya di luar area yang dapat dilihat.
Markus
4

Mencoba

div: not ([style * = "display: none"])

Tyler Wayne
sumber
2

dengan cara lain, Anda dapat melakukannya dengan javascript, di Jquery Anda dapat menggunakan sesuatu seperti:

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

* diedit ulang

Eveevans
sumber
2

Tidak mungkin dengan CSS, namun Anda bisa melakukan ini dengan jQuery.

DEMO JSFIDDLE

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 (solusi sebelumnya):

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

$items.each(function() {

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

});
martynas
sumber
3
Itu banyak jQuery untuk $('li:visible:last').addClass('red').
alex
Hah? $('li').not(':hidden').last().addClass("red");
martynas
0

Jika Anda tidak lagi membutuhkan elemen yang disembunyikan, cukup gunakan element.remove()saja element.style.display = 'none';.

Masoud Shariati
sumber
-6

Ini berhasil untuk saya.

.alert:not(:first-child){
    margin: 30px;
}
kmukku
sumber
3
Anda tidak menjawab pertanyaan itu
Serginho