ตัวเลือก CSS เพื่อรับ div ล่าสุดที่มองเห็นได้


161

คำถามตัวเลือก 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คน)

คำตอบ:


62

คุณสามารถเลือกและจัดรูปแบบสิ่งนี้ด้วย JavaScript หรือ jQuery แต่ CSS เพียงอย่างเดียวไม่สามารถทำได้

ตัวอย่างเช่นหากคุณมีการใช้jQueryบนไซต์คุณสามารถทำได้:

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

แม้ว่าหวังว่าคุณจะมีคลาส / ID ล้อมรอบ div ที่คุณเลือกซึ่งในกรณีนี้รหัสของคุณจะเป็นดังนี้:

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

22
คำถามชัดเจนว่าไม่มี "ตัวเลือก CSS JQuery" กล่าวว่า "ตัวเลือก CSS" นี่ควรเป็นคำตอบที่ยอมรับ = P
AgelessEssence

2
นี่คือคำตอบของคำถามดั้งเดิม ผู้ถามไม่เคยพูดถึง javascript หรือ jquery และแท็กเหล่านั้นถูกเพิ่มโดยผู้ตอบคนอื่น 1nfected - คุณต้องการ jQuery จริงหรือไม่ ถ้าเป็นเช่นนั้นโปรดระบุไว้ในคำถามของคุณ มิฉะนั้นคุณควรยอมรับคำตอบนี้แทน
jep

ฉันคิดว่า jQuery เป็นที่ยอมรับของ OP นั่นคือทางออกที่ได้รับการยอมรับหลังจากทั้งหมด
Surreal Dreams

7
Whhyyyy คือคำตอบแรก allllwaaayyysss jquery? นี่คือคำตอบจาวาสคริปต์สำหรับคำถามCSS CSS! == javascript
dudewad

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;'] + ตาราง {
  ตัวกรอง: เบลอ (3px);
}

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

โซลูชัน Pure 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

ฉันต้องการที่จะขึ้นคะแนนนี้เพียง b / c คุณลดลง jQuery - ดีกับคุณ การร้องเรียนเพียงอย่างเดียวของฉันคือ div สามารถซ่อนจากมุมมองได้หลายวิธีไม่เพียง แต่อิงตามพารามิเตอร์สไตล์ จริงอย่างรวดเร็ว: [1] ความกว้างและความสูงสามารถตั้งค่าเป็น 0, [2] ขนาดการแปลงสามารถเป็น 0, [3] และเราสามารถวางมันออกจากพื้นที่ที่สามารถดูได้
Markus


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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.