Bộ chọn CSS có dấu chấm trong ID


96

Thông số HTML cho phép các dấu chấm (.) Trong một id:

<img id="some.id" />

Tuy nhiên, việc sử dụng quy tắc bộ chọn CSS ID sẽ không khớp chính xác:

#some.id { color: #f00; }

Thông số CSS cho Bộ chọn ID không đề cập đến trường hợp này. Vì vậy, tôi giả sử nó đang sử dụng sự kết hợp của tên thẻ và bộ chọn lớp ? Ví dụ: một quy tắc CSS của a.classNamesẽ áp dụng cho tất cả các thẻ liên kết ( <a>) có tên lớp className, như <a class="className"></a>.

Có thể có quy tắc tệp CSS bên ngoài tham chiếu đến một phần tử HTML theo id của nó có dấu chấm trong đó không?

Tôi không mong đợi vì CSS chỉ định rằng "mã định danh " CSS không bao gồm dấu chấm là một ký tự hợp lệ. Vì vậy, đây có phải là sự không phù hợp cơ bản giữa thông số kỹ thuật HTML và CSS? Có phải lựa chọn thay thế duy nhất của tôi là sử dụng một loại lựa chọn CSS khác không? Có ai thông minh hơn tôi có thể xác nhận hoặc phủ nhận điều này không?

(Tôi sẽ xóa dấu chấm khỏi thuộc tính id HTML để đơn giản hóa mọi thứ, nhưng đó là id do hệ thống tạo, vì vậy tôi không có khả năng thay đổi nó trong trường hợp này.)


Bạn có thể nói rằng đây là sự không phù hợp cơ bản giữa HTML và CSS. Tuy nhiên, vì chúng là hai ngôn ngữ khác nhau, nên không mong đợi rằng chúng trùng khớp với nhau; mã định danh HTML là mã định danh HTML trong khi mã định danh CSS là mã định danh CSS. Ngoài ra, CSS cũng có thể tạo kiểu cho các ngôn ngữ khác, không chỉ HTML (mặc dù được cấp phép, CSS đã được tạo cho HTML ngay từ đầu).
BoltClock

3
Cũng #some.idlà sử dụng sự kết hợp của ID và bộ chọn lớp.
BoltClock

ID có phải là thuộc tính duy nhất mà bạn có làm kiểu móc không? Tôi biết nó hơi lạc đề, nhưng tôi tự hỏi tại sao bạn muốn sử dụng ID thay vì img hoặc một lớp (nếu có).
Jayx

@Jayx RE "Tại sao sử dụng ID thay vì img (thẻ) hoặc một lớp?" Nó thay đổi vì nhiều lý do và tình huống. Nhưng trong trường hợp này, một phần tử cụ thể cần được tạo kiểu, không phải tất cả các hình ảnh trên trang. Một lớp có thể đã được sử dụng nếu HTML có thể được sửa đổi, nhưng trong trường hợp này, nó không thể được sửa đổi vì nó được tạo bởi một hệ thống ngoài tầm kiểm soát của chúng tôi.
Jon Adams

Câu trả lời:


194

Cổ điển. Chỉ sau khi tìm hiểu tất cả các thông số kỹ thuật viết câu hỏi, tôi đã đọc qua một số chi tiết và thấy có một ký tự thoát. Tôi chưa bao giờ cần nó trước đây, nhưng thông số CSS cho phép thoát dấu gạch chéo ngược (\) giống như hầu hết các ngôn ngữ. Bạn biết gì?

Vì vậy, trong ví dụ của tôi, quy tắc sau sẽ phù hợp:

#some\.id { color: #f00; }


8
Công việc nghiên cứu tốt. Nên có nhiều Q&A như thế này, không giống như "viết mã của tôi thay vì tôi".
Pavlo

3
nghiên cứu tốt đẹp. Tôi vừa xem qua điều này trong một ứng dụng doanh nghiệp lớn mà tôi đang làm việc. Tôi đã hoàn toàn bối rối và chưa bao giờ nhìn thấy nó trước đây. Có ích gì khi tạo id với dấu chấm trong đó ??
Anthony

1
@Anthony: Không có lý do cụ thể nào để đặt dấu chấm trong thuộc tính id HTML. Tôi đoán đôi khi tác giả chỉ muốn? Có thể trong một số trường hợp, nó có thể bị tràn ra khỏi hệ thống triển khai cơ bản có thể sử dụng các khoảng thời gian trong mã nhận dạng của mã phía máy chủ để xử lý biểu mẫu? Tôi chắc rằng mọi người đều có lý do riêng của họ; nhưng không có lý do HTML / CSS nào để bao gồm chúng.
Jon Adams

1
Cảm ơn bạn, tôi đã gặp sự cố với OpenLayers vì nó sử dụng dấu chấm trong id của nó. Ví dụ: "OpenLayers.Control.Attribution_7". Tôi đoán nó hữu ích với mã nội bộ nơi họ có thể có tên biến javascript có cùng giá trị với chính id.
Hoffmann

3
Tôi đang xem xét thêm một câu hỏi mới và viết câu trả lời của riêng mình, nhưng quyết định chỉ nhận xét ở đây. Nếu bạn đang sử dụng bộ xử lý trước Stylus, bạn cần sử dụng hai dấu gạch chéo ngược, ví dụ: #some\\.idđể thoát ký tự đặc biệt. Dấu gạch chéo ngược đầu tiên được sử dụng bởi Stylus, để lại dấu gạch chéo ngược còn lại trong CSS đã biên dịch, sẽ đạt được kết quả mong muốn được mô tả trong câu trả lời này.
markrian

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.