Un selector CSS para obtener el último div visible
Una pregunta de selector CSS difícil, no sé si es posible.
Digamos que este es el diseño HTML:
<div></div>
<div></div>
<div></div>
<div style="display:none"></div>
<div style="display:none"></div>
Quiero seleccionar el último div
, que se muestra (es decir. no display:none
) que sería la tercera div
en el ejemplo dado.
Tenga en cuenta que el número de div
s en la página real puede diferir (incluso los display:none
).
9 answers
Puede seleccionar y estilizar esto con JavaScript o jQuery, pero CSS por sí solo no puede hacer esto.
Por ejemplo, si tiene jQuery implementado en el sitio, simplemente podría hacer:
var last_visible_element = $('div:visible:last');
Aunque esperemos que tenga una clase/ID envuelta alrededor de los divs que está seleccionando, en cuyo caso su código se vería como:
var last_visible_element = $('#some-wrapper div:visible:last');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-11 13:32:20
Hay una solución css pura (CSS3) si su div está oculto usando el atributo "style"
div:not([style*="display: none"]):last-child{ /* bla */}
Tenga en cuenta el espacio entre "display:" y "none", si no puede decir exactamente si hay un espacio en el atributo o no, puede hacer el selector de esta manera:
div:not([style*="display:none"]):not([style*="display: none"]):last-child{ /* bla */}
JQuery es rey, pero las soluciones de CSS3 son dios
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-13 18:41:38
La verdadera respuesta a esta pregunta es, no puedes hacerlo.
Las alternativas a las respuestas de solo CSS no son respuestas correctas a esta pregunta, pero si las soluciones de JS son aceptables para usted, entonces debe elegir una de las respuestas de JS o jQuery aquí.
Sin embargo, como dije anteriormente, la respuesta verdadera y correcta es que no puede hacer esto en CSS de manera confiable a menos que esté dispuesto a aceptar el operador :not
con el [style*=display:none]
y otros selectores negados, que solo funciona en estilos en línea, y es un mala solución.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-21 18:21:34
Creo que no es posible seleccionar por un valor css (display)
Editar:
En mi opinión, tendría sentido usar un poco de jquery:
$('#your_container > div:visible:last').addClass('last-visible-div');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 11:39:02
Solución JS pura (eg. cuando no usas jQuery u otro framework para otras cosas y no quieres descargarlo solo para esta tarea):
<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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-06 09:08:00
Si puedes usar estilos en línea, entonces puedes hacerlo puramente con CSS.
Estoy usando esto para hacer CSS en el siguiente elemento cuando el anterior es visible:
div[style='display: block;'] + table { filter: blur(3px); }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-08 00:11:53
De otra manera, puedes hacerlo con javascript , en Jquery puedes usar algo como:
$('div:visible').last()
* reeditado
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-12 00:44:29
No es posible con CSS, sin embargo, puede hacerlo con jQuery.
DEMOSTRACIÓN DE JSFIDDLE
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 (solución anterior):
var $items = $($("li").get().reverse());
$items.each(function() {
if ($(this).css("display") != "none") {
$(this).addClass("red");
return false;
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-06 08:44:23
Esto funcionó para mí.
.alert:not(:first-child){
margin: 30px;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 19:56:16