Làm thế nào để chọn phần tử đầu tiên, thứ hai hoặc thứ ba với một tên lớp nhất định?


78

Làm cách nào để chọn một phần tử nhất định trong danh sách các phần tử? Tôi có những thứ sau:

<div class="myclass">my text1</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<div>
    <p>more stuff</p>
</div>
<p>
    <span>Hello World</span>
</p>
<div class="myclass">my text2</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<p>
    <span>Hello World</span>
</p>
<input type=""/>
<div class="myclass">my text3</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<footer>The end</footer>

div.myclass {doing things}Rõ ràng là tôi có lớp CSS áp dụng cho tất cả, nhưng tôi cũng muốn có thể chọn div đầu tiên, thứ hai hoặc thứ ba của lớp .myclassnhư thế này, bất kể chúng ở đâu trong đánh dấu :

div.myclass:first {color:#000;} 
div.myclass:second {color:#FFF;} 
div.myclass:third {color:#006;}

Gần giống như lựa chọn chỉ mục jQuery .eq( index ), đó là những gì tôi đang sử dụng hiện tại, nhưng tôi cần một giải pháp thay thế không có tập lệnh.

Cụ thể, tôi đang tìm kiếm các bộ chọn giả, không phải những thứ như thêm một lớp khác hoặc sử dụng ID để làm cho mọi thứ hoạt động.


3
Thế còn CSS's nth-child , bạn đã thử chưa ....? Lưu ý: Điều này chỉ hoạt động trong các trình duyệt hiện đại
Sarfraz

4
Ghi chú đó dường như đồng nghĩa với "Không có IE".
extraneon

1
@extraneon: Yup, bạn hiểu đúng :)
Sarfraz

2
Điều này sẽ không hoạt động vì không có vùng chứa cha đồng nhất, đó là lý do tại sao tôi muốn chọn dựa trên sự xuất hiện của tên lớp. Tôi sẽ phải xem xét từng trường hợp và tìm ra thẻ cha, id hoặc lớp để chọn con. Việc làm này không mang lại cho tôi sự đồng nhất và khó đọc và cũng cần được cập nhật nếu các đối tượng / thuộc tính chính thay đổi.
Tumharyyaaden

1
nth-child hiện được hỗ trợ bởi IE 9+.
awilkinson

Câu trả lời:


33

Bạn có thể cuối cùng đã nhận ra điều này giữa việc đăng câu hỏi này và ngày hôm nay, nhưng bản chất của các bộ chọn khiến bạn không thể điều hướng qua các phần tử HTML không liên quan về phân cấp.

Hay nói một cách đơn giản, vì bạn đã nói trong nhận xét của mình rằng

không có vùng chứa chính thống nhất

... không thể chỉ với bộ chọn mà không sửa đổi đánh dấu theo một cách nào đó như được hiển thị trong các câu trả lời khác.

Bạn phải sử dụng .eq()giải pháp jQuery .


Vâng, tôi đã biết về các vấn đề phân cấp của css nhưng chính suy nghĩ mơ hồ mà tôi đoán đã thúc đẩy tôi đăng hàng đợi này.
Tumharyyaaden

5
Bạn không cần phải sử dụng jQuery .eq()chức năng, bạn có thể làm điều đó tốt chỉ đơn giản JavaScript: document.querySelector(".myclass")[n]trong đó n là số bạn muốn
Zach Saucier

6
@Zach Saucier: Đây là 5 năm trước. (... 4 rưỡi.)
BoltClock

5
@ZachSaucier * ahem * Bạn đang thiếu " Tất cả " trong bộ chọn truy vấn của mình 😉
KarelG

Ví dụ: document.querySelectorAll ( "class") [1]
JohnP2

64

sử dụng nth-child (số mục) EX

<div class="parent_class">
    <div class="myclass">my text1</div>
    some other code+containers...

    <div class="myclass">my text2</div>
    some other code+containers...

    <div class="myclass">my text3</div>
    some other code+containers...
</div>
.parent_class:nth-child(1) { };
.parent_class:nth-child(2) { };
.parent_class:nth-child(3) { };

HOẶC LÀ

: thứ n của loại (số mặt hàng) giống mã của bạn

.myclass:nth-of-type(1) { };
.myclass:nth-of-type(2) { };
.myclass:nth-of-type(3) { };

35
-1 Bạn (và tất cả những người ủng hộ câu trả lời này) dường như đã hiểu sai phần "một số mã + vùng chứa khác". Nó không phải là văn bản theo nghĩa đen. Đó là các yếu tố khác . Nếu bạn có bất kỳ phần tử div nào khác trong số những phần tử này, các bộ chọn của bạn sẽ ngừng hoạt động hoàn toàn.
BoltClock

@BoltClock, nhận xét của bạn ban đầu khiến tôi hiểu nhầm ... cho đến khi tôi điều tra thêm. Hãy xem "câu trả lời" của tôi trên cùng trang này thể hiện vấn đề mà (tôi nghĩ) bạn đang cố gắng chỉ ra. Cảm ơn bạn cho chuyên môn của bạn.
Andrew Willems

15

Có, bạn có thể làm điều này. Ví dụ: để tạo kiểu cho các thẻ td tạo nên các cột khác nhau của bảng, bạn có thể làm như sau:

table.myClass tr > td:first-child /* First column */
{
  /* some style here */
}
table.myClass tr > td:first-child+td /* Second column */
{
  /* some style here */
}
table.myClass tr > td:first-child+td+td /* Third column */
{
  /* some style here */
}

4
có lẽ con thứ n sẽ là một giải pháp tốt hơn: w3.org/TR/selectors/#nth-child-pseudo
David

17
-1 Câu hỏi hỏi về việc chọn phần tử thứ n của tập hợp các phần tử không liên quan với tên lớp, không phải phần tử con thứ n.
BoltClock

15

Đây không phải là một câu trả lời không phải là một câu trả lời, tức là một ví dụ cho thấy lý do tại sao một trong những câu trả lời được bình chọn cao ở trên lại thực sự sai.

Tôi nghĩ câu trả lời đó có vẻ tốt. Trên thực tế, nó đã cho tôi những gì tôi đang tìm kiếm::nth-of-type cái mà đối với hoàn cảnh của tôi, đã hiệu quả. (Vì vậy, cảm ơn vì điều đó, @Bdwey.)

Ban đầu tôi đọc nhận xét của @BoltClock (nói rằng câu trả lời về cơ bản là sai) và bác bỏ nó, vì tôi đã kiểm tra trường hợp sử dụng của mình và nó đã hoạt động. Sau đó, tôi nhận ra @BoltClock có danh tiếng hơn 300.000 (!) Và có một hồ sơ mà anh ấy tự nhận là chuyên gia CSS. Hmm, tôi nghĩ, có lẽ tôi nên nhìn kỹ hơn một chút.

Hóa ra như sau: div.myclass:nth-of-type(2)KHÔNG có nghĩa là "phiên bản thứ 2 của div.myclass". Đúng hơn, nó có nghĩa là "phiên bản thứ 2 của div và nó cũng phải có lớp 'myclass'". Đó là một sự khác biệt quan trọng khi có sự can thiệp divgiữa các div.myclasstrường hợp của bạn .

Tôi đã mất một thời gian để tìm hiểu vấn đề này. Vì vậy, để giúp đỡ những người khác con số nó ra một cách nhanh chóng hơn, tôi đã viết một ví dụ mà tôi tin rằng chứng minh khái niệm rõ ràng hơn một mô tả bằng văn bản: Tôi đã cướp h1, h2, h3h4các yếu tố để thực chất là divs. Tôi đã đặt một Alớp cho một số trong số chúng, nhóm chúng thành 3, và sau đó tô màu các trường hợp thứ nhất, thứ 2 và thứ 3 bằng cách sử dụng màu xanh lam, cam và xanh lá cây h?.A:nth-of-type(?). (Nhưng, nếu bạn đang đọc kỹ, bạn nên hỏi "trường hợp thứ nhất, thứ 2 và thứ 3 của cái gì?"). Tôi cũng đã xen vào một điểm khác biệt (tức là khác hmức) hoặc tương tự (tức là giống nhauh vào một phần tử chưa được phân loại cấp) vào một số nhóm.

Đặc biệt lưu ý, nhóm cuối cùng của 3. Ở đây, một h3phần tử chưa được phân loại được chèn vào giữa h3.Aphần tử thứ nhất và thứ hai . Trong trường hợp này, không có màu thứ 2 (tức là màu cam) xuất hiện và màu thứ 3 (tức là màu xanh lá cây) hiển thị trên trường hợp thứ 2 của h3.A. Điều này cho thấy rằng ntrong h3.A:nth-of-type(n)đang đếm các h3s, không phải h3.As.

Vâng, hy vọng rằng sẽ giúp. Và cảm ơn, @BoltClock.

div {
  margin-bottom: 2em;
  border: red solid 1px;
  background-color: lightyellow;
}

h1,
h2,
h3,
h4 {
  font-size: 12pt;
  margin: 5px;
}

h1.A:nth-of-type(1),
h2.A:nth-of-type(1),
h3.A:nth-of-type(1) {
  background-color: cyan;
}

h1.A:nth-of-type(2),
h2.A:nth-of-type(2),
h3.A:nth-of-type(2) {
  background-color: orange;
}

h1.A:nth-of-type(3),
h2.A:nth-of-type(3),
h3.A:nth-of-type(3) {
  background-color: lightgreen;
}
<div>
  <h1 class="A">h1.A #1</h1>
  <h1 class="A">h1.A #2</h1>
  <h1 class="A">h1.A #3</h1>
</div>

<div>
  <h2 class="A">h2.A #1</h2>
  <h4>this intervening element is a different type, i.e. h4 not h2</h4>
  <h2 class="A">h2.A #2</h2>
  <h2 class="A">h2.A #3</h2>
</div>

<div>
  <h3 class="A">h3.A #1</h3>
  <h3>this intervening element is the same type, i.e. h3, but has no class</h3>
  <h3 class="A">h3.A #2</h3>
  <h3 class="A">h3.A #3</h3>
</div>


1
Haha hồ sơ của tôi hơi lém lỉnh, tôi sẽ thừa nhận ... nhưng đó thậm chí không phải là vấn đề với câu trả lời mà tôi đã nhận xét - vấn đề là nó sử dụng hoàn toàn văn bản "một số mã + vùng chứa khác ..." theo nghĩa đen, khi nó rõ ràng đề cập đến các phần tử can thiệp thực tế khác, mà lẽ ra sẽ can thiệp vào các trận đấu: nth-child () (nhìn lại nó, tất cả đều bị viết sai vì một lý do khác hoàn toàn). Nhưng như bạn đã khám phá
,:

1
Ngoài ra, có thêm thông tin về: nth-child (),: nth-of-type () và các bộ chọn tùy ý trong các câu trả lời khác của tôi sau: stackoverflow.com/questions/5545649/… stackoverflow.com/questions/24657555/…
BoltClock

9

Có lẽ sử dụng bộ chọn "~" của CSS?

.myclass {
    background: red;
}

.myclass~.myclass {
    background: yellow;
}

.myclass~.myclass~.myclass {
    background: green;
}

Xem ví dụ của tôi trên jsfiddle


2
Điều này chỉ làm việc cho các yếu tố anh chị em và không phải những gì OP là yêu cầu cho (không phân biệt đánh dấu)
Zach Saucier

1
Nhưng nó rất hữu ích khi viết một bài kiểm tra đơn vị React Jest, nơi các bộ chọn giả không hoạt động. Vì vậy, cảm ơn, Netsi1964
eon

0

Sử dụng CSS nth-childvới tên lớp tiền tố

div.myclass:nth-child(1) {
  color: #000;
}

div.myclass:nth-child(2) {
  color: #FFF;
}

div.myclass:nth-child(3) {
  color: #006;
}

Điều này không hoạt động và không trả lời câu hỏi như đã nêu bởi các ý kiến ​​khác trên câu trả lời khác gợi ý :nth-child. Nếu có bất kỳ phần tử nào giữa các div, nó sẽ phá vỡ giải pháp của bạn. Vui lòng xem xét xóa hoặc cập nhật câu trả lời của bạn.
cela

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.