Селектор CSS, чтобы получить последний видимый div - PullRequest
151 голосов
/ 11 марта 2011

Сложный вопрос о CSS-селекторе, даже не знаю, возможно ли это.

Допустим, это макет HTML:

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

Я хочу выбрать последний div, который отображается (т.е. не display:none), который будет третьим div в приведенном примере.Имейте в виду, количество div с на реальной странице может отличаться (даже display:none).

Ответы [ 8 ]

56 голосов
/ 11 марта 2011

Вы можете выбрать и стилизовать это с помощью JavaScript или jQuery, но только CSS не может этого сделать.

Например, если у вас на сайте реализовано jQuery , вы можете простоdo:

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

Хотя, надеюсь, у вас будет класс / ID, обернутый вокруг выбранных вами div, в этом случае ваш код будет выглядеть так:

var last_visible_element = $('#some-wrapper div:visible:last');
13 голосов
/ 21 апреля 2017

Реальный ответ на этот вопрос, вы не можете сделать это.Альтернативы только для CSS-ответов не являются правильными ответами на этот вопрос, но если JS-решения приемлемы для вас, вам следует выбрать один из JS-ответов или jQuery.Однако, как я сказал выше, верный и правильный ответ заключается в том, что вы не можете сделать это в CSS надежно , если вы не готовы принять оператор :not с [style*=display:none] и другими такими отрицательными селекторами,которая работает только со встроенными стилями и является в целом плохим решением.

7 голосов
/ 11 марта 2011

Я думаю, что невозможно выбрать по значению css (отображение)

edit:

, на мой взгляд, здесь имеет смысл использовать немного jquery:

$('#your_container > div:visible:last').addClass('last-visible-div');
6 голосов
/ 08 июля 2017

Если вы можете использовать встроенные стили, то вы можете сделать это исключительно с помощью CSS.

Я использую это для выполнения CSS на следующем элементе, когда предыдущий виден:

div[style='display: block;'] + table {
  filter: blur(3px);
}
6 голосов
/ 06 июля 2014

Чистое решение 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/

2 голосов
/ 27 апреля 2014

Это невозможно с помощью 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;
    }

});
2 голосов
/ 11 марта 2011

иначе, вы можете сделать это с помощью JavaScript, в Jquery вы можете использовать что-то вроде:

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

* отредактирована

0 голосов
/ 17 ноября 2017

Это сработало для меня.

.alert:not(:first-child){
    margin: 30px;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...