Kimliğinde nokta bulunan CSS seçici


103

HTML spesifikasyonu bir id'de noktalara (.) İzin verir:

<img id="some.id" />

Ancak, CSS kimlik seçici kuralını kullanarak olacak değil doğru maç:

#some.id { color: #f00; }

Kimlik Seçiciler için CSS spesifikasyonu bu durumdan bahsetmez. Öyleyse, bir etiket adı ve sınıf seçici kombinasyonunu kullandığını varsayıyorum ? Örneğin, bir CSS kuralı , benzeri bir sınıf adına sahip a.classNametüm bağlantı etiketlerine ( <a>) uygulanır .className<a class="className"></a>

İçinde nokta bulunan kimliğine göre bir HTML öğesine başvuran harici bir CSS dosya kuralına sahip olmak mümkün müdür?

CSS bir CSS " tanımlayıcısının " noktayı geçerli bir karakter olarak içermediğini belirttiğinden, beklemiyorum . Öyleyse bu, HTML ve CSS özellikleri arasında temel bir uyumsuzluk mu? Farklı türde bir CSS seçimi kullanmak için tek alternatifim mi? Bunu onayladığımdan veya inkar ettiğimden daha zeki biri olabilir mi?

(İşleri basitleştirmek için HTML id özniteliğinden noktayı kaldırırdım, ancak bu sistem tarafından oluşturulmuş bir kimliktir, bu nedenle bu durumda onu değiştirme yeteneğim yok.)


Bunun HTML ve CSS arasında temel bir uyumsuzluk olduğunu söyleyebilirsin. Ancak, iki farklı dil oldukları için eşleşmeleri beklenmez; bir HTML tanımlayıcısı bir HTML tanımlayıcısı iken bir CSS tanımlayıcısı bir CSS tanımlayıcısıdır. Ayrıca, CSS sadece HTML'yi değil, diğer dilleri de biçimlendirebilir (verilmesine rağmen, CSS başlangıçta HTML için yapılmıştır).
BoltClock

3
Ayrıca #some.idID ve sınıf seçici kombinasyonunu kullanıyor.
BoltClock

Kimlik, stil kancası olarak sahip olduğunuz tek özellik mi? Biraz konu dışı olduğunu biliyorum, ancak neden img veya sınıf (varsa) yerine bir kimlik kullanmak isteyeceğinizi merak ediyorum.
Jayx

@Jayx RE "Neden img (etiket) veya sınıf yerine bir kimlik kullanmalı?" Pek çok neden ve duruma göre değişir. Ancak bu durumda, sayfadaki tüm resimlere değil, belirli bir öğeye stil uygulanması gerekir. HTML değiştirilebilseydi bir sınıf kullanılabilirdi, ancak bu durumda bizim kontrolümüz dışındaki bir sistem tarafından oluşturulduğu için değiştirilemezdi.
Jon Adams

Yanıtlar:


203

Spesifikasyonları biraz daha araştırdıktan sonra, CSS spesifikasyonunun çoğu dil gibi ters eğik çizgi ( \) kaçışına izin verdiğini gördüm .

Örneğimde aşağıdaki kural eşleşir:

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

8
İyi araştırma işi. Bunun gibi daha fazla Soru-Cevap olmalı, "benim yerime kodumu yaz" gibi değil.
Pavlo

3
güzel araştırma. Ben sadece üzerinde çalıştığım büyük bir kurumsal uygulamada karşılaştım. Tamamen şaşırmıştım ve daha önce hiç görmemiştim. İçinde nokta bulunan bir kimlik oluşturmanın ne anlamı var ??
Anthony

1
@Anthony: HTML id özniteliğine nokta koymanın belirli bir nedeni yoktur. Sanırım bazen yazarlar sadece ister? Belki bazı durumlarda, form işleme için sunucu tarafı kodunun tanımlayıcılarında dönemler kullanabilecek temel uygulama sistemlerinden taşma olabilir? Eminim bunu yapan herkesin kendi nedenleri vardır; ancak bunları dahil etmenin HTML / CSS nedeni yoktur.
Jon Adams

1
Teşekkür ederim, kimliklerinde noktalar kullandığı için OpenLayers ile sorunlar yaşıyordum. Örneğin: "OpenLayers.Control.Attribution_7". Sanırım, javascript değişken adının id ile aynı değerde olmasını sağlayabilecekleri dahili koda yardımcı olur.
Hoffmann

3
Yeni bir soru eklemeyi ve kendi cevabımı yazmayı düşünüyordum, ancak burada yorum yapmaya karar verdim. Stylus ön işlemcisini kullanıyorsanız, örneğin #some\\.idözel karakterden kaçmak için iki ters eğik çizgi kullanmanız gerekir . İlk ters eğik çizgi, Kalan ters eğik çizgiyi derlenmiş CSS'de bırakarak Stylus tarafından tüketilir ve bu yanıtta açıklanan istenen sonucu sağlar.
markrian

24

Öznitelik seçiciyi şu şekilde de kullanabilirsiniz :

[id='some.id'] {
  color: #f00;
}

2
Bu bazı tarayıcılarda işe yarayabilir, ancak öznitelik seçiciler için de atılan hatalar gördüm. Hala kaçabilir .olarak, \.gerçi.
Chris Jaynes

0

İd kullandığınız için, id değerini CSS seçici olarak değil normal bir dize olarak kontrol eden document.getElementById () öğesini de kullanabilirsiniz. örneğin aşağıdakiler de işe yarar:

const myElem = document.getElementById("some.id");

Tek dezavantajı, querySelector ile yapabildiğiniz gibi, aramanın kapsamını sınırlayamazsınız, örneğin someElement.querySelector (). ancak kimlikler her zaman benzersiz olması gerektiğinden, id ile belge çapında arama geçerlidir.

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.