Làm cách nào để kết hợp lớp và ID trong bộ chọn CSS?


221

Nếu tôi có div sau:

<div class="sectionA" id="content">
    Lorem Ipsum...
</div>

Có cách nào để xác định một phong cách thể hiện ý tưởng "Một div với id='content'AND class='myClass'" không?

Hoặc bạn chỉ đơn giản là đi bằng cách này hay cách khác như trong

<div class="content-sectionA">
    Lorem Ipsum...
</div>

Hoặc là

<div id="content-sectionA">
    Lorem Ipsum...
</div>

2
nếu bạn định chọn theo id thì cũng không cần phải chọn theo lớp, vì id là duy nhất nên chỉ có một yếu tố phù hợp. Vì vậy, bằng cách thêm lớp vào cùng một bộ chọn chỉ cần gõ thêm
TStamper

20
@TStamper: Không nhất thiết. Bạn chỉ nghĩ về các tài liệu tĩnh. Trong trường hợp cụ thể, bạn có thể có một img#Inboxbiểu tượng trên trang của mình thường được đặt ở độ mờ 50%. Tuy nhiên, khi người dùng có một thông báo, bạn muốn nó được đặt thành độ mờ 100% và phần phụ trợ chỉ ra điều này bằng cách thêm một activelớp vào phần tử. Trong một kịch bản như vậy, sẽ có ý nghĩa khi có một bộ chọn kết hợp cả ID và tên lớp.
Lèse majesté

@TStamper: Ngoài ra, không có bộ chọn kết hợp id + lớp cụ thể hơn mang lại cho nó nhiều trọng số / quyền ưu tiên hơn so với phiên bản id? AFAIK, nó nên. (IOW, quy tắc của bộ chọn kết hợp id + lớp sẽ ghi đè quy tắc của bộ chọn kết hợp id. (Đây là lý do / nhu cầu của tôi để tìm chủ đề này ngay bây giờ.)
govinda

Vì vậy, tôi đang có một tình huống tương tự. Ví dụ: tôi có nhiều sản phẩm có mô tả nhưng cũng muốn kiểm soát cụ thể đối với từng sản phẩm, vì vậy, tôi có thể làm: code<p id = Product_1 class = Product> Product 1 </ p> <p id = Product_2 class = Product> Product> Product 2 </ p> code Điều này để cho phép tạo kiểu chung cho tất cả các sản phẩm nhưng cũng cho phép tạo kiểu riêng cho các sản phẩm cụ thể?
Tamer Ziady 28/03/2015

Câu trả lời:


327

Trong biểu định kiểu của bạn:

div#content.myClass

Chỉnh sửa: Chúng cũng có thể giúp:

div#content.myClass.aSecondClass.aThirdClass /* Won't work in IE6, but valid */
div.firstClass.secondClass /* ditto */

và, theo ví dụ của bạn:

div#content.sectionA

Chỉnh sửa, 4 năm sau: Vì nó quá cũ và mọi người cứ tìm thấy nó: không sử dụng tagNames trong bộ chọn của bạn. #content.myClassnhanh hơn div#content.myClassvì tagName thêm một bước lọc mà bạn không cần. Sử dụng tagNames trong bộ chọn chỉ khi bạn phải!


31
Việc chỉ định rằng ID thuộc về div chỉ có thể gây bất lợi cho hiệu suất kết xuất (mặc dù không đáng kể lắm) mà không có bất kỳ lợi ích nào cho nó vì ID đã là duy nhất. Thay vào đó tôi sẽ đi với # content.myClass để làm cho nó sạch sẽ.
mystrdat

3
div.class#idnên tương đương mặc dù ít được đề nghị; sử dụng các phần độc đáo hơn của bộ chọn trước.
SF.

1
Vâng cảm ơn cho nỗ lực của bạn, thậm chí sau nhiều năm :). Vẫn giúp những kẻ như tôi. Chỉ cần sử dụng nó cho dự án của tôi. Nâng cao cho chắc chắn.
C4d

76

Có sự khác biệt giữa #header .callout#header.callouttrong css.

Đây là "tiếng Anh đơn giản" của #header .callout:
Chọn tất cả các thành phần có tên lớp calloutlà hậu duệ của thành phần có ID là header.

#header.calloutcó nghĩa là:
Chọn phần tử có ID headervà cũng là tên lớp của callout.

Bạn có thể đọc thêm ở đây thủ thuật css


Tôi đã mắc lỗi này với khoảng trắng: #id. Class vs # id. Class
ERJAN

5

Không có gì sai khi kết hợp id và một lớp trên một yếu tố, nhưng bạn không cần phải xác định nó theo cả hai quy tắc. Nếu bạn thực sự muốn, bạn có thể làm:

#content.sectionA{some rules}

Bạn không cần divtrước ID như những người khác đã đề xuất.

Nói chung, các quy tắc CSS dành riêng cho thành phần đó phải được đặt cùng với ID và các quy tắc này sẽ có trọng số lớn hơn so với các quy tắc chỉ của lớp. Các quy tắc được chỉ định bởi lớp sẽ là các thuộc tính áp dụng cho nhiều mục mà bạn không muốn thay đổi ở nhiều nơi bất cứ lúc nào bạn cần điều chỉnh.

Điều đó có nghĩa là:

 .sectionA{some general rules here}
 #content{specific rules, and overrides for things in .sectionA}

Có lý?


4

Nói chung, bạn không cần phải phân loại một yếu tố được chỉ định bởi id, vì id luôn là duy nhất, nhưng nếu bạn thực sự cần, thì những điều sau đây sẽ hoạt động:

div#content.sectionA {
    /* ... */
}

1

Bạn có thể kết hợp ID và Class trong CSS, nhưng ID được dự định là duy nhất, vì vậy việc thêm một lớp vào bộ chọn CSS sẽ vượt quá khả năng của nó.


Đó là một điểm hay. Tôi đang suy nghĩ nếu có thể bạn có một tập hợp các lớp rất chung (thiết lập những thứ như nổi, chiều cao / chiều rộng, có thể những thứ như phông chữ) và bạn muốn ghi đè lên một cái gì đó trong chúng trong trường hợp ngoại lệ duy nhất này?
ajm

5
Trừ khi bạn sử dụng cùng một bản định kiểu với các trang khác nhau. :-)
Patrick McElhaney

5
Một ví dụ khác: khi các lớp được thêm động bằng Javascript (# tùy
chọnFields.en bật

Ngay cả khi bạn sử dụng cùng một biểu định kiểu với các trang khác nhau, tốt hơn là nên đặt một lớp trên thân hoặc có một kiểu cho ID và sau đó tách các định nghĩa lớp cho các lớp với các kiểu ghi đè phù hợp.
Eric Wendelin

Vâng, tôi nghĩ rằng nó là khá phổ biến để làm điều này. ví dụ: li # someTab.state-
select

1

sử dụng: tag.id ; tag#classtrong các biến thẻ trong css của bạn.


1
Tôi nghĩ rằng bạn đã trộn nó lên một chút - tag. Class và tag # id, không?
Harijs Krūtainis

0

Id được cho là rộng tài liệu duy nhất, vì vậy bạn không cần phải chọn dựa trên cả hai. Bạn có thể gán một phần tử nhiều lớp mặc dù vớiclass="class1 class2"


1
Lớp học có thể thay đổi. Mỗi ví dụ, bạn có thể có div # id.active và div # id.inactive.
Daniel Moura

đủ công bằng, khi nghĩ về nó, tôi đã sử dụng chức năng này, nhưng tôi đã hiểu sai hành vi mong muốn là gì.
Ben Hughes

0

Tôi nghĩ rằng tất cả các bạn đều sai. ID so với Class không phải là một câu hỏi về tính đặc hiệu; chúng có cách sử dụng logic hoàn toàn khác nhau.

ID nên được sử dụng để xác định các phần cụ thể của trang: tiêu đề, thanh điều hướng, bài viết chính, phân bổ tác giả, chân trang.

Các lớp nên được sử dụng để áp dụng các kiểu cho trang. Giả sử bạn có một trang tạp chí chung. Mỗi trang trên trang web sẽ có cùng các yếu tố - tiêu đề, điều hướng, bài viết chính, thanh bên, chân trang. Nhưng tạp chí của bạn có các phần khác nhau - kinh tế, thể thao, giải trí. Bạn muốn ba phần có ngoại hình khác nhau - kinh tế bảo thủ và vuông vắn, thể thao hành động, giải trí tươi sáng và trẻ trung.

Bạn sử dụng các lớp học cho điều đó. Bạn không muốn phải tạo nhiều ID - # kinh tế-bài viết và # thể thao-bài viết và # giải trí-bài viết. Điều đó không có ý nghĩa. Thay vào đó, bạn sẽ định nghĩa ba lớp, .economics, sports và .enter Earn, sau đó xác định các id #nav, #article và #footer cho mỗi id.


Bạn thực sự có thể sử dụng các thẻ HTML ngữ nghĩa thay vì ID cho hầu hết các yếu tố bạn đề cập. Các thẻ tiêu đề, chân trang, điều hướng, phần vv tồn tại vì một lý do.
Walter Schwarz

Nhưng thực sự bạn chỉ nên sử dụng ID cho các yếu tố nên là duy nhất, singletons. Nhưng ngay cả khi đó nó chỉ thực sự hữu ích nếu bạn cần truy cập vào phần tử đó thông qua JavaScript, bởi vì việc sử dụng ID khiến CSS của bạn quá cụ thể và khó có thể hợp nhất với CSS và / hoặc HTML khác. Ngoài ra còn có lập luận rằng ID nhanh hơn các lớp, nhưng sự khác biệt thực sự không đáng kể.
Walter Schwarz

-1
.sectionA[id='content'] { color : red; }

Sẽ không hoạt động khi doctype là html 4.01 mặc dù ...

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.