【问题标题】:A CSS selector to get last visible div获取最后一个可见 div 的 CSS 选择器
【发布时间】:2011-07-13 14:30:08
【问题描述】:

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

假设这是 HTML 布局:

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

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

【问题讨论】:

  • 这个请求的一个问题是,作为一般原则,CSS 只能基于先前的元素(祖先或先前的兄弟姐妹)来选择一个元素,而不能基于之后的任何东西。因此,您的
    无法根据其后出现的
    的任何属性被选中。

标签: html css css-selectors


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 问题明确说没有“a JQuery CSS Selector”,说“A CSS SELECTOR”,这应该是公认的答案=P
  • 这确实是原始问题的答案。提问者从未提及 javascript 或 jquery,而这些标签是由另一个回答者添加的。 1nfected - 你真的想要 jQuery 吗?如果是这样,请把它放在你的问题中。否则,您应该接受这个答案。
  • 我认为 jQuery 是 OP 可以接受的。毕竟,这是公认的解决方案。
  • 为什么第一个答案 allllwaaayyysss jquery?这是对 CSS 问题的 javascript 答案。 CSS !== javascript
  • @dudewad:见第一句话的最后一部分:“但仅靠 CSS 无法做到这一点。”答案可能会留下来,看不到其他选择……或提供替代选择。但是这个答案至少已经尽职尽责地说明 CSS 不能做被问到的事情(尽管它没有详细说明为什么)。另一方面,一个只在 JavaScript 解决方案上出现而不承认问题的 CSS 本质的答案 值得批评。
【解决方案2】:

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

【讨论】:

  • 首先,我同意你的观点,但我确实认为使用你所说的:not 运算符可以在某些情况下工作。例如,这非常适合我的情况,即我有 JS 有条件地隐藏元素,然后添加内联样式,因此您的解决方案实际上可以完美运行 :)
  • 好吧,那我猜什么可行 :) 我只是一个理想主义者,我喜欢强调事情不是最好的,重要的是能够区分什么是' hacky' 不是因为它让我们成为更好的程序员。
  • 是的,我听到了,我同意这个解决方案不应该用作 OP 查询的唯一 css 解决方案,但我确实认为这在与 JS 结合使用时效果很好。
  • 您也可以使用 CSS 类来隐藏元素(而不是内联样式)。如果是这种情况,您也可以否定该隐藏类的选择器。这总是选择相同的隐藏内容,因为两者都是由同一个 CSS 类设置的。因此,您的答案朝着正确的方向发展,但还不够远。 :-)
【解决方案3】:

试试

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

【讨论】:

  • 使选择器完全有意义,但是由于您需要选择最后一个孩子本身,所以它不能显示无并且只获取最后一个孩子,所以 :not([style*="display: none "]):last-child
  • 如果您计划在某些时候隐藏某些元素,这是一个完美的解决方案,例如使用 jQuery。
  • 它不选择最后一个孩子
【解决方案4】:

如果您可以使用内联样式,那么您完全可以使用 CSS。

当上一个元素可见时,我正在使用它对下一个元素执行 CSS:

div[style='display: block;'] + table { 过滤器:模糊(3px); }

【讨论】:

  • 我会把它改成[style*='display: block'],因为它可以有display: block !important;或者只是&lt;div style="display: block"&gt; :-)
  • 它适用于我这样的 css 文件.btn-group &gt; .btn.d-none + .btn(用于引导程序的输入组)
【解决方案5】:

我认为不可能通过 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/

    【讨论】:

    • 感谢 sn-p,唯一的非 jQuery 回复!但是,当有多个父元素要应用时,这不起作用:jsfiddle.net/uEeaA/100 - 你能帮我为其他有效的解决方案构建一个解决方案吗?我需要它,其他人需要它,所以请帮忙:)
    • 我意识到这是一个旧线程,但对于任何未来的访问者,您可以按照jsfiddle.net/uEeaA/103 的方式做一些事情
    • 我想投票赞成这只是 b/c 你放弃了 jQuery - 对你很好。我唯一的抱怨是可以通过多种方式隐藏 div,而不仅仅是基于样式参数。真快:[1]宽高可以设置为0,[2]变换比例可以为0,[3]我们可以把它放到可视区域之外。
    【解决方案7】:

    使用 CSS 是不可能的,但是您可以使用 jQuery 来做到这一点。

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

    var $items = $($("li").get().reverse());
    
    $items.each(function() {
    
        if ($(this).css("display") != "none") {
            $(this).addClass("red");
            return false;
        }
    
    });
    

    【讨论】:

    • $('li:visible:last').addClass('red') 的 jQuery 很多。
    • 嗯? $('li').not(':hidden').last().addClass("red");
    【解决方案8】:

    另外,你可以用 javascript 来做, 在 Jquery 中你可以使用类似的东西:

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

    *重新编辑

    【讨论】:

      【解决方案9】:

      如果您不再需要隐藏的元素,只需使用element.remove() 而不是element.style.display = 'none';

      【讨论】:

        【解决方案10】:

        这对我有用。

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

        【讨论】:

        • 你没有回答问题
        猜你喜欢
        • 2014-04-26
        • 1970-01-01
        • 2022-01-07
        • 2019-03-28
        • 2016-04-17
        • 2012-01-12
        • 2011-09-21
        • 2015-06-14
        • 2023-04-07
        相关资源
        最近更新 更多