En son görünür div elde etmek için bir CSS seçici


161

Zor bir CSS seçici sorusu, hatta mümkün olup olmadığını bilmiyorum.

Bunun HTML mizanpajı olduğunu varsayalım:

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

Verilen örnekte üçüncü olan div(yani değil display:none) görüntülenen sonuncuyu seçmek istiyorum div. Dikkat edin, divgerçek sayfadaki s sayısı farklı olabilir (hattadisplay:none olanlar).

Yanıtlar:


62

Bunu JavaScript veya jQuery ile seçebilir ve stil uygulayabilirsiniz, ancak tek başına CSS bunu yapamaz.

Örneğin , sitede jQuery uygulanmışsa, şunları yapabilirsiniz:

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

Umarım seçtiğiniz div'ların etrafına sarılmış bir sınıf / kimliğiniz olmasına rağmen, bu durumda kodunuz şöyle görünür:

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

22
soru açıkça "bir JQuery CSS Seçici" diyor, "Bir CSS SEÇİCİ" diyor, bu kabul edilen ANSWER = P
AgelessEssence

2
Bu aslında asıl sorunun cevabıdır. Soru soran, javascript veya jquery'den hiç bahsetmedi ve bu etiketler başka bir cevaplayıcı tarafından eklendi. 1nfected - jQuery'yi gerçekten istiyor musunuz? Eğer öyleyse, lütfen bunu sorunuza koyun. Aksi takdirde, bunun yerine bu yanıtı kabul etmelisiniz.
jep

Bence jQuery OP için kabul edilebilir. Ne de olsa kabul edilen çözüm buydu.
Gerçeküstü Düşler

7
Neden ilk cevap allllwaaayyysss jquery? Bu bir CSS sorusuna bir javascript cevabıdır . CSS! == javascript
dudewad

2
@dudewad: İlk cümlenin son bölümüne bakın: "ama tek başına CSS bunu yapamaz." Bu sorunun yanıtı, görünürde alternatif yok ... ya da bir alternatif sağlayabilirdi. Ancak bu cevap en azından CSS'nin sorulan şeyi yapamayacağını belirtmek için gereken özeni gösterdi (ancak neden ayrıntılı olmasa da ). Öte yandan, sadece sorunun CSS doğasını kabul vermeden bir JavaScript çözüm üzerinde söner bir cevap olduğunu değerinde eleştiren.
BoltClock

23

Bu sorunun asıl cevabı, bunu yapamazsınız. Yalnızca CSS yanıtlarına alternatifler bu sorunun doğru yanıtları değildir, ancak JS çözümleri sizin için kabul edilebilirse, burada JS veya jQuery yanıtlarından birini seçmelisiniz. Bununla birlikte, yukarıda söylediğim gibi, doğru, doğru cevap, operatörü sadece satır içi stiller üzerinde çalışan ve genel olarak zayıf olan bu gibi olumsuzlanmış seçicilerle kabul etmeye istekli olmadığınız sürece bunu CSS'de güvenilir bir şekilde yapamayacağınızdır. çözüm.:not[style*=display:none]


İlk olarak, sizinle aynı fikirdeyim ancak :notoperatörün belirttiğiniz şekilde kullanılmasının belirli durumlarda işe yarayacağını düşünüyorum . Örneğin, bu durum daha sonra satır içi stiller ekleyen JS koşullu gizleme öğeleri var benim durumum için mükemmel çalışır ve böylece çözümünüz gerçekten mükemmel çalışır :)
doz87

1
Peki, o zaman neyin işe yaradığını tahmin ediyorum :) Ben sadece idealistim ve işlerin en iyi olmadığı yerleri vurgulamayı seviyorum, 'hacky' olanı ve neyin olmadığını ayırt edebilmek önemlidir. hepimizi daha iyi programcılar yapar.
dudewad

Evet seni duyuyorum, bu çözümün OP sorgusuna sadece bir css çözümü olarak kullanılmaması gerektiğini kabul ediyorum, JS ile birlikte kullanıldığında bunun çok iyi çalıştığını düşünüyorum.
doz87

Öğeleri gizlemek için (satır içi stil yerine) bir CSS sınıfı da kullanabilirsiniz. Durum buysa, bu gizleme sınıfı için seçiciyi de reddedebilirsiniz. Her ikisi de aynı CSS sınıfı tarafından ayarlandığından, bu her zaman gizli olanı seçer. Bu yüzden cevabınız doğru yöne gidiyor ama yeterince uzak değil. :-)
ygoe

8

Satır içi stilleri kullanabiliyorsanız, bunu tamamen CSS ile yapabilirsiniz.

Önceki görünür olduğunda bir sonraki öğede CSS yapmak için kullanıyorum:

div [style = 'display: block;'] + tablo {
  filtre: bulanıklaştırma (3 piksel);
}

1
Ben [style*='display: block']olabilirdi display: block !important;ya da sadece <div style="display: block">:-) için değiştirmek istiyorum
OZZIE

Benim için böyle bir css dosyasında .btn-group > .btn.d-none + .btn(bootstrap girdi grupları için kullanılır ") çalışır
Jean-Charbel VANNIER

7

Bence bir css değeri (ekran) ile seçmek mümkün değil

Düzenle:

bence, burada biraz jquery kullanmak mantıklı olurdu:

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

6

Pure JS çözümü (örneğin, başka şeylere jQuery veya başka bir çerçeve kullanmadığınızda ve bunu yalnızca bu görev için indirmek istemiyorsanız):

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


Snippet için teşekkürler, sadece jQuery olmayan cevap! Ancak, birden fazla üst öğe uygulandığında bu işe yaramaz: jsfiddle.net/uEeaA/100 - çalışan başkaları için bir çözüm geliştirmeme yardımcı olabilir misiniz? İhtiyacım var, diğerleri ihtiyaç var, bu yüzden lütfen yardım edin :)
mnsth

Bunun eski bir iş parçacığı olduğunu anlıyorum, ancak gelecekteki herhangi bir ziyaretçi için jsfiddle.net/uEeaA/103
xec

Ben sadece b / c jQuery - iyi sana düştü oy yukarıya istedim. Benim tek şikayet bir div sadece style parametresi dayalı değil, birçok yönden görünümden gizlenebilir olduğunu. Gerçek hızlı: [1] genişlik ve yükseklik 0 olarak ayarlanabilir, [2] dönüşüm ölçeği 0, [3] olabilir ve görüntülenebilir alanın dışına yerleştirebiliriz.
Markus


2

başka bir şekilde, javascript ile yapabilirsiniz, Jquery gibi bir şey kullanabilirsiniz:

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

* reedited


2

CSS ile mümkün değildir, ancak bunu jQuery ile yapabilirsiniz.

JSFIDDLE 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 (önceki çözüm):

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

$items.each(function() {

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

});

3
Bunun için çok fazla jQuery $('li:visible:last').addClass('red').
alex

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

0

Artık saklanan öğelere ihtiyacınız yoksa, element.remove()yerine kullanın element.style.display = 'none';.


-6

Bu benim için çalıştı.

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

3
şu soruya cevap vermiyor
Serginho
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.