CSS-селектор, чтобы получить последний видимый див



сложный вопрос селектора 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 ones).

790   9  

9 ответов:

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

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

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

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

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

существует чистое решение css (CSS3), если ваш div скрыт с помощью атрибута "style"

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

обратите внимание на пробел между "display:" и "none", если вы не можете точно сказать, есть ли пробел в атрибуте или нет, вы можете сделать селектор следующим образом:

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

jQuery-король, но решения CSS3-это Бог

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

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

edit:

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

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

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

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

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

div[style='display: block;'] + table {
  filter: blur(3px);
}

другими словами, вы можете сделать это с помощью javascript , в jQuery вы можете использовать что-то вроде:

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

* reedited

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

});

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

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

Comments

    Ничего не найдено.