CSS 클래스 이름 / 선택기에 어떤 문자가 유효합니까?


1203

CSS 클래스 선택기 에는 어떤 문자 / 기호가 허용 됩니까?
다음 문자는 유효하지 않지만 어떤 문자가 유효 합니까?

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


32
utf8 문자는 어떻습니까? 내가 그리스어로 입력 할 수
있듯이

9
특수 문자를 이스케이프 클래스 이름에 사용할 수 있습니다 - 귀하의 CSS 파일에 사용자가 정의 할 수 있습니다 .hello/world백 슬래시를 이스케이프 클래스 : .hello\2fworld, hello\2f world또는hello\/world
wyqydsyq

1
"이름 구문"이 아니라 여러 이름을 표현할 때 "클래스 속성 구문"에 관한 또 다른 관련 질문 입니다.
Peter Krauss

2
이모티콘을 사용할 수도 있습니다. npmjs.com/package/postcss-modules-emoji-classname
Kevin Suttle

답변:


1024

CSS 문법 에서 직접 확인할 수 있습니다 .

기본적으로 1 의 이름은 밑줄 ( _), 하이픈 ( -) 또는 문자 ( az)로 시작하고 그 뒤에 여러 하이픈, 밑줄, 문자 또는 숫자가 와야합니다. 캐치가있다 : 첫 번째 문자는 하이픈 인 경우, 두 번째 문자가 있어야합니다 2는 문자 나 밑줄, 그리고 이름이 긴 최소 2 자 이상이어야합니다.

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

즉, 이전 규칙은 W3C 사양 에서 추출한 다음과 같습니다 . :

CSS에서 식별자 (요소 이름, 클래스 및 선택기의 ID 포함)는 [a-z0-9] 및 ISO 10646 문자 U + 00A1 이상 문자와 하이픈 (-) 및 밑줄 (_) 만 포함 할 수 있습니다. ; 숫자로 시작하거나 하이픈과 숫자로 시작할 수 없습니다. 식별자는 이스케이프 문자와 ISO 10646 문자를 숫자 코드로 포함 할 수도 있습니다 (다음 항목 참조). 예를 들어 식별자 "B & W?" "B \ & W \?"로 표시 될 수 있습니다. 또는 "B \ 26 W \ 3F"입니다.

하이픈이나 밑줄로 시작하는 식별자는 일반적으로와 같이 브라우저 별 확장을 위해 예약되어 -moz-opacity있습니다.

1 이스케이프 처리 된 유니 코드 문자 (아무도 사용하지 않는)를 포함 시켜서 조금 더 복잡해졌습니다.

2 연결된 문법에 따르면, 예를 들어 --indent1, 두 개의 하이픈으로 시작하는 규칙 이 유효하지 않습니다. 그러나 실제로 이것을 보았습니다.


57
NB : W3C는 공급 업체별 CSS 확장 (예 : Mozilla 브라우저에 의해 구현 된 -moz * 클래스)을 위해 선행 '-'또는 '_'의 사용을 예약해야한다고 말합니다.
mipadi

3
이스케이프는 일반적으로 사용되지만 일반적으로 CSS 해킹의 목적으로 지원하지 않는 브라우저를 분리합니다.
bobince

5
w3counter.com/globalstats.php에 따르면 @Pim Jager의 의견을 2 년 후 업데이트하기 위해 IE6은 현재 3 % 미만의 사용자가 사용하고 있으며 IE9는 4 %, IE7은 9 %, IE8은 22 %입니다. 모든 Firefox 버전은 28 %, 모든 Chrome 버전은 17 %입니다.
Daniel Earwicker 2016 년

3
나는 이것이 오래된 대답이라는 것을 알고 있지만 CSS (적어도 2 이상)는 식별자에 {Non-ASCII} 문자를 허용합니다 .
user2864740

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". 따라서- --indent1유효하지 않으며 다음과 같이 이스케이프해야합니다 \--indent1( --예 : iOS에서 클래스가
중단됨

177

놀랍게도 대부분의 대답은 잘못되었습니다. 그것은 밝혀졌습니다 :

CSS의 CSS 클래스 이름에는 NUL을 제외한 모든 문자가 허용됩니다. (CSS에 NUL이 포함되어 있거나 (이스케이프되지 않은 경우) 결과는 정의되지 않습니다. [ CSS-characters ])

Mathias Bynens의 답변 은 이러한 이름을 사용하는 방법을 보여주는 설명데모로 연결됩니다 . CSS 코드 로 작성 하면 클래스 이름을 이스케이프해야 할 수도 있습니다. 있지만 변경되지 않습니다. 예를 들어 불필요하게 과도하게 표현 된 표현은 해당 이름의 다른 표현과 다르게 보일 수 있지만 여전히 동일한 클래스 이름을 나타냅니다.

대부분의 다른 (프로그래밍) 언어에는 변수 이름 ( "식별자")을 이스케이프하는 개념이 없으므로 변수의 모든 표현이 동일하게 표시되어야합니다. CSS에서는 그렇지 않습니다.

HTML에 포함 할 수있는 방법이 없다는 것을 참고 공백 문자 (공백, 탭, 줄 바꿈, 폼 피드와 캐리지 리턴) A의 클래스 이름 속성을 서로 때문에 그들은 이미 별도의 클래스.

따라서 임의 문자열을 CSS 클래스 이름으로 변환해야하는 경우 : NUL 및 공백을 처리하고 (CSS 또는 HTML에 따라) 이스케이프하십시오. 끝난.


7
답변의 첫 번째 줄은 "여기서 대부분의 답변은 구식이며 CSS2에만 적용됩니다"입니다.
살만 A

7
@SalmanA 내가 언급 한 답변은 처음부터 잘못되었습니다. CSS2.1, CSS2 또는 CSS1에는 적용되지 않습니다.
Robert Siemer

@RobertSiemer 좋은 점, 나는 내 의견 이동 stackoverflow.com/questions/50812118/... (이 주제에 결코 덜 관련 없음)
피터 T.을


71

귀하의 질문에 깊이 답변했습니다 : http://mathiasbynens.be/notes/css-escapes

이 기사는 또한 CSS (및 JavaScript)의 모든 문자를 이스케이프 처리하는 방법을 설명합니다. 편리한 도구 를 . 해당 페이지에서 :

요소에 ID 값을 제공 ~!@$%^&*()_+-=,./';:"?><[]{}|`#하면 선택기는 다음과 같습니다.

CSS :

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

자바 스크립트 :

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

4
@Darryl 물론 이것은 매우 극단적 인 예이지만, 이와 같은 것들이 class="404-error"유용 할 수 있습니다.
Mathias Bynens

예가 있습니다. 구문 강조 시스템의 출력을 CSS로 변환합니다. “ISO C ++ : Types ( _t / _type)” 과 같은 클래스 이름이 있습니다. 공백 만 바꾸면 유효한 클래스 이름이 있습니다.
날으는 양

웹 사이트에서 공백 문자를 백 슬래시 이스케이프 처리 할 수 ​​있다고 말합니다. 클래스 이름으로 시도하면 작동하지 않습니다. 이 예에는 공간이 없습니다. 가능합니까?
Adamarla

@Adamarla <p class="foo bar">p요소에 두 개의 클래스 ( foo, 및) 를 추가합니다 bar. 공백을 포함하는 클래스 이름을 HTML 요소에 추가하는 방법은 없습니다. 공백 문자를 이스케이프 처리하는 방법에 대한 정보는 글꼴 패밀리 이름과 같은 다른 식별자 컨텍스트에서 이러한 문자를 이스케이프 처리하는 것이 유용하기 때문에 포함되었습니다.
Mathias Bynens

3
인생에서 대부분의 것들과 마찬가지로 CSS는 "기술적으로 합법적"과 "정상적"사이에 차이가있는 것으로 보입니다.
Volksman

69

W3C 사양을 읽으십시오 . (이것은 CSS 2.1이며, 브라우저를 가정 한 적절한 버전을 찾으십시오)

편집 : 관련 단락은 다음과 같습니다

CSS에서 식별자 (요소 이름, 클래스 및 선택기의 ID 포함)는 [a-z0-9] 및 ISO 10646 문자 U + 00A1 이상 문자와 하이픈 (-) 및 밑줄 (_) 만 포함 할 수 있습니다. ; 숫자로 시작하거나 하이픈과 숫자로 시작할 수 없습니다. 식별자는 이스케이프 문자와 ISO 10646 문자를 숫자 코드로 포함 할 수도 있습니다 (다음 항목 참조). 예를 들어 식별자 "B & W?" "B \ & W \?"로 표시 될 수 있습니다. 또는 "B \ 26 W \ 3F"입니다.

편집 2 : @mipadi가 Triptych의 답변에서 지적했듯이 동일한 웹 페이지 에도이 경고 가 있습니다.

CSS에서 식별자는 '-'(대시) 또는 '_'(밑줄)로 시작할 수 있습니다. '-'또는 '_'로 시작하는 키워드 및 속성 이름은 공급 업체별 확장을 위해 예약되어 있습니다. 이러한 공급 업체별 확장은 다음 형식 중 하나 여야합니다.

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

예 :

예를 들어 XYZ 조직이 디스플레이의 동쪽에있는 테두리 색상을 설명하는 속성을 추가 한 경우 -xyz-border-east-color라고 할 수 있습니다.

다른 알려진 예 :

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

현재 또는 미래의 CSS 레벨에서 속성 또는 키워드에 초기 대시 또는 밑줄을 사용해서는 안됩니다. 따라서 일반적인 CSS 구현은 이러한 속성을 인식하지 못하고 구문 분석 오류 처리 규칙에 따라 무시할 수 있습니다. 그러나 초기 대시 또는 밑줄은 문법의 일부이므로 CSS 2.1 구현자는 공급 업체별 확장을 지원하는지 여부에 관계없이 항상 CSS 준수 구문 분석기를 사용할 수 있어야합니다.

작성자는 공급 업체별 확장을 피해야합니다


대시와 밑줄에 대한 두 번째 편집 내용을 언급했지만 명확하게 잊어 버렸습니다. 혼란을 드려 죄송합니다.
Albin

24

완전한 정규식은 다음과 같습니다.

-?(?:[_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])*

따라서 직접 사용하는 경우 " -"및 " _"를 제외한 모든 나열된 문자 는 사용할 수 없습니다. 그러나 백 슬래시 foo\~bar또는 유니 코드 표기법을 사용 하여 인코딩 할 수 있습니다 foo\7E bar.


[\200-\377]? [\178-\1114112]CSS 3에서 이스케이프 처리 할 수 ​​없습니다.
날으는 양

\377여기 실제로 잘못되었습니다. CSS2.1의 문법 스캐너 섹션 문법에 ""\ 377 "은 현재 버전의 Flex가 처리 할 수있는 가장 높은 문자 수 (10 진수 255)를 나타냅니다."\ 4177777 "( 10 진수 1114111), 이는 유니 코드 / ISO-10646에서 가능한 가장 높은 코드 포인트입니다. " 그것도 \240아니 어야합니다 \377. 나는 이것이 지금 7 살이라고 생각합니다. 그래서 그 이후로 상황이 조금 바뀌었을 것입니다.
James Donnelly

1
보다 정확한 정규식이 될 것이라고 믿습니다 -?(?:[_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 업데이트가 필요하다고 생각되면 언제든지 답변을 편집하십시오.
Gumbo

11

해결 방법을 찾는 사람의 경우 클래스가 숫자로 시작하는 경우와 같이 속성 선택기를 사용할 수 있습니다. 변화:

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

이에:

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

또한 여러 클래스가있는 경우 선택기에서 클래스를 지정해야한다고 생각합니다.

출처 :

  1. https://benfrain.com/when-and-where-you-can-use-numbers-in-id-and-class-names/
  2. 숫자로 시작하는 이름을 가진 CSS 클래스를 유효하게 만드는 해결 방법이 있습니까?

5

내 이해는 밑줄이 기술적으로 유효하다는 것입니다. 체크 아웃 :

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

"... 2001 년 초에 발표 된 사양의 정오표는 처음으로 밑줄을 합법화했습니다."

위에 링크 된 기사는 절대로 사용하지 않는다고 말한 다음 지원하지 않는 브라우저 목록을 제공합니다.이 목록은 모두 사용자 수 측면에서 적어도 중복입니다.


4

HTML5 / CSS3의 경우 클래스와 ID는 숫자로 시작할 수 있습니다.


1
이것에 대한 소스가 있습니까? 어쩌면 누락 된 것이 있지만 CSS3 선택기 사양 은 CSS 2.1 사양 의 식별자 정의 에 연결되어 선행 숫자를 허용하지 않습니다.
Ryan

11
w3.org/TR/2003/WD-css3-syntax-20030813/#characters <- 여전히 번호 등 (작동하더라도)을 선도 허용하지 않습니다
제이미 페이트

10
HTML 5를 사용하면 클래스와 ID를 숫자 (예 :)로 시작할 수 class="1a"있습니다. 그러나 CSS 식별자는 숫자로 시작할 수 없습니다 (예 : .1a작동하지 않음). 힘들게 탈출 할 수 있습니다 (예 : .\31 a또는 .\000031a).
Oriol

일반적으로 CSS에서도 작동하지만 여전히 공식적이지 않은 것처럼 보입니다. "속성 이름과 규칙 이름은 항상 식별자로, 문자 나 하이픈으로 시작하고 그 뒤에 문자가 와야하며 문자, 숫자, 하이픈 또는 밑줄을 포함 할 수 있습니다." - w3.org/TR/css3-syntax/#syntax-description
스티커

@Pangloss 그러나 클래스 이름은 속성 이름이나 규칙 이름이 아닙니다.
베넷 맥 엘위

1

@Triptych의 대답에서 다음 두 정규식 일치를 사용하여 문자열을 유효하게 만들 수 있습니다.

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

문자, 숫자, 대시 또는 밑줄이 아닌 항목을 선택하여 쉽게 제거 할 수있는 역순입니다.

^-*[0-9]+

문자열의 시작 부분에 0 또는 1 대시와 1 개 이상의 숫자가 일치하므로 쉽게 제거 할 수 있습니다.

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 : '';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.