마지막으로 보이는 div를 얻는 CSS 선택기


161

까다로운 CSS 선택기 질문입니다. 가능한지 모릅니다.

이것이 HTML 레이아웃이라고 가정 해 봅시다.

<div></div>
<div></div>  
<div></div>  
<div style="display:none"></div>
<div style="display:none"></div>  

주어진 예제에서 세 번째 로 div표시되는 last를 선택하고 싶습니다 (예 : not display:none) div. 마음 당신은의 수를 div실제 페이지들 (심지어 다를 수 있습니다 display:none사람을).

답변:


62

JavaScript 또는 jQuery로이를 선택하고 스타일을 지정할 수 있지만 CSS만으로는이를 수행 할 수 없습니다.

예를 들어, 사이트에 jQuery를 구현 한 경우 다음을 수행 할 수 있습니다.

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

희망하는 것은 선택한 div를 감싸는 클래스 / ID를 갖지만 코드의 모양은 다음과 같습니다.

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

22
문제는 분명 더 "JQuery와 CSS 선택기", "A CSS 선택기"이 허용 대답 = P해야 말한다 말한다
AgelessEssence

2
이것은 실제로 원래 질문에 대한 답입니다. 질문자는 자바 스크립트 또는 jquery를 언급하지 않았으며 해당 태그는 다른 응답자가 추가했습니다. 1nfected-실제로 jQuery를 원하십니까? 그렇다면 실제로 질문에 넣으십시오. 그렇지 않으면 대신이 답변을 수락해야합니다.
jep

jQuery가 OP에 적합하다고 생각합니다. 그것은 결국 받아 들여진 해결책이었습니다.
초현실적 인 꿈

7
Whhyyyy는 첫 번째 답변 allllwaaayyysss jquery입니까? 이것은 CSS 질문에 대한 자바 스크립트 답변 입니다. CSS! == javascript
dudewad

2
@dudewad : 첫 번째 문장의 마지막 부분을보십시오 : "CSS만으로는 이것을 할 수 없습니다." 대답은 눈에 띄는 대안없이 그것을 그대로 두거나 대안을 제공 할 수 있습니다. 그러나이 답변은 CSS가 요청 된 작업을 수행 할 수 없다는 것을 실제로 지적하면서 적어도 실사를했습니다 ( 왜 그런지 정교하지는 않지만 ). 반면에 질문의 CSS 특성을 인정하지 않고 JavaScript 솔루션을 사용하는 대답 비판 할 가치가 있습니다.
BoltClock

23

이 질문에 대한 진정한 대답은 할 수 없다는 것입니다. CSS 전용 답변의 대안은이 질문에 대한 정답은 아니지만 JS 솔루션을 수용 할 수있는 경우 여기에서 JS 또는 jQuery 답변 중 하나를 선택해야합니다. 그러나 위에서 말했듯이 진실하고 정확한 대답은 인라인 스타일에서만 작동하며 전반적으로 열악한 부정적 선택자를 사용 하여 연산자를 기꺼이 받아들이지 않으면 CSS 에서이 작업을 안정적으로 수행 할 수 없다는 것입니다 해결책.:not[style*=display:none]


첫째, 나는 당신에게 동의하지만 :not당신이 언급 한대로 운영자 를 사용하면 특정 상황에서 작동 할 수 있다고 생각합니다 . 예를 들어, 내가 JS 조건부 :) 다음 인라인 스타일을 추가하고, 따라서 솔루션이 실제로 완벽하게 작동 요소가 숨어있는 곳 내 상황에 완벽하게 작동
doz87을

1
글쎄, 나는 작동하는 것이 작동하는 것 같아요 :) 나는 약간의 이상 주의자이며 물건이 가장 좋지 않은 곳을 강조하고 싶습니다. '해킹 된 것'과 그렇지 않은 것을 구별하는 것이 중요합니다. 그것은 우리 모두를 더 나은 프로그래머로 만듭니다.
dudewad

예, 들었습니다.이 솔루션을 OP 쿼리에 대한 CSS 전용 솔루션으로 사용해서는 안된다는 데 동의합니다 .JS와 함께 사용하면 매우 효과적이라고 생각합니다.
doz87

CSS 클래스를 사용하여 인라인 스타일 대신 요소를 숨길 수도 있습니다. 이 경우 해당 숨기기 클래스의 선택기를 무효화 할 수 있습니다. 둘 다 동일한 CSS 클래스에 의해 설정되므로 숨겨진 항목을 항상 선택합니다. 따라서 귀하의 답변은 올바른 방향으로 진행되지만 충분하지 않습니다. :-)
ygoe

8

인라인 스타일을 사용할 수 있다면 CSS만으로도 인라인 스타일을 사용할 수 있습니다.

이전 요소가 표시되면 다음 요소에서 CSS를 수행하는 데 이것을 사용하고 있습니다.

div [style = 'display : block;'] + 테이블 {
  필터 : blur (3px);
}

1
나는 [style*='display: block']그것을 가질 수 있기 때문에 display: block !important;또는 그것으로 바꿀 것입니다 <div style="display: block">:-)
OZZIE

그것은이 같은 CSS 파일에 나를 위해 작동 .btn-group > .btn.d-none + .btn"부트 스트랩의 입력 그룹에 사용 (
장 - 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를 떨어 뜨린 b / c에 투표하고 싶었다. 내 유일한 불만은 div가 스타일 매개 변수를 기반으로하지 않고 여러 가지 방법으로 숨길 수 있다는 것입니다. 매우 빠름 : [1] 너비와 높이를 0으로 설정할 수 있고, [2] 변환 배율을 0, [3]으로 할 수 있으며 볼 수있는 영역에서 벗어날 수 있습니다.
Markus


2

다른 방법으로, 당신은 javascript로 그것을 할 수 있습니다, Jquery에서 당신은 다음과 같은 것을 사용할 수 있습니다 :

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

* 재 편집


2

CSS로는 불가능하지만 jQuery로도 가능합니다.

JS 피들 데모

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");
martynas


-6

이것은 나를 위해 일했습니다.

.alert:not(:first-child){
    margin: 30px;
}

3
당신은 질문에 대답하지 않습니다
Serginho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.