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 divs en la página real puede diferir (incluso los display:none).

Author: BoltClock, 2011-03-11

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');
 52
Author: Surreal Dreams,
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

 37
Author: madeinstefano,
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.

 8
Author: dudewad,
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');
 7
Author: Guillaume86,
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>

Http://jsfiddle.net/uEeaA/90 /

 6
Author: panther,
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);
}
 3
Author: Alex Grande,
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

 2
Author: eveevans,
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;
    }

});
 2
Author: martynas,
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;
}
 -3
Author: kmukku,
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