一个棘手的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
个。)
答案 0 :(得分:54)
您可以使用JavaScript或jQuery选择并设置样式,但仅靠CSS无法做到这一点。
例如,如果您在网站上实施了jQuery,则可以执行以下操作:
var last_visible_element = $('div:visible:last');
虽然希望你选择的div包含一个类/ ID,但在这种情况下你的代码看起来像:
var last_visible_element = $('#some-wrapper div:visible:last');
答案 1 :(得分:12)
这个问题的真正答案是,你不能这样做。
仅CSS答案的替代方案不是这个问题的正确答案,但如果您接受JS解决方案,那么您应该在这里选择一个JS或jQuery答案。
但是,正如我上面所说,真实,正确的答案是你无法在CSS中可靠地执行此操作,除非您愿意接受:not
运算符[style*=display:none]
和其他这样的否定选择器,只适用于内联样式,并且是一个总体上很差的解决方案。
答案 2 :(得分:7)
我认为不可能通过css值(显示)选择
编辑:
在我看来,在这里使用一些jquery是有意义的:
$('#your_container > div:visible:last').addClass('last-visible-div');
答案 3 :(得分: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>
答案 4 :(得分:6)
如果你可以使用内联样式,那么你可以纯粹使用CSS。
当前一个元素可见时,我正在使用它在下一个元素上做CSS:
div[style='display: block;'] + table { filter: blur(3px); }
答案 5 :(得分:2)
换句话说,你可以用javascript来做, 在Jquery中,你可以使用类似的东西:
$('div:visible').last()
*重新编辑
答案 6 :(得分:2)
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;
}
});
答案 7 :(得分:0)
尝试
div:not([style * =“ display:none”])
答案 8 :(得分:0)
如果您不再需要隐藏的元素,只需使用element.remove()
代替element.style.display = 'none';
。
答案 9 :(得分:-4)
这对我有用。
.alert:not(:first-child){
margin: 30px;
}