Bộ chọn con cuối cùng của CSS: chọn phần tử cuối cùng của lớp cụ thể, không phải là con cuối cùng bên trong cha mẹ?


175
<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>

Tôi muốn chọn #com19?

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

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

Điều đó không hoạt động miễn là tôi có một div.somethingđứa trẻ khác như đứa trẻ cuối cùng trong bình luận. Có thể sử dụng bộ chọn con cuối cùng trong trường hợp này để chọn giao diện cuối cùng article.commentkhông?

jsFiddle

Câu trả lời:


228

:last-childchỉ hoạt động khi phần tử trong câu hỏi là phần tử con cuối cùng của phần chứa, không phải phần tử cuối cùng của một phần tử cụ thể. Cho rằng, bạn muốn:last-of-type

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

Theo nhận xét của @ BoltClock, đây chỉ là kiểm tra articlephần tử cuối cùng , không phải phần tử cuối cùng với lớp .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
Mặc dù vậy, nó không nhìn vào lớp, chỉ có loại, vì vậy nếu bạn tình cờ có những bài viết không cùng lớp, bạn sẽ nhận được kết quả bất ngờ.
BoltClock

1
Nó hoạt động đúng. Tuy nhiên, nếu chúng ta cần chúng để thu hẹp các thành phần theo lớp, nó không hoạt động trở lại. jsfiddle.net/aliemreeee/a4H7f/2
Ali Emre Çakmakoğlu

12
dựa trên những câu trả lời này, tôi cho rằng không có cách nào để chọn last-of-class.
toobulkeh

14
cho đến khi bộ chọn CSS cấp 4 được các trình duyệt chấp nhận và triển khai, nơi bạn sẽ có quyền truy cập :nth-match(selector):nth-last-match(selector). Xem w3.org/TR/selector4 để biết thêm chi tiết.
Chris

1
Hay đúng hơn, :nth-last-child(An+B of selector)như :nth-last-match()đã bị loại bỏ từ lâu trước đó, nhưng họ không bận tâm cập nhật WD. Xem stackoverflow.com/questions/21167159/css-nth-match-doesnt-work/
mẹo

6

Nếu bạn nổi các phần tử, bạn có thể đảo ngược thứ tự

tức là float: right;thay vìfloat: left;

Và sau đó sử dụng phương thức này để chọn con đầu tiên của một lớp.

/* 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;
}

Điều này thực sự chỉ áp dụng lớp cho cá thể LAST vì giờ đây nó đã bị đảo ngược.

Đây là một ví dụ làm việc cho bạn:

<!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>

Lưu ý mặc dù điều này sẽ không hoạt động nếu các phần tử nổi được đẩy lên dòng tiếp theo (nghĩa là không đủ không gian ngang để nổi bên phải / bên trái)
Ozzy

.some-class~.some-classhoạt động tuyệt vời cho tôi khi chỉ có 2 yếu tố lặp đi lặp lại.
Meloman

4

Tôi đoán rằng câu trả lời đúng nhất là: Sử dụng :nth-child(hoặc, trong trường hợp cụ thể này, đối tác của nó:nth-last-child ). Hầu hết chỉ biết bộ chọn này bằng đối số đầu tiên của nó để lấy một loạt các mục dựa trên phép tính với n, nhưng nó cũng có thể lấy đối số thứ hai "của [bất kỳ bộ chọn CSS]".

Kịch bản của bạn có thể được giải quyết với bộ chọn này: .commentList .comment:nth-last-child(1 of .comment)

Tuy nhiên, về mặt kỹ thuật không có nghĩa là bạn có thể sử dụng nó, bởi vì bộ chọn này hiện chỉ được triển khai trong Safari.

Để đọc thêm:


1

Một cái gì đó mà tôi nghĩ nên được bình luận ở đây đã làm việc cho tôi:

Sử dụng :last-child nhiều lần ở những nơi cần thiết để nó luôn luôn là lần cuối cùng.

Lấy ví dụ này:

.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

Giải pháp này thì sao?

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

@lsblsb, Bạn sử dụng articleở đây, vì vậy: không (: con cuối) không cần thiết cho ví dụ đã cho.
Евгений Масленков 5/12/2016

Điều gì xảy ra nếu phần tử với lớp somethingkhông tồn tại trong HTML gốc và đang được chèn động hover? Giải pháp này có thất bại không?
Fr0zenFyr

-1

nếu loại phần tử cuối cùng là bài viết quá, last-of-type sẽ không hoạt động như mong đợi.

có lẽ tôi không thực sự hiểu làm thế nào nó hoạt động.

bản giới thiệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.