Những ký tự nào là hợp lệ trong tên / bộ chọn lớp CSS?


1203

Những ký tự / ký hiệu nào được phép trong các bộ chọn lớp CSS ?
Tôi biết rằng các ký tự sau là không hợp lệ , nhưng những ký tự nào là hợp lệ ?

~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #


32
Nhân vật utf8 thì sao? Giống như tôi có thể gõ tiếng Hy Lạp
GorillaApe

9
Ký tự đặc biệt có thể được sử dụng trong tên lớp bằng cách thoát khỏi họ - trong file CSS của bạn, bạn có thể định nghĩa một .hello/worldlớp bằng cách thoát khỏi dấu chéo ngược: .hello\2fworld, hello\2f worldhoặchello\/world
wyqydsyq

1
Một câu hỏi liên quan khác, không phải về "cú pháp tên", mà về "cú pháp thuộc tính lớp" khi thể hiện nhiều tên .
Peter Krauss

2
Bạn cũng có thể sử dụng biểu tượng cảm xúc. npmjs.com/package/postcss-modules-emoji- classname
Kevin

Câu trả lời:


1024

Bạn có thể kiểm tra trực tiếp tại ngữ pháp CSS .

Về cơ bản 1 , một tên phải bắt đầu bằng dấu gạch dưới ( _), dấu gạch nối ( -) hoặc chữ cái ( a- z), theo sau là bất kỳ số dấu gạch nối, dấu gạch dưới, chữ cái hoặc số. Có một nhược điểm: nếu ký tự đầu tiên là dấu gạch nối, ký tự thứ hai phải là 2 chữ cái hoặc dấu gạch dưới và tên phải dài ít nhất 2 ký tự.

-?[_a-zA-Z]+[_a-zA-Z0-9-]*

Nói tóm lại, quy tắc trước đó dịch theo sau, được trích xuất từ ​​thông số W3C. :

Trong CSS, các mã định danh (bao gồm tên thành phần, lớp và ID trong bộ chọn) chỉ có thể chứa các ký tự [a-z0-9] và ISO 10646 ký tự U + 00A1 trở lên, cộng với dấu gạch nối (-) và dấu gạch dưới (_) ; chúng không thể bắt đầu bằng một chữ số hoặc dấu gạch nối theo sau là một chữ số. Mã định danh cũng có thể chứa các ký tự thoát và bất kỳ ký tự ISO 10646 nào dưới dạng mã số (xem mục tiếp theo). Chẳng hạn, định danh "B & W?" có thể được viết là "B \ & W \?" hoặc "B \ 26 W \ 3F".

Mã định danh bắt đầu bằng dấu gạch nối hoặc dấu gạch dưới thường được dành riêng cho các tiện ích mở rộng dành riêng cho trình duyệt, như trong -moz-opacity.

1 Tất cả đã trở nên phức tạp hơn một chút bằng cách đưa vào các ký tự unicode đã thoát (mà không ai thực sự sử dụng).

2 Lưu ý rằng, theo ngữ pháp tôi đã liên kết, một quy tắc bắt đầu bằng dấu gạch nối TWO, ví dụ: --indent1không hợp lệ. Tuy nhiên, tôi khá chắc chắn rằng tôi đã nhìn thấy điều này trong thực tế.


57
Lưu ý: W3C nói rằng việc sử dụng một '-' hoặc '_' hàng đầu nên được dành riêng cho các tiện ích mở rộng CSS dành riêng cho nhà cung cấp (ví dụ: các lớp -moz * được trình duyệt Mozilla triển khai).
mipadi

3
\-Hình ảnh thường được sử dụng, nhưng chủ yếu là cho mục đích hack CSS, cô lập các trình duyệt không hỗ trợ chúng.
bobince

5
Để cập nhật nhận xét của @Pim Joker trong hai năm sau đó, theo w3corer.com/globalstats.php IE6 hiện được sử dụng bởi ít hơn 3% người dùng, sau IE9 trên 4%, IE7 trên 9%, IE8 trên 22%. Tất cả các phiên bản Firefox có 28%, tất cả các phiên bản Chrome có 17%.
Daniel Earwicker

3
Tôi biết đây là một câu trả lời cũ, nhưng CSS (ít nhất là 2+) cho phép bất kỳ ký tự {Non-ASCII} nào trong các định danh.
dùng2864740

11
In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F". Vì vậy - --indent1không hợp lệ và cần phải được thoát như \--indent1( --ví dụ: các lớp bị phá vỡ trên iOS)
diễn ra vào

177

Tôi ngạc nhiên khi hầu hết các câu trả lời ở đây là sai. Hóa ra:

Bất kỳ ký tự nào ngoại trừ NUL đều được phép trong các tên lớp CSS trong CSS. (Nếu CSS có chứa NUL (đã thoát hoặc không), kết quả không được xác định. [ CSS-character ])

Câu trả lời của Mathias Bynens liên kết đến lời giải thíchbản demo cho thấy cách sử dụng những tên này. Được viết bằng mã CSS, một tên lớp có thể cần thoát , nhưng điều đó không thay đổi tên lớp. Ví dụ, một đại diện thoát quá mức không cần thiết sẽ trông khác với các đại diện khác của tên đó, nhưng nó vẫn đề cập đến cùng một tên lớp.

Hầu hết các ngôn ngữ (lập trình) khác không có khái niệm thoát tên biến (Số nhận dạng của Wap), vì vậy tất cả các biểu diễn của một biến phải trông giống nhau. Đây không phải là trường hợp trong CSS.

Lưu ý rằng trong HTML không có cách nào để bao gồm các ký tự khoảng trắng (dấu cách, tab, nguồn cấp dữ liệu, nguồn cấp dữ liệu biểu mẫu và trả về vận chuyển) trong một thuộc tính tên lớp , vì chúng đã tách các lớp với nhau.

Vì vậy, nếu bạn cần biến một chuỗi ngẫu nhiên thành tên lớp CSS: hãy quan tâm đến NUL và dấu cách và thoát (phù hợp với CSS hoặc HTML). Làm xong.


7
Dòng đầu tiên trong câu trả lời của bạn phải là "hầu hết các câu trả lời ở đây đã lỗi thời / chỉ áp dụng cho CSS2".
Salman A

7
@SalmanA Các câu trả lời tôi đề cập đến đã sai ngay từ đầu. Chúng không áp dụng cho CSS2.1, CSS2 và CSS1.
Robert Siemer

@RobertSiemer điểm tốt, tôi đã chuyển nhận xét của mình sang stackoverflow.com/questions/50812118/NH (không bao giờ ít liên quan đến chủ đề này)
Peter T.


71

Tôi đã trả lời sâu câu hỏi của bạn ở đây: http://mathiasbynens.be/notes/css-escapes

Bài viết cũng giải thích cách thoát bất kỳ ký tự nào trong CSS (và JavaScript) và tôi cũng đã tạo ra một công cụ tiện dụng cho việc này. Từ trang đó:

Nếu bạn định cung cấp cho một phần tử giá trị ID ~!@$%^&*()_+-=,./';:"?><[]{}|`#, thì bộ chọn sẽ trông như thế này:

CSS:

<style>
  #\~\!\@\$\%\^\&\*\(\)\_\+-\=\,\.\/\'\;\:\"\?\>\<\[\]\\\{\}\|\`\#
  {
    background: hotpink;
  }
</style>

JavaScript:

<script>
  // document.getElementById or similar
  document.getElementById('~!@$%^&*()_+-=,./\';:"?><[]\\{}|`#');
  // document.querySelector or similar
  $('#\\~\\!\\@\\$\\%\\^\\&\\*\\(\\)\\_\\+-\\=\\,\\.\\/\\\'\\;\\:\\"\\?\\>\\<\\[\\]\\\\\\{\\}\\|\\`\\#');
</script>

4
@Darryl Tất nhiên, đây là một ví dụ khá cực đoan, nhưng những thứ như class="404-error"có thể hữu ích.
Mathias Bynens

tôi có một ví dụ: tôi chuyển đổi một cú pháp tô sáng đầu ra của hệ thống sang CSS. nó có tên lớp như là ISO ISO C ++: Các loại ( _t / _type). nếu tôi chỉ thay thế khoảng trắng tôi có tên lớp hợp lệ.
cừu bay

Trên trang web của bạn, bạn nói rằng ký tự khoảng trắng có thể được dấu gạch chéo ngược thoát. Khi tôi thử nó trong một tên lớp, tôi không thể làm cho nó hoạt động. Tôi nhận thấy không có không gian trong ví dụ này. Có thể không?
Adamarla

@Adamarla <p class="foo bar">thêm hai lớp vào thành pphần: foobar. Không có cách nào (mà tôi có thể nghĩ ra) để thêm một tên lớp chứa khoảng trắng vào một phần tử HTML. Thông tin về cách thoát các ký tự khoảng trắng được bao gồm bởi vì nó hữu ích để thoát các ký tự đó trong các ngữ cảnh định danh khác, ví dụ như tên họ phông chữ.
Mathias Bynens

3
Như với hầu hết mọi thứ trong cuộc sống, dường như trong CSS có một sự khác biệt giữa "hợp pháp về mặt kỹ thuật đến cực đoan" và "lành mạnh".
Volksman

69

Đọc thông số kỹ thuật của W3C . (đây là CSS 2.1, hãy tìm phiên bản phù hợp với giả định của bạn về trình duyệt)

chỉnh sửa: đoạn có liên quan sau:

Trong CSS, các mã định danh (bao gồm tên thành phần, lớp và ID trong bộ chọn) chỉ có thể chứa các ký tự [a-z0-9] và ISO 10646 ký tự U + 00A1 trở lên, cộng với dấu gạch nối (-) và dấu gạch dưới (_) ; chúng không thể bắt đầu bằng một chữ số hoặc dấu gạch nối theo sau là một chữ số. Mã định danh cũng có thể chứa các ký tự thoát và bất kỳ ký tự ISO 10646 nào dưới dạng mã số (xem mục tiếp theo). Chẳng hạn, định danh "B & W?" có thể được viết là "B \ & W \?" hoặc "B \ 26 W \ 3F".

chỉnh sửa 2: như @mipadi chỉ ra trong câu trả lời của Triptych, có cảnh báo này , cũng trong cùng một trang web:

Trong CSS, số nhận dạng có thể bắt đầu bằng '-' (dấu gạch ngang) hoặc '_' (gạch dưới). Từ khóa và tên thuộc tính bắt đầu bằng '-' hoặc '_' được dành riêng cho các tiện ích mở rộng dành riêng cho nhà cung cấp. Các tiện ích mở rộng dành riêng cho nhà cung cấp phải có một trong các định dạng sau:

'-' + vendor identifier + '-' + meaningful name 
'_' + vendor identifier + '-' + meaningful name

Ví dụ:

Ví dụ: nếu tổ chức XYZ đã thêm một thuộc tính để mô tả màu của đường viền ở phía Đông của màn hình, họ có thể gọi nó là màu -xyz-Border-East-color.

Các ví dụ đã biết khác:

 -moz-box-sizing
 -moz-border-radius
 -wap-accesskey

Dấu gạch ngang hoặc dấu gạch dưới ban đầu được đảm bảo không bao giờ được sử dụng trong thuộc tính hoặc từ khóa theo bất kỳ cấp độ CSS hiện tại hoặc tương lai nào. Do đó, việc triển khai CSS điển hình có thể không nhận ra các thuộc tính đó và có thể bỏ qua chúng theo các quy tắc để xử lý các lỗi phân tích cú pháp. Tuy nhiên, vì dấu gạch ngang hoặc dấu gạch dưới ban đầu là một phần của ngữ pháp, người triển khai CSS 2.1 phải luôn có thể sử dụng trình phân tích cú pháp tuân thủ CSS, cho dù họ có hỗ trợ bất kỳ tiện ích mở rộng cụ thể nào của nhà cung cấp hay không.

Tác giả nên tránh các phần mở rộng dành riêng cho nhà cung cấp


Tôi đã đề cập đến chỉnh sửa thứ hai của bạn về dấu gạch ngang hàng đầu và dấu gạch dưới, nhưng quên làm rõ điều đó. Xin lỗi vì sự nhầm lẫn.
Albin

24

Biểu thức chính quy hoàn chỉnh là:

-?(?:[_a-z]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*

Vì vậy, tất cả các nhân vật được liệt kê của bạn, ngoại trừ phạm lỗi -và phạm _lỗi không được phép nếu được sử dụng trực tiếp. Nhưng bạn có thể mã hóa chúng bằng dấu gạch chéo ngược foo\~barhoặc sử dụng ký hiệu unicode foo\7E bar.


tại sao [\200-\377]? [\178-\1114112]được phép bỏ qua trong CSS 3.
cừu bay

\377đây là thực sự sai. Có một ghi chú về phần Máy quét từ điển ngữ pháp của CSS2.1, trong đó nêu rõ: "" \ 377 "đại diện cho số ký tự cao nhất mà các phiên bản hiện tại của Flex có thể xử lý (số thập phân 255). Nó nên được đọc là" \ 4177777 "( thập phân 1114111), là điểm mã cao nhất có thể có trong Unicode / ISO-10646. " Nó cũng nên từ \240là tốt, không \377. Tôi đoán bây giờ đã 7 tuổi rồi nên mọi thứ có lẽ đã thay đổi một chút kể từ đó.
James Donnelly

1
Tôi tin rằng một biểu thức chính xác thường xuyên hơn sẽ được -?(?:[_a-z]|(?![\u0000-\u0239]).*|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|(?![\u0000-\u0239]).*|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*.
James Donnelly

2
@JamesDonnelly Xin vui lòng chỉnh sửa câu trả lời của tôi nếu bạn nghĩ rằng nó cần một số cập nhật.
Gumbo

11

Đối với những người tìm kiếm một cách giải quyết, bạn có thể sử dụng một bộ chọn thuộc tính, ví dụ, nếu lớp của bạn bắt đầu bằng một số. Thay đổi:

.000000-8{background:url(../../images/common/000000-0.8.png);} /* DOESN'T WORK!! */

đến đây:

[class="000000-8"]{background:url(../../images/common/000000-0.8.png);} /* WORKS :) */

Ngoài ra, nếu có nhiều lớp, bạn sẽ cần chỉ định chúng trong bộ chọn tôi nghĩ.

Nguồn:

  1. https://benfrain.com/when-and-where-you-can-use-numbers-in-id-and- class-name /
  2. Có một cách giải quyết để làm cho các lớp CSS có tên bắt đầu bằng số hợp lệ không?

5

Hiểu biết của tôi là gạch dưới có giá trị kỹ thuật. Thủ tục thanh toán:

https://developer.mozilla.org/en/underscores_in_group_and_id_names

"... errata với đặc điểm kỹ thuật được công bố vào đầu năm 2001 đã lần đầu tiên nhấn mạnh hợp pháp."

Bài viết được liên kết ở trên nói rằng không bao giờ sử dụng chúng, sau đó đưa ra một danh sách các trình duyệt không hỗ trợ chúng, tất cả trong số đó, về mặt số lượng người dùng ít nhất, dự phòng dài.


4

Đối với các lớp và ID HTML5 / CSS3 có thể bắt đầu bằng số.


1
Bạn có một nguồn cho việc này? Có thể tôi đang thiếu một cái gì đó, nhưng bộ chọn CSS3 đặc tả liên kết đến định nghĩa định danh trong thông số CSS 2.1 không cho phép các số dẫn đầu.
Ryan

11
w3.org/TR/2003/WD-css3-syntax-20030813/#char character <- vẫn không cho phép các số dẫn đầu, v.v. (mặc dù nó hoạt động)
Jamie Pate

10
HTML 5 cho phép các lớp và ID bắt đầu bằng một số (ví dụ class="1a"). Tuy nhiên, số nhận dạng CSS không thể bắt đầu bằng một số (ví dụ: .1asẽ không hoạt động). Bạn có thể thoát khỏi nó, khó khăn (ví dụ .\31 ahoặc .\000031a).
Oriol

Mặc dù nó cũng thường hoạt động trong CSS, nhưng có vẻ như nó vẫn chưa chính thức. "Tên thuộc tính và tên theo quy tắc luôn là số nhận dạng, phải bắt đầu bằng một chữ cái hoặc dấu gạch nối theo sau là một chữ cái và sau đó có thể chứa các chữ cái, số, dấu gạch nối hoặc dấu gạch dưới." - w3.org/TR/css3-syntax/#syntax-descrip
Dán

@Pangloss Nhưng tên lớp không phải là tên thuộc tính hoặc tên theo quy tắc.
Bennett McElwee

1

Thoát khỏi câu trả lời của @ Triptych, bạn có thể sử dụng 2 kết quả khớp chính thức sau đây để tạo chuỗi hợp lệ:

[^a-z0-9A-Z_-]

Đây là một kết hợp ngược lại chọn bất cứ thứ gì không phải là chữ cái, số, dấu gạch ngang hoặc dấu gạch dưới để dễ dàng loại bỏ.

^-*[0-9]+

Điều này khớp với 0 hoặc 1 dấu gạch ngang theo sau là 1 hoặc nhiều số ở đầu chuỗi, cũng để dễ dàng loại bỏ.

Cách tôi sử dụng nó trong PHP:

//Make alphanumeric with dashes and underscores (removes all other characters)
$class = preg_replace("/[^a-z0-9A-Z_-]/", "", $class);
//Classes only begin with an underscore or letter
$class = preg_replace("/^-*[0-9]+/", "", $class);
//Make sure the string is 2 or more characters long
return 2 <= strlen($class) ? $class : '';
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.