Селектор CSS, щоб отримати останній видимий роздільник


161

Складне запитання щодо вибору 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які є).

Відповіді:


62

Ви можете вибрати та стилювати це за допомогою JavaScript або jQuery, але лише CSS не може цього зробити.

Наприклад, якщо у вас на сайті реалізований jQuery , ви можете просто зробити:

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

Хоча, сподіваємось, у вас буде клас / ідентифікатор, обгорнутий навколо вибраних вами divs, і в такому випадку ваш код буде виглядати так:

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

22
у запитанні чітко сказано, що "селектор JQuery CSS", "A SELECTOR CSS", це має бути прийнято ВІДПОВІДЬ = P
AgelessEssence

2
Це, справді, відповідь на оригінальне запитання. Запитуючий жодного разу не згадував JavaScript або jquery, і ці теги додав інший відповідь. 1nfected - ти насправді хочеш jQuery? Якщо так, то, будь ласка, поставте це у своєму запитанні. В іншому випадку слід замість цього прийняти цю відповідь.
jep

Я думаю, що jQuery прийнятний для ОП. Це було прийняте рішення.
Сюрреалістичні сни

7
Whhyyyy - це перша відповідь allllwaaayyysss jquery? Це відповідь javascript на питання CSS . CSS! == javascript
вдень

2
@dudewad: Дивіться останню частину першого речення: "але CSS сам не може цього зробити". Відповідь може залишити це на цьому, не маючи альтернативи на виду ... або запропонувати альтернативу. Але ця відповідь принаймні зробила належну ретельність, фактично стверджуючи, що CSS не може робити те, що просять (хоч і не пояснює чому ). З іншого боку, відповідь, яка просто виходить на рішення JavaScript, не визнаючи характер CSS питання , варто критикувати.
BoltClock

23

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


По-перше, я згоден з вами, але я думаю, що використання :notоператора, як ви заявили, може працювати в певних обставинах. Наприклад, це ідеально підходить для моєї ситуації, коли у мене JS умовно приховує елементи, які потім додають стилі вбудованих даних, і, отже, ваше рішення насправді прекрасно працює :)
doz87

1
Ну, тоді я здогадуюсь, що працює: :) Я просто ідеаліст і люблю наголошувати на тому, що речі не найкращі, важливо вміти розрізняти, що таке "хакі", а що ні. це робить усіх нас кращими програмістами.
dudewad

Так, я чую, я погоджуюся, що це рішення не повинно використовуватися як єдине рішення css для запиту OP, я думаю, що це працює дуже добре, якщо він використовується разом із JS.
doz87

Ви також можете використовувати клас CSS для приховування елементів (замість стилю вбудованого тексту). Якщо це так, ви можете так само добре спростувати селектор для цього класу приховування. Це завжди вибирає те саме, що приховано, оскільки обидва встановлені одним класом CSS. Тож ваша відповідь іде в правильному напрямку, але недостатньо далеко. :-)
ygoe

8

Якщо ви можете використовувати вбудовані стилі, то ви можете це робити виключно за допомогою CSS.

Я використовую це для того, щоб робити CSS на наступному елементі, коли видно попередній:

div [style = 'display: block;'] + таблиця {
  фільтр: розмиття (3 пікселя);
}

1
Я б змінив його, [style*='display: block']оскільки він міг би мати display: block !important;або просто <div style="display: block">:-)
OZZIE

Він працює для мене у файлі css, подібному до цього .btn-group > .btn.d-none + .btn(використовується для вхідних груп bootstrap "
Jean-Charbel VANNIER

7

Я думаю, що неможливо вибрати значення css (відображення)

редагувати:

на мою думку, було б доцільно використати трохи jquery тут:

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

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>

http://jsfiddle.net/uEeaA/90/


Дякую за фрагмент, єдина відповідь, що не jQuery! Однак це не спрацьовує при наявності декількох батьківських елементів для звернення до: jsfiddle.net/uEeaA/100 - чи можете ви допомогти мені створити рішення для інших, що працюють? Мені це потрібно, іншим це потрібно, тому, будь ласка, допоможіть :)
mnsth

Я усвідомлюю, що це стара тема, але для будь-яких майбутніх відвідувачів ви можете зробити щось у порядку jsfiddle.net/uEeaA/103
xec

Я хотів проголосувати за це просто б / с, коли ви кинули jQuery - добре для вас. Моя єдина скарга - div можна приховати від перегляду багатьма способами, а не лише на основі параметру стилю. Справжній швидкий: [1] ширину та висоту можна встановити на 0, [2] масштаб трансформації може бути 0, [3], і ми можемо розмістити його поза зоною видимості.
Маркус


2

по-іншому, ви можете це зробити з javascript, в Jquery ви можете використовувати щось на кшталт:

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

* reedited


2

З 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;
    }

});

3
Це дуже багато jQuery для $('li:visible:last').addClass('red').
alex

Так? $('li').not(':hidden').last().addClass("red");
мартінас

0

Якщо вам більше не потрібні сховані елементи, просто використовуйте element.remove()замість них element.style.display = 'none';.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.