CSS sınıf adları / seçicilerinde hangi karakterler geçerlidir?


1203

CSS sınıfı seçicileri içinde hangi karakterlere / simgelere izin verilir ?
Aşağıdaki karakterlerin geçersiz olduğunu biliyorum , ancak hangi karakterler geçerli ?

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


32
utf8 karakterleri ne olacak? Yunan gibi
yazabilirim

9
Özel karakterler onları kaçan tarafından sınıf adlarında kullanılabilir - CSS dosyasında bir tanımlayabilirsiniz .hello/worldters eğik çizgi kaçan derse: .hello\2fworld, hello\2f worldveyahello\/world
wyqydsyq

1
Başka bir ilgili soru, "isimlerin sözdizimi" hakkında değil, birden çok ismi ifade ederken "sınıf özniteliğinin sözdizimi" hakkında .
Peter Krauss

Yanıtlar:


1024

Doğrudan CSS dilbilgisini kontrol edebilirsiniz .

Temel olarak 1 , bir adın alt çizgi ( _), kısa çizgi ( -) veya harf ( a- z) ile başlaması ve ardından istediğiniz sayıda tire, alt çizgi, harf veya sayı içermesi gerekir . Bir yakalama vardır: ilk karakter bir kısa çizgi ise, ikinci karakter 2 bir harf veya alt çizgi olmalı ve ad en az 2 karakter uzunluğunda olmalıdır.

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

Kısacası, önceki kural W3C spesifikasyonundan çıkarılan aşağıdakine çevirir . :

CSS'de tanımlayıcılar (seçicilerdeki öğe adları, sınıflar ve kimlikler dahil) yalnızca [a-z0-9] ve ISO 10646 karakterleri U + 00A1 ve üstü, artı kısa çizgi (-) ve alt çizgi (_) içerebilir ; bir rakam ya da bir tire ve ardından bir rakam ile başlayamazlar. Tanımlayıcılar, sayısal bir kod olarak çıkış karakterlerini ve herhangi bir ISO 10646 karakterini içerebilir (bir sonraki öğeye bakın). Örneğin, "B&W?" "B \ & W \?" olarak yazılabilir veya "B \ 26 W \ 3F".

Kısa çizgi veya alt çizgi ile başlayan tanımlayıcılar genellikle olduğu gibi tarayıcıya özgü uzantılar için ayrılmıştır -moz-opacity.

1 Tüm bunlar, kaçan unicode karakterlerin (hiç kimsenin gerçekten kullanmadığı) dahil edilmesiyle biraz daha karmaşık hale geldi.

2 Bağladığım gramer bilgisine göre, örneğin İKİ tire ile başlayan bir kuralın --indent1geçersiz olduğunu unutmayın. Ancak, bunu pratikte gördüğümden eminim.


57
Not: W3C, önde gelen bir '-' veya '_' kullanımının satıcıya özgü CSS uzantıları için ayrılması gerektiğini söylüyor (ör. Mozilla tarayıcıları tarafından uygulanan -moz * sınıfları).
mipadi

3
\ -Escapes yaygın olarak kullanılır, ancak genellikle çoğunlukla CSS saldırıları amacıyla desteklenmeyen tarayıcıları ayırır.
bobince

5
Göre, daha sonra iki yıl içinde @Pim Jager yorumuna güncellemek için w3counter.com/globalstats.php % 22 üzerinde,% 4 üzerinde IE9 arkasında, IE6 artık kullanıcıların% 3'den az tarafından kullanılan% 9 üzerinde IE7, IE8. Firefox'un tüm sürümleri% 28, Chrome'un tüm sürümleri% 17'dir.
Daniel Earwicker

3
Bunun eski bir cevap olduğunu biliyorum, ancak CSS (en az 2+) tanımlayıcılarda herhangi bir {ASCII} karakterine izin vermiyor .
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". Yani - --indent1geçersiz ve kaçması gerekiyor \--indent1( --örneğin sınıflar iOS'ta
kesiliyor

177

Benim için sürpriz buradaki cevapların çoğu yanlış. Şekline dönüştü:

CSS'deki CSS sınıf adlarında NUL dışında herhangi bir karaktere izin verilir. (CSS, NUL içeriyorsa (kaçarsa veya kaçmazsa), sonuç tanımsızdır. [ CSS karakterleri ])

Mathias Bynens' cevabı bağlantılar açıklama ve demolar bu isimleri nasıl kullanılacağını gösteren. Aşağı Yazılı CSS kodunda, bir sınıf adı kaçan gerekebilir , ama bu sınıf adını değiştirmez. Örneğin, gereksiz yere kaçan bir gösterim, bu adın diğer temsillerinden farklı görünecektir, ancak yine de aynı sınıf adını ifade eder.

Diğer birçok (programlama) dil kaçan değişken isimleri (“tanımlayıcılar”) kavramına sahip değildir, bu nedenle bir değişkenin tüm gösterimleri aynı görünmelidir. CSS'de durum böyle değil.

HTML dahil etmek yolu yoktur unutmayın uzay karakterler (boşluk, sekme, satır beslemeyi, form beslemeyi ve satır başı) bir de sınıf adı özniteliği birbirinden çünkü onlar zaten ayrı sınıflar,.

Bu nedenle, rastgele bir dizeyi CSS sınıf adına çevirmeniz gerekiyorsa: NUL ve boşlukla ilgilenin ve kaçın (buna göre CSS veya HTML için). Bitti.


7
Cevabınızın ilk satırı "buradaki yanıtların çoğu güncel değil / yalnızca CSS2 için geçerlidir" olmalıdır.
Salman A

7
@SalmanA Bahsettiğim cevaplar en başından beri yanlıştı. Ne CSS2.1, CSS2 ne de CSS1 için geçerli değildir.
Robert Siemer

@RobertSiemer iyi bir noktaya, yorumumu stackoverflow.com/questions/50812118/… 'e taşıdım (bu konu ile ilgili hiçbir zaman daha az ilgili değil)
Peter T.


71

Sorunuzu burada derinlemesine yanıtladım: http://mathiasbynens.be/notes/css-escapes

Makale ayrıca CSS'de (ve JavaScript'te) herhangi bir karakterden nasıl kaçacağını açıklıyor ve bunun için de kullanışlı bir araç yaptım . Bu sayfadan:

Bir öğeye kimlik değeri verirseniz ~!@$%^&*()_+-=,./';:"?><[]{}|`#, seçici şu şekilde görünür:

CSS:

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

JavaScript:

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

4
@Darryl Tabii ki, bu oldukça aşırı bir örnek, ancak benzer şeyler class="404-error"yararlı olabilir.
Mathias Bynens

bir örnek var: ben CSS için sistemin çıktısını vurgulayarak bir sözdizimi dönüştürmek. “ISO C ++: Türler ( _t / _type)” gibi sınıf adlarına sahiptir . sadece boşluk yerine i geçerli sınıf isimleri var.
uçan koyun

Web sitenizde, boşluk karakterinin ters eğik çizgiden kaçabileceğini söylüyorsunuz. Bir sınıf adında denediğimde, işe yarayamıyorum. Bu örnekte yer olmadığını fark ettim. Mümkün mü?
Adamarla

@Adamarla <p class="foo bar">için iki sınıf ekler pelemanı: foove bar. Bir HTML öğesine boşluk içeren bir sınıf adı eklemenin hiçbir yolu yoktur (aklıma gelen). Boşluk karakterlerinden nasıl kaçacağına ilişkin bilgiler dahil edildi, çünkü bu karakterlerden diğer tanımlayıcı bağlamlarda, örneğin yazı tipi ailesi adlarından kaçmak yararlıdır.
Mathias Bynens

3
Hayattaki çoğu şeyde olduğu gibi, CSS'de de "teknik açıdan aşırıya yasal" ve "aklı başında" arasında bir fark olduğu görülmektedir.
Volksman

69

W3C teknik özelliklerini okuyun . (bu CSS 2.1, tarayıcı varsayımınız için uygun sürümü bulun)

edit: ilgili paragraf aşağıdaki:

CSS'de tanımlayıcılar (seçicilerdeki öğe adları, sınıflar ve kimlikler dahil) yalnızca [a-z0-9] ve ISO 10646 karakterleri U + 00A1 ve üstü, artı kısa çizgi (-) ve alt çizgi (_) içerebilir ; bir rakam ya da bir tire ve ardından bir rakam ile başlayamazlar. Tanımlayıcılar, sayısal bir kod olarak çıkış karakterlerini ve herhangi bir ISO 10646 karakterini içerebilir (bir sonraki öğeye bakın). Örneğin, "B&W?" "B \ & W \?" olarak yazılabilir veya "B \ 26 W \ 3F".

edit 2: @mipadi'nin Triptych'in cevabında işaret ettiği gibi , aynı web sayfasında da bu uyarı var :

CSS'de tanımlayıcılar '-' (tire) veya '_' (alt çizgi) ile başlayabilir. '-' veya '_' ile başlayan anahtar kelimeler ve mülk adları satıcıya özel uzantılar için ayrılmıştır. Bu tür satıcıya özgü uzantılar aşağıdaki biçimlerden birine sahip olmalıdır:

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

Örnek (ler):

Örneğin, XYZ kuruluşu, ekranın Doğu tarafındaki kenarlığın rengini tanımlamak için bir özellik eklediyse, buna -xyz-border-east-color diyebilirler.

Bilinen diğer örnekler:

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

İlk kısa çizginin veya alt çizginin, bir mülkte veya anahtar kelimede şimdiki veya gelecekteki herhangi bir CSS seviyesi tarafından kullanılmayacağı garanti edilir. Dolayısıyla, tipik CSS uygulamaları bu özellikleri tanımayabilir ve ayrıştırma hatalarını işleme kurallarına göre bunları göz ardı edebilir. Bununla birlikte, ilk tire veya alt çizgi dilbilgisinin bir parçası olduğundan, CSS 2.1 uygulayıcıları, satıcıya özgü uzantıları destekleseler de desteklemeseler de her zaman CSS uyumlu bir ayrıştırıcı kullanabilmelidir.

Yazarlar satıcıya özel uzantılardan kaçınmalıdır


Baştaki tire ve alt çizgi ile ilgili ikinci düzenlemenize atıfta bulunuyordum, ancak bunu açıklığa kavuşturmayı unuttum. Karışıklık için özür dilerim.
Albin

24

Tam düzenli ifade:

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

Dolayısıyla, “ -” ve “ _” dışındaki tüm listelenen karakterlerinizin doğrudan kullanılması durumunda izin verilmez. Ancak bunları ters eğik çizgi foo\~barkullanarak veya unicode gösterimini kullanarak kodlayabilirsiniz foo\7E bar.


neden [\200-\377]? [\178-\1114112]CSS 3'te kaçmasına izin verilmiyor.
uçan koyun

\377işte aslında yanlış. CSS2.1'in Lexical Scanner Dilbilgisi bölümünde şu ifadeyi içeren bir not vardır: "" \ 377 ", Flex'in geçerli sürümlerinin ele alabileceği en yüksek karakter numarasını temsil eder (ondalık 255)." \ 4177777 "( ondalık 1114111), Unicode / ISO-10646'da mümkün olan en yüksek kod noktasıdır. " Ayrıca öyle de olmalı \240, değil \377. Sanırım bu şimdi 7 yaşında olsa da, o zamandan beri işler muhtemelen biraz değişti.
James Donnelly

1
Daha doğru bir düzenli ifadenin olacağına inanıyorum -?(?:[_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 Lütfen biraz güncellemeye ihtiyacı olduğunu düşünüyorsanız cevabımı düzenlemekte çekinmeyin.
Gumbo

11

Geçici çözüm arayanlar için, örneğin sınıfınız bir sayı ile başlıyorsa, bir öznitelik seçici kullanabilirsiniz. Değişiklik:

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

buna:

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

Ayrıca, birden fazla sınıf varsa, bunları seçicide belirtmeniz gerekecektir.

Kaynaklar:

  1. https://benfrain.com/when-and-where-you-can-use-numbers-in-id-and-class-names/
  2. Sayılarla başlayan adlara sahip CSS sınıflarını geçerli kılmak için bir geçici çözüm var mı?

5

Benim anlayışım alt çizginin teknik olarak geçerli olduğudur. Ödeme:

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

“... 2001 başlarında yayınlanan spesifikasyondaki hatalar, alt çizgileri ilk kez yasal hale getirdi.”

Yukarıda bağlantı verilen makalede hiçbir zaman kullanılmadığı söylenmekte, daha sonra desteklenmeyen tarayıcıların bir listesi verilmektedir ve bunların tümü, en azından kullanıcı sayısı bakımından uzun sürelidir.


4

HTML5 / CSS3 için sınıflar ve kimlikler sayılarla başlayabilir.


1
Bunun için kaynağın mevcut mu? Belki bir şey eksik, ama CSS3 seçicileri önde gelen sayılara izin vermeyen CSS 2.1 spec tanımlayıcı tanımına bağlantılar .
Ryan

11
w3.org/TR/2003/WD-css3-syntax-20030813/#characters <- yine de önde gelen sayılara vb. izin vermez (çalışıyor olsa bile)
Jamie Pate

10
HTML 5, sınıfların ve kimliklerin bir sayıyla (ör. class="1a") Başlamasına izin verir . Ancak, bir CSS tanımlayıcısı bir sayı ile başlayamaz (örneğin .1açalışmaz). Bundan kurtulabilirsiniz, zor (örneğin .\31 aveya .\000031a).
Oriol

Normalde CSS'de de çalışmasına rağmen, hala resmi değil gibi görünüyor. "Mülk adları ve kurallara uygun adlar her zaman bir harf veya kısa çizgi ve ardından bir harfle başlaması gereken ve daha sonra harf, sayı, kısa çizgi veya alt çizgi içerebilen tanımlayıcılardır." - w3.org/TR/css3-syntax/#syntax-description
Çıkartmalar

@Pangloss Ancak sınıf adları, mülk adları veya kural dışı adlar değildir.
Bennett McElwee

1

@ Triptych'in cevabından çıkarak, bir dizeyi geçerli kılmak için aşağıdaki 2 normal ifade eşleşmesini kullanabilirsiniz:

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

Bu, kolay kaldırma için harf, sayı, kısa çizgi veya alt çizgi olmayan herhangi bir şeyi seçen ters eşleşmedir.

^-*[0-9]+

Bu, bir dizginin başlangıcında 0 veya 1 tire ve ardından 1 veya daha fazla sayı ile eşleşir, ayrıca kolayca çıkarılabilir.

PHP nasıl kullanılır:

//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 : '';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.