Làm cách nào để nhắm mục tiêu các phần tử có thuộc tính có bất kỳ giá trị nào trong CSS?


89

Tôi biết rằng tôi có thể nhắm mục tiêu các phần tử có thuộc tính cụ thể trong CSS, ví dụ:

input[type=text]
{
    font-family: Consolas;
}

Nhưng liệu có thể nhắm mục tiêu các phần tử có thuộc tính của bất kỳ giá trị nào (ngoại trừ không có gì, tức là khi thuộc tính chưa được thêm vào phần tử) không?

Đại khái như:

a[rel=*]
{
    color: red;
}

Cái nào sẽ nhắm mục tiêu thẻ đầu tiên và <a>thẻ thứ ba trong HTML này:

<a href="#" rel="eg">red text</a>
<a href="#">standard text</a>
<a href="#" rel="more">red text again</a>

Tôi nghĩ là có thể vì theo mặc định, cursor: pointerdường như được áp dụng cho bất kỳ <a>thẻ nào có giá trị cho hrefthuộc tính của nó .

Câu trả lời:


119

Phần sau sẽ khớp với bất kỳ thẻ liên kết nào có relthuộc tính được xác định:

a[rel]
{
    color: red;
}

http://www.w3.org/TR/CSS2/selector.html#pattern-matching


Cập nhật: Để giải thích cho trường hợp @vsync được đề cập, trong phần nhận xét (phân biệt giữa các giá trị emtpy / không trống), bạn có thể kết hợp :not lớp giả CSS :

a[rel]:not([rel=""])
{
    color: red;
}

https://developer.mozilla.org/en-US/docs/Web/CSS/:not


Điều này cũng đặt mục tiêu giá trị sản phẩm nào, và đôi khi bạn muốn bất kỳ giá trị, ngoại trừempty
vsync

3
Ví dụ cuối cùng nên làa[rel]:not( [rel=""] )
cameronjonesweb

Thật không may, notmẹo cuối cùng lại không động. Tôi đã thử làm điều này để đánh dấu inputcác trường khi chúng có giá trị so với khi chúng không có giá trị và có vẻ như khi trang tải, kiểu sẽ không được đánh giá lại nếu một giá trị được nhập vào (hoặc khi nó ở đó để bắt đầu và nó đã bị xóa).
Christopher Schultz

47

Có trong bộ chọn CSS 3 có một số bộ chọn thuộc tính .

Ví dụ

[att] Đại diện cho một phần tử có thuộc tính att, bất kể giá trị của thuộc tính.

[att = val] Đại diện cho một phần tử có thuộc tính att có giá trị chính xác là "val".

[att ~ = val] Đại diện cho một phần tử có thuộc tính att có giá trị là danh sách các từ được phân tách bằng khoảng trắng, một trong số đó chính xác là "val". Nếu "val" chứa khoảng trắng, nó sẽ không bao giờ đại diện cho bất cứ thứ gì (vì các từ được phân tách bằng dấu cách). Ngoài ra nếu "val" là chuỗi trống, nó sẽ không bao giờ đại diện cho bất cứ thứ gì.

[att ^ = val] Đại diện cho một phần tử có thuộc tính att có giá trị bắt đầu bằng tiền tố "val". Nếu "val" là chuỗi trống thì bộ chọn không đại diện cho bất cứ thứ gì.

[att $ = val] Đại diện cho một phần tử có thuộc tính att có giá trị kết thúc bằng hậu tố "val". Nếu "val" là chuỗi trống thì bộ chọn không đại diện cho bất cứ thứ gì.

[att * = val] Đại diện cho một phần tử có thuộc tính att có giá trị chứa ít nhất một phiên bản của chuỗi con "val". Nếu "val" là chuỗi trống thì bộ chọn không đại diện cho bất cứ thứ gì.


1

Nên thêm rằng nếu một trình duyệt đặt một thuộc tính theo mặc định, bạn có thể cần phải xử lý. Điều này có vẻ không phải là một vấn đề trong brosers "hiện đại", tuy nhiên, đây là một vấn đề mà tôi đã thấy, vì vậy hãy đảm bảo kiểm tra hiệu suất trên nhiều trình duyệt.

Ví dụ: tôi phát hiện ra rằng trong IE trước 9, colSpan được đặt cho tất cả các TD trong một Bảng, vì vậy bất kỳ ô nào đều có giá trị colspan ẩn là 1.

Vì vậy, nếu bạn đang nhắm mục tiêu "bất kỳ TD nào có thuộc tính colspan" mà bạn áp dụng trong webdoc của mình, ngay cả khi td không có thuộc tính colspan được đặt, chẳng hạn như bất kỳ TD nào là một ô duy nhất, sẽ nhận được kiểu css. IE nhỏ hơn 9 về cơ bản sẽ tạo kiểu cho tất cả!

Lý do duy nhất để quan tâm đến vấn đề này là tất cả những người dùng XP còn lại không thể nâng cấp lên IE8.

Vì vậy, đối với Ví dụ, tôi có một nhóm các bảng mà nội dung có thể chuyển từ cuối sang cuối, để trống từ 1 đến 7 ô ở cuối hoặc đầu.

Tôi muốn áp dụng màu cho bất kỳ ô trống nào ở cuối hoặc đầu bằng cách sử dụng thuộc tính colspan. Sử dụng phần sau sẽ không hoạt động trong IE dưới 9

#my td[colspan] {background-color:blue;}

... tất cả TD sẽ được tạo kiểu (buồn cười vì kiểu thuộc tính có điều kiện được cho là vượt trội trong IE, nhưng tôi lạc đề ...).

Việc sử dụng các thao tác sau đây hoạt động trên tất cả các trình duyệt khi tôi đặt giá trị của colspan thành 'duy nhất' cho bất kỳ ô đơn lẻ nào / TD mà tôi muốn đưa vào sơ đồ tạo kiểu, tuy nhiên nó là 'hack' và sẽ không xác thực đúng cách ...

#my td[colspan="single"] {background-color:blue;} /* 'single' could be anything */
#my td[colspan="2"] {background-color:blue;}
#my td[colspan="3"] {background-color:blue;}
#my td[colspan="4"] {background-color:blue;}
#my td[colspan="5"] {background-color:blue;}
#my td[colspan="6"] {background-color:blue;}
#my td[colspan="7"] {background-color:blue;}

Ngoài ra, bạn sẽ có thể giải quyết vấn đề một cách thích hợp hơn bằng cách sử dụng kiểu có điều kiện bằng cách sử dụng "if lt IE 9" để ghi đè. Đó sẽ là cách chính xác để làm điều này, chỉ cần lưu ý rằng bạn phải ẩn "css được xây dựng đúng cách" khỏi IElt9 trong quá trình này và tôi nghĩ rằng cách thích hợp duy nhất để làm điều đó là với các bảng định kiểu chọn lọc.

Hầu hết chúng ta đều đã làm điều đó, nhưng bất kể, bạn vẫn nên xem xét và kiểm tra xem một trình duyệt có áp dụng thuộc tính tự động khi nó không thấy thuộc tính nào hay không và cách nó có thể xử lý cú pháp không đúng của bạn để tạo kiểu trên các giá trị thuộc tính.

(btw, colspan chỉ xảy ra là chưa có trong thông số kỹ thuật css [kể từ css3], vì vậy ví dụ này không có lỗi xác thực.)


1
> Lý do duy nhất để lo lắng về vấn đề này là tất cả những người dùng XP còn lại không thể nâng cấp lên IE8. Bạn sẽ nghĩ rằng, cho đến khi bạn chạy vào môi trường doanh nghiệp với IE8 trên Win7.
Bob
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.