CSS ตัวเลือกลูกคนสุดท้าย: เลือกองค์ประกอบสุดท้ายของคลาสที่เฉพาะเจาะจงไม่ใช่ลูกคนสุดท้ายในแม่


176
<div class="commentList">
   <article class="comment " id="com21"></article>
   <article class="comment " id="com20"></article>
   <article class="comment " id="com19"></article>
   <div class="something"> hello </div>
</div>

ฉันต้องการที่จะเลือก#com19?

.comment {
    width:470px;
    border-bottom:1px dotted #f0f0f0;
    margin-bottom:10px;
}

.comment:last-child {
    border-bottom:none;
    margin-bottom:0;
}

ที่ไม่ทำงานตราบใดที่ฉันมีอีกdiv.somethingเป็นลูกคนสุดท้ายที่เกิดขึ้นจริงใน commentList มันเป็นไปได้ที่จะใช้ตัวเลือกสุดท้ายเด็กในกรณีนี้เพื่อเลือกปรากฏตัวครั้งสุดท้ายของarticle.comment?

jsFiddle

คำตอบ:


229

:last-childใช้ได้เฉพาะเมื่อองค์ประกอบที่มีปัญหาเป็นลูกคนสุดท้ายของภาชนะบรรจุไม่ใช่คนสุดท้ายขององค์ประกอบเฉพาะประเภท เพื่อที่คุณต้องการ:last-of-type

http://jsfiddle.net/C23g6/3/

เป็นต่อ @ คิดเห็น BoltClock นี้เป็นเพียงการตรวจสอบที่ผ่านมาองค์ประกอบไม่องค์ประกอบสุดท้ายกับชั้นเรียนของarticle.comment

body {
  background: black;
}

.comment {
  width: 470px;
  border-bottom: 1px dotted #f0f0f0;
  margin-bottom: 10px;
}

.comment:last-of-type {
  border-bottom: none;
  margin-bottom: 0;
}
<div class="commentList">
  <article class="comment " id="com21"></article>

  <article class="comment " id="com20"></article>

  <article class="comment " id="com19"></article>

  <div class="something"> hello </div>
</div>


146
มันไม่ได้ดูที่คลาส แต่มีเพียงชนิดเท่านั้นดังนั้นหากคุณไม่มีบทความที่มีคลาสเดียวกันคุณจะได้ผลลัพธ์ที่ไม่คาดคิด
BoltClock

1
มันทำงานได้อย่างถูกต้อง อย่างไรก็ตามถ้าเราต้องการให้พวกมัน จำกัด องค์ประกอบตามชั้นเรียนมันจะไม่ทำงานอีกครั้ง jsfiddle.net/aliemreeee/a4H7f/2
Ali Emre Çakmakoğlu

12
last-of-classขึ้นอยู่กับคำตอบเหล่านี้ผมเข้าใจว่ามีวิธีการเลือกไม่มี
toobulkeh

14
ไม่ได้จนกว่า CSS เตอร์ระดับ 4 เป็นที่ยอมรับและดำเนินการโดยเบราว์เซอร์ที่คุณจะสามารถเข้าถึงและ:nth-match(selector) :nth-last-match(selector)ดูw3.org/TR/selectors4สำหรับรายละเอียดเพิ่มเติม
Chris

1
หรือค่อนข้าง:nth-last-child(An+B of selector)เป็นเช่นที่:nth-last-match()ถูกทิ้งไว้นานก่อนหน้านี้ แต่พวกเขาไม่ได้ใส่ใจที่จะปรับปรุง WD ดูstackoverflow.com/questions/21167159/css-nth-match-doesnt-work/…
BoltClock

6

หากคุณลอยองค์ประกอบคุณสามารถกลับคำสั่ง

เช่นfloat: right;แทนfloat: left;

จากนั้นใช้วิธีนี้เพื่อเลือกลูกคนแรกของชั้นเรียน

/* 1: Apply style to ALL instances */
#header .some-class {
  padding-right: 0;
}
/* 2: Remove style from ALL instances except FIRST instance */
#header .some-class~.some-class {
  padding-right: 20px;
}

นี่เป็นการใช้คลาสกับอินสแตนซ์ LAST เท่านั้นเนื่องจากตอนนี้อยู่ในลำดับที่กลับรายการ

นี่คือตัวอย่างการทำงานสำหรับคุณ:

<!doctype html>
<head><title>CSS Test</title>
<style type="text/css">
.some-class { margin: 0; padding: 0 20px; list-style-type: square; }
.lfloat { float: left; display: block; }
.rfloat { float: right; display: block; }
/* apply style to last instance only */
#header .some-class {
  border: 1px solid red;
  padding-right: 0;
}
#header .some-class~.some-class {
  border: 0;
  padding-right: 20px;
}
</style>
</head>
<body>
<div id="header">
  <img src="some_image" title="Logo" class="lfloat no-border"/>
  <ul class="some-class rfloat">
    <li>List 1-1</li>
    <li>List 1-2</li>
    <li>List 1-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 2-1</li>
    <li>List 2-2</li>
    <li>List 2-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 3-1</li>
    <li>List 3-2</li>
    <li>List 3-3</li>
  </ul>
  <img src="some_other_img" title="Icon" class="rfloat no-border"/>
</div>
</body>
</html>

หมายเหตุแม้ว่าสิ่งนี้จะไม่ทำงานหากองค์ประกอบที่ลอยอยู่ถูกผลักไปยังบรรทัดถัดไป (เช่นมีพื้นที่ไม่เพียงพอที่จะลอยในแนวนอน / ซ้าย / ขวา)
Ozzy

.some-class~.some-classใช้งานได้ดีสำหรับฉันเมื่อมีเพียง 2 องค์ประกอบที่ซ้ำกัน
Meloman

4

ฉันเดาว่าคำตอบที่ถูกต้องที่สุดคือ: ใช้:nth-child(หรือในกรณีนี้คือคู่กัน:nth-last-child) ส่วนใหญ่จะรู้จักตัวเลือกนี้โดยอาร์กิวเมนต์ตัวแรกที่จะจับช่วงของรายการตามการคำนวณด้วย n แต่สามารถใช้อาร์กิวเมนต์ที่สอง "ของ [ตัวเลือก CSS ใดก็ได้]"

สถานการณ์ของคุณสามารถแก้ไขได้ด้วยตัวเลือกนี้: .commentList .comment:nth-last-child(1 of .comment)

แต่ความถูกต้องทางเทคนิคไม่ได้หมายความว่าคุณสามารถใช้งานได้เนื่องจากตัวเลือกนี้ได้ถูกนำไปใช้ใน Safari เท่านั้น

สำหรับการอ่านเพิ่มเติม:


1

สิ่งที่ฉันคิดว่าควรได้รับการแสดงความคิดเห็นที่นี่ที่เหมาะกับฉัน:

ใช้:last-childหลาย ๆ ครั้งในสถานที่ที่จำเป็นเพื่อที่จะได้รับล่าสุดของเสมอ

ยกตัวอย่างเช่น

.page.one .page-container .comment:last-child {
  color: red;
}
.page.two .page-container:last-child .comment:last-child {
  color: blue;
}
<p> When you use .comment:last-child </p>
<p> you only get the last comment in both parents </p>

<div class="page one">
  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>

  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>
</div>

<p> When you use .page-container:last-child .comment:last-child </p>
<p> you get the last page-container's, last comment </p>

<div class="page two">
  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>

  <div class="page-container">
    <p class="comment"> Something </p>
    <p class="comment"> Something </p>
  </div>
</div>


0

แล้วโซลูชันนี้ล่ะ?

div.commentList > article.comment:not(:last-child):last-of-type
{
    color:red; /*or whatever...*/
}

@lsblsb คุณใช้articleที่นี่ดังนั้น: not (: last-child) ไม่จำเป็นสำหรับตัวอย่างที่ระบุ
ЕвгенийМасленков

เกิดอะไรขึ้นถ้าองค์ประกอบที่มีคลาสsomethingไม่อยู่ใน HTML ดั้งเดิมและถูกแทรกแบบไดนามิกhover? โซลูชันนี้จะล้มเหลวหรือไม่
Fr0zenFyr

-1

หากประเภทองค์ประกอบสุดท้ายเป็นบทความด้วยlast-of-typeจะไม่ทำงานตามที่คาดไว้

บางทีฉันอาจไม่เข้าใจวิธีการทำงาน

การสาธิต

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