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).
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>
Если вы можете использовать встроенные стили, то вы можете сделать это чисто с CSS.
Я использую это для выполнения CSS на следующем элементе, когда предыдущий виден:
div[style='display: block;'] + table { filter: blur(3px); }
другими словами, вы можете сделать это с помощью javascript , в jQuery вы можете использовать что-то вроде:
$('div:visible').last()* reedited
это невозможно с помощью CSS, однако вы можете сделать это с помощью jQuery.
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; } });
Comments