CSS选择器以获取最后可见的div


161

一个棘手的CSS选择器问题,甚至不知道是否可能。

可以说这是HTML布局:

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

我想选择div显示的最后一个(即不是display:none),div在给定示例中将是第三个。请注意,div实际页面上的s 数量可能会有所不同(甚至是个数display:none)。

Answers:


62

您可以使用JavaScript或jQuery选择并设置样式,但是仅CSS不能做到这一点。

例如,如果您在网站上实现了jQuery,则可以执行以下操作:

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

尽管希望您将在选择的div周围包裹一个类/ ID,但在这种情况下,代码将如下所示:

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

22
该问题明确指出没有“ A JQuery CSS Selector”,没有说“ A CSS SELECTOR”,这应该是公认的答案= P
AgelessEssence 2011年

2
实际上,这就是对原始问题的答案。发问者从未提到过javascript或jquery,而这些标记是由另一个应答者添加的。1nfected-您真的想要jQuery吗?如果是这样,请实际将其放在您的问题中。否则,您应该接受此答案。
2013年

我认为jQuery是OP可接受的。毕竟,那是公认的解决方案。
超现实主义之梦

7
Whhyyyy是allllwaaayyysss jquery的第一个答案吗?这是CSS问题的javascript答案。CSS!== javascript
dudewad

2
@dudewad:请参见第一句话的最后部分:“但是仅CSS不能做到这一点。” 答案可能就是那样,没有其他选择……或提供其他选择。但是,这个答案至少已经尽了其应尽的努力,实际上是在声明CSS无法完成所要求的操作(尽管它没有详细说明为什么)。在另一方面,刚刚熄灭的一个JavaScript的解决方案不承认问题的CSS性质的答案值得批评。
BoltClock

23

这个问题的真正答案是,你做不到。仅CSS答案的替代方法不是此问题的正确答案,但是如果您可以接受JS解决方案,则应在此处选择JS或jQuery答案之一。但是,正如我在上文所述,正确的正确答案是您无法在CSS中可靠地执行此操作,除非您愿意接受:not运算符[style*=display:none]以及此类取反的选择器,这些选择器仅适用于内联样式,并且总体上较差解。


首先,我同意您的意见,但我确实认为,:not在某些情况下使用您所说的运算符是可行的。例如,这对于我有条件地隐藏元素然后添加内联样式的JS的情况非常有效,因此您的解决方案实际上可以完美地工作:)
doz87

1
好吧,那么我猜可行的方法是可行的:)我只是一个理想主义者,我想强调哪里不是最好的,能够区分什么是“ hacky”和什么不是,这很重要。它使我们所有人都是更好的程序员。
dudewad

是的,我听到了,我同意不应该将此解决方案用作OP查询的CSS唯一解决方案,但是我确实认为,与JS结合使用时,此解决方案效果很好。
doz87

您还可以使用CSS类来隐藏元素(而不是内联样式)。如果是这样,您也可以取消该隐藏类的选择器。这总是选择相同的隐藏内容,因为两者都是由同一CSS类设置的。因此,您的答案朝着正确的方向发展,但还远远不够。:-)
ygoe

8

如果可以使用内联样式,则可以完全使用CSS进行。

当前一个元素可见时,我正在用它在下一个元素上做CSS:

div [style ='display:block;'] +表格{
  过滤器:blur(3px);
}

1
我将其更改为,[style*='display: block']因为它可能具有display: block !important;或仅仅是<div style="display: block">:-)
OZZIE

它对我来说像这样的css文件有效.btn-group > .btn.d-none + .btn(用于引导程序的输入组”
Jean-Charbel VANNIER

7

我认为无法通过CSS值(显示)进行选择

编辑:

我认为,在此处使用一些jquery会很有意义:

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

6

纯JS解决方案(例如,当您不将jQuery或其他框架用于其他用途并且不想仅为该任务而下载时):

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


感谢您的摘录,唯一的非jQuery答复!但是,当有多个父元素要应用于时,此方法不起作用:jsfiddle.net/uEeaA/100-您能帮助我为其他可行的方法构建解决方案吗?我需要它,其他人也需要它,所以请帮忙:)
mnsth 2015年

我意识到这是一个旧线程,但是对于任何将来的访问者,您都可以按照jsfiddle.net/uEeaA/103
xec

我想对这只丢掉jQuery的b / c进行投票-很好。我唯一的抱怨是,div可以以多种方式隐藏起来,而不仅仅是基于style参数。真正快速:[1]宽度和高度可以设置为0,[2]变换比例可以设置为0,[3],我们可以将其放置在可见区域之外。
马库斯


2

以其他方式,您可以使用javascript做到这一点,在Jquery中,您可以使用类似以下内容的方法:

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

*已编辑


2

CSS不可能,但是您可以使用jQuery。

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(先前的解决方案):

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

$items.each(function() {

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

});

3
有很多jQuery用于$('li:visible:last').addClass('red')
亚历克斯

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


-6

这对我有用。

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

3
您没有回答问题
Serginho '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.