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

Vis*_*hah 155 html css css-selectors

一个棘手的CSS选择器问题,不知道它是否可能.

让我们说这是HTML布局:

<div></div>
<div></div>  
<div></div>  
<div style="display:none"></div>
<div style="display:none"></div>  
Run Code Online (Sandbox Code Playgroud)

我想选择div显示的最后一个(即不是display:none),这将是div给定示例中的第三个.请注意,div真实页面上的s 数量可能不同(甚至是display:none那些).

Sur*_*ams 57

您可以使用JavaScript或jQuery选择并设置样式,但仅靠CSS无法做到这一点.

例如,如果您在网站上实现了jQuery,那么您可以这样做:

var last_visible_element = $('div:visible:last');
Run Code Online (Sandbox Code Playgroud)

虽然希望你有一个类/ ID包裹你正在选择的div,在这种情况下你的代码看起来像:

var last_visible_element = $('#some-wrapper div:visible:last');
Run Code Online (Sandbox Code Playgroud)

  • 问题清楚地说没有"一个JQuery CSS选择器",说"一个CSS选择器",这应该是公认的ANSWER = P (19认同)
  • Whhyyyy是第一个回答allllwaaayyysss jquery?这是_CSS_问题的_javascript_答案.CSS!== javascript (4认同)
  • @dudewad:请参阅第一句的最后一部分:“但仅靠 CSS 无法做到这一点。” 答案可能就这样,看不到替代方案……或者提供替代方案。但是这个答案至少已经尽职尽责,实际上表明 CSS 不能做被要求的事情(尽管它没有详细说明*为什么*)。另一方面,一个只针对 JavaScript 解决方案而没有承认问题的 CSS 性质的答案*值得批评。 (4认同)
  • 这确实是原始问题的答案。提问者从未提及 javascript 或 jquery,而这些标签是由另一个回答者添加的。1nfected - 你真的想要 jQuery 吗?如果是这样,请实际将其放入您的问题中。否则,你应该接受这个答案。 (2认同)

dud*_*wad 18

这个问题的真正答案是,你不能这样做.仅CSS答案的替代方案不是这个问题的正确答案,但如果您可以接受JS解决方案,那么您应该在这里选择一个JS或jQuery答案.然而,正如我上面所说,真正的,正确的答案是你不能可靠地在CSS中做到这一点,除非你愿意接受:not运算符[style*=display:none]和其他这样的否定选择器,这只适用于内联样式,并且总体上很差解.

  • 好吧,那么我想什么有效:) 我只是一个理想主义者,我喜欢强调事情不是最好的,重要的是能够区分什么是“hacky”,什么不是,因为它使我们都成为更好的程序员。 (2认同)

小智 15

尝试

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

  • **这不起作用,**因为两个伪选择器是组合在一起的独立过滤器_(不按顺序处理)_。它采用 `div:last-child` 和 `div:not(...)` 的交集并使用该交集的结果。换句话说,如果实际的最后一个子元素具有“display: none”,则不会选择它,而且,如果它不是最后一个子元素,则没有此样式的 div 也不会被选择。 (8认同)
  • 使选择器完全有意义,但由于您需要选择最后一个子级本身,因此它不能显示无且仅获取最后一个子级,因此 :not([style*="display: none"]):last-child (2认同)
  • 它不选择最后一个孩子 (2认同)

Gui*_*e86 8

我认为不可能通过css值选择(显示)

编辑:

在我看来,在这里使用一些jquery是有意义的:

$('#your_container > div:visible:last').addClass('last-visible-div');
Run Code Online (Sandbox Code Playgroud)


Ale*_*nde 7

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

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

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

  • 我会把它改成 `[style*='display: block']` 因为它可以有 `display: block !important;` 或者只是 `&lt;div style="display: block"&gt;` :-) (3认同)

pan*_*her 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>
Run Code Online (Sandbox Code Playgroud)

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