Mevcut olmayan CSS sınıflarını kullanabilir miyim?


260

Ben göstermek / jQuery tarafından olmayan bir CSS sınıfı aracılığıyla tam bir sütun gizlemek bir tablo var:

<table>
   <thead>
      <tr>
         <th></th>
         <th class="target"></th>
         <th></th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td></td>
         <td class="target"></td>
         <td></td>
      </tr>
      <tr>
         <td></td>
         <td class="target"></td>
         <td></td>
      </tr>
   </tbody>
</table>

Bu DOM ile bunu jQuery ile bir satırda yapabilirsiniz: $('.target').css('display','none');

Bu mükemmel çalışıyor ancak tanımlanmamış CSS sınıflarını kullanmak geçerli mi? Bunun için boş bir sınıf oluşturmalı mıyım?

<style>.target{}</style>

Herhangi bir yan etkisi var mı veya bunu yapmanın daha iyi bir yolu var mı?


9
Bu konuda yanlış bir şey görmüyorum, ancak kullanmak yerine mümkün olduğunca stil sayfasının bir parçası yapmış olurdum .css.css ile ayarlanan stiller, diğer sorunlara neden olmadan geçersiz kılmak için çok zordur, bu yüzden onlardan kaçınma eğilimindeyim.
Kevin B

8
kullanmak istediğiniz bir yan not .toggle()olarak, kodunuzda biraz daha kısa.
Matematik soğutucu

4
Visual Studio + ReSharper'da, tanımlı olmayan bir sınıf kullanırsanız, yalnızca bir yazım hatası varsa, ancak böyle durumlarda can sıkıcı olan bir uyarı verir. Bu durumda, boş stili ekleme veya uyarıyı devre dışı bırakma (veya sadece görmezden gelme) seçeneğine sahipsiniz - kişisel olarak, sadece boş stili ekliyorum. Başka bir IDE'nin benzer şekilde davranıp davranmadığını bilmiyorum.
Joe Enos

8
Bu sadece mümkün değil, aynı zamanda bazıları tarafından açıkça önerilmektedir. Senin bu yana targetjavascript en amaçlıdır, birçok insan öneki kullanmak js-yani böyle sınıfları için js-target. BTW: Hedef biraz kötü bir isim;) Daha fazla okumak için bakınız: philipwalton.com/articles/decoupling-html-css-and-javascript
k0pernikus

1
stackoverflow.com/questions/2832117/… bu yanlış anlama olmaksızın aşağı yukarı bunun bir kopyasıdır.
naught101

Yanıtlar:


491

"CSS sınıfı" yanlış adlandırmadır; classHTML öğelerine atadığınız bir özelliktir (veya komut dosyası oluşturma açısından bir özelliktir). Diğer bir deyişle, bu durumda sizin "hedef" sınıfı yüzden, HTML değil CSS sınıfları beyan yapar bu belirli elemanlarında aslında varoldukları için 'da ve biçimlendirme olduğu gibi mükemmel geçerlidir.

Bu, CSS'de kullanabilmeniz için önce HTML'de bir sınıfın olması gerektiği anlamına gelmez. Ruakh'ın yorumuna bakın. Bir seçicinin geçerli olup olmadığı tamamen seçici sözdizimine bağlıdır ve CSS ayrıştırma hatalarını ele almak için kendi kurallarına sahiptir; bunların hiçbiri işaretlemeyi hiç ilgilendirmez. Temel olarak bu, HTML ve CSS'nin geçerlilik açısından birbirinden tamamen bağımsız olduğu anlamına gelir. 1

Bunu anladıktan sonra .target, stil sayfanızda bir kural tanımlamamanın herhangi bir yan etkisi olmadığı anlaşılmaktadır . 2 Öğelerinize sınıf atarken, bu öğelere stil sayfasında, komut dosyasında veya her ikisinde birden bu sınıflara başvurabilirsiniz. İkisinin de diğerine bağımlılığı yoktur. Bunun yerine, her ikisi de işaretlemeye (veya daha doğrusu DOM temsiline) atıfta bulunur. Bu ilke, jQuery tekli astarınızda yaptığınız gibi stilleri uygulamak için JavaScript kullanıyor olsanız bile geçerlidir.

Sınıf seçicisiyle bir CSS kuralı yazdığınızda, tek söylediğiniz "Bu sınıfa ait öğelere stiller uygulamak istiyorum." Benzer şekilde, öğeleri belirli bir sınıf adına göre almak için bir komut dosyası yazdığınızda, "Bu sınıfa ait öğelerle bir şeyler yapmak istiyorum" diyorsunuz. Olsun ya da olmasın orada olan söz konusu sınıfa aittir ayrı bir konu tamamen olduğunu unsurlar.


1 Bu nedenle, bir CSS Kimlik seçici , kimliğin tam olarak bir kez mi yoksa birden çok kez mi görünmesine bakılmaksızın (E uygun olmayan bir HTML belgesi ile sonuçlanır) bağımsız olarak verilen tüm kimlikle eşleşen tüm öğelerle eşleşir .

2 Bunun gibi boş bir CSS kuralının nerede gerekli olduğunun farkında olduğum tek durum, bazı tarayıcıların bir hata sonucu diğer bazı kuralları düzgün bir şekilde uygulamayı reddetmesidir; boş bir kural oluşturmak, diğer kuralların bir nedenle uygulanmasına neden olur. Böyle bir hata örneği için bu cevaba bakınız . Ancak bu CSS tarafındadır ve bu nedenle işaretleme ile ilgisi yoktur.


5
Sınıfların CSS ile hiçbir ilgisi olmadığını fark etmem uzun zaman aldı. Ama aynı zamanda herkes fark etti ve mikro biçimler ortaya çıktı.
Konrad Rudolph

13
+1 olsa da, bu cevap yanlış bir şekilde CSS'nin yalnızca HTML'de gerçekleşen sınıflara atıfta bulunabileceğini ima edebilir. Bir sitenin, tüm sınıflarda sitewide CSS kullanması oldukça yaygındır, ancak atıfta bulunduğu bazı sınıflar her sayfada görünmese de. (Örneğin, a.extlinkbazı sayfalarda harici bağlantı bulunmasa bile sitenin harici bağlantılar için özel stilleri olabilir veya olmayabilir).
ruakh

1
@ruakh: Mükemmel nokta, teşekkürler. Konudan sapmadan orijinal, kısa cevabıma sığdırmanın bir yolunu bulamadım, ancak bağımlılık terimi kullanımının bu izlenimi nasıl vermiş olabileceğini görüyorum, bu yüzden biraz değiştirdim. Bununla birlikte, yorumunuzu referans alan ve daha fazla ayrıntı veren bir dipnot ekledim.
BoltClock

66

Stilleri olmayan sınıfları kullanmanın kötü bir etkisi yoktur. Gerçekten de, CSS'nin kullanışlılığının bir parçası, işaretlemeden ayrılması ve stil öğeleri / sınıflar / vb. ihyaç olduğu gibi.

Bunları "CSS sınıfları" olarak düşünmeyin. Bunları CSS'nin gerektiğinde kullanacağı "sınıflar" olarak düşünün.


11
+1 'Onları' CSS sınıfları 'olarak düşünmeyin. Onları "gerekiyorsa" hangi CSS de kullanmak olur "sınıfları olarak düşünün
laike9m

48

HTML5 spesifikasyonuna göre :

Sınıf özniteliği, öğenin ait olduğu çeşitli sınıfları temsil eden, boşlukla ayrılmış belirteçler kümesi olan bir değere sahip olmalıdır. ... Yazarların sınıf özniteliğinde kullanabileceği belirteçlerde ek kısıtlamalar yoktur, ancak yazarların içeriğin istenen sunumunu tanımlayan değerlerden ziyade içeriğin doğasını tanımlayan değerleri kullanmaları önerilir.

Ayrıca, sürüm 4'te :

Sınıf özelliğinin HTML'de birkaç rolü vardır:

  • Stil sayfası seçici olarak (bir yazar bir dizi öğeye stil bilgisi atamak istediğinde).
  • Kullanıcı aracıları tarafından genel amaçlı işlem için.

Kullanım durumunuz ikinci senaryoya girer ve bu da onu sınıf özniteliğini kullanmanın meşru bir örneğidir.


13
İlgili spesifikasyonları belirtmek için +1. Bunu çok yapmayı unutuyordum.
BoltClock

40

Stili olmayan bir sınıf kullanabilirsiniz, bu tamamen geçerli HTML'dir.

CSS dosyasında başvurulan bir sınıf, bir sınıfın tanımı değildir, stil verme amacıyla bir seçici kural olarak kullanılır.


25

Eğer JavaScript bir sınıfadı kullandığınızda, etmez o sınıfı bulmak için CSS bak. Doğrudan HTML koduna bakar.

Gereken tek şey, sınıf adının HTML'de olmasıdır. CSS'de olması gerekmez.

Aslında, birçok kişi , tasarımcıların ve kodlayıcılarınızın birbirlerinin sınıflarını kullanarak birbirlerinin yoluna girmeden bağımsız olarak çalışmalarına izin verdiği için, ayrı sınıfların CSS ve Javascript ile birlikte kullanılmasının iyi bir fikir olduğunu düşünüyor .

(not, yukarıdaki paragraf daha büyük projeler için açıkça daha geçerlidir, bu yüzden kendi başınıza çalışıyorsanız bu uç noktaya gitmeniz gerektiğini düşünmeyin; İkisinin tamamen ayrı olabileceği noktasını belirtmek için bahsetmiştim. )


13

CSS sınıflarını kullanmadan kullanabilirsiniz , ancak yalnızca JavaScript / jQuery kodu için CSS sınıfları ekliyorsanız js-YourClassName, ön uç geliştiricilerin öğeleri stilize etmek için bu sınıfları asla kullanmamalarını öneririz . Bu sınıfların herhangi bir zamanda kaldırılabileceğini anlamalıdırlar.


10

Sınıfı HTML'nize eklediğiniz an Sınıf tanımlanır, böylece çözümünüz tamamen iyi olur


7
Sınıfı HTML'de kullanmak onu tanımlamaz. Daha doğrusu, tanım ilgisizdir: tanımsız sınıfları kullanmanın cezası yoktur.
JAL

10

Stil sayfanızda CSS sınıflarını tanımlamanız gerekmez . Sadece iyi çalışmalı. Ancak, eklemek zarar vermez.


Bu stilleri eklemeyi söylemiyorum, isterse ona kalmış, bu stilleri desteklemeyi planlıyorsa neden olmasın? neyse gereksiz oylar için teşekkürler :)
Rameez

"O ... zarar vermeyecek" dedin, ama sonunda olacak.
Pavlo

evet zarar vermez. o boş stilleri eklemek için duyuları varsa, o zaman onları yönetmek için duyuları olacaktır. Açıkçası ben eklemek alışkanlık ... ne eklemek tavsiye ediyorum.
Rameez

8

Burada kimsenin tam olarak bahsetmediği bir şey, JavaScript'in (bu durumda jQuery tarafından desteklenmektedir) bir belgenin basamaklı stil sayfasını doğrudan değiştirememesidir. jQuery'nin css()yöntemi yalnızca eşleşen öğelerin styleözelliğini değiştirir. CSS ve JavaScript bu açıdan tamamen ilişkisizdir.

$('.target').css('display','none');.target { }CSS bildiriminizi hiç değiştirmez . Bunun yerine burada olan class, "target" olan herhangi bir öğenin şimdi şuna benzer olmasıdır:

<element class="target" style="display:none;"></element>

Bir CSS stil kuralını önceden tanımlamamanın herhangi bir yan etkisi var mı? Hiçbiri.

Bunu yapmanın daha iyi bir yolu var mı? Performans açısından, evet var!

Performans nasıl geliştirilebilir?

Bunun yerine style, her öğeyi doğrudan değiştirmek yerine, yeni bir sınıf önceden tanımlayabilir ve bunuaddClass() (başka bir jQuery yöntemi) kullanarak eşleşen öğelerinize ekleyebilirsiniz .

Dayanarak bu önceden var olan JSPerf karşılaştırır css()ile addClass(), bunu görebiliyorum addClass()çok daha hızlı aslında:

css () ve addClass () karşılaştırması

Bunu kendimiz nasıl uygulayabiliriz?

Öncelikle yeni CSS bildirimimize ekleyebiliriz:

.hidden {
    display: none;
}

HTML'niz aynı kalacak, bu önceden tanımlanmış sınıf daha sonra kullanılmak üzere basitçe yerinde.

Artık addClass()bunun yerine kullanılacak JavaScript'i değiştirebiliriz :

$('.target').addClass('hidden');

Bu kodu çalıştırırken style, eşleşen "hedef" öğelerinizin her birinin özelliğini doğrudan değiştirmek yerine , bu yeni sınıf şimdi eklenecek:

<element class="target hidden"></element>

Yeni "gizli" sınıfla, bu öğe CSS'nizde bildirilen stili devralır ve öğeniz artık görüntülenmeyecek şekilde ayarlanır.


İyi tavsiye. .css()IMO sınıflarını değiştirmek yerine nadiren kullanmak için iyi bir neden vardır .
BoltClock

6

Diğer pek çok kişi tarafından belirtildiği gibi, evet, atanmış CSS'si olmayan sınıfları kullanmak tamamen geçerlidir ve bunları 'CSS sınıfları' olarak düşünmek yerine, sınıf ve kimliğin anlambilimini sırasıyla gruplar ve bireysel öğeler olarak tanımlamanız gerekir.

Örnek vermek gerekirse önemli bir noktanın ortaya çıkmadığını hissettiğim için içeri girmek istedim. Değişken uzunluktaki öğelere görsel manipülasyonlar yapmanız gerekiyorsa (bu durumda tablo satırlarını kullanıyorsunuz), Javascript aracılığıyla bunu yapmanın maliyetinin potansiyel olarak çok pahalı olabileceğini fark etmek her zaman mantıklıdır (örneğin, binlerce satır).

Bu durumda, sütun 2'nin her zaman gizlenme potansiyeline sahip olduğunu biliyoruz (tablonuzun bilinçli bir işlevi), o zaman bu kullanım durumunu ele almak için bir CSS stili tasarlamak mantıklıdır.

table.target-hidden .target { display: none; }

Daha sonra, DOM bulma N öğelerinde gezinmek için JS kullanmak yerine, bir sınıfı (tablomuzda) değiştirmemiz gerekir.

$("table").addClass("target-hidden")

Tabloya bir kimlik atayarak bu daha da hızlı olur ve hatta :nth-childişaretlemenizi daha da azaltacak seçici kullanarak sütuna başvurabilirsiniz, ancak verimlilik hakkında yorum yapamam. Bunu yapmanın bir başka nedeni, satır içi stilden nefret etmem ve onu ortadan kaldırmak için büyük çaba harcayacağım!


1
+1 "gruplar ve tek tek öğeler" ve belge yapısının verimli kullanımı için
deltab

5

Bir HTML öğesine bir sınıf uygularsanız ve bu sınıf CSS'de tanımlanmamışsa bunun bir etkisi olmaz. Bu yaygın bir uygulamadır ve Aamir afridi'nin sınıfları sadece js için kullanıyorsanız, bunları js- ile öneklemek iyi bir uygulamadır.

Yalnızca calsses için değil, aynı zamanda html öğelerinin id özelliği için de geçerlidir.


4

Sadece öğeleri sorgulamak için sınıfları kullanmanın hiçbir problemi yoktur. Bu tür sınıf isimlerine stil için kullanılan sınıflardan ayırmak sys-için önek (örneğin, sınıfınıza ad vereceğim sys-target) verirdim. Bu, geçmişte bazı microsoft geliştiricileri tarafından kullanılan bir sözleşmeydi. Ayrıca js-bu amaçla öneki kullanma konusunda artan bir uygulama fark ettim .

Stilleri şekillendirme dışında amaçlarla kullanmaktan memnun değilseniz, roleözniteliği kullanarak aynı amaca ulaşmanızı sağlayan Role.js jQuery eklentisini kullanmanızı öneririm , böylece işaretlemenizi olarak yazabilir <td role="target">ve kullanarak sorgulayabilirsiniz $("@target"). Proje sayfasının iyi açıklaması ve örnekleri vardır. Bu eklentiyi büyük projeler için kullanıyorum çünkü sınıfları sadece şekillendirme amaçlı tutmayı seviyorum.


3

JQuery doğrulama motoruna bakın . Orada bile HTML niteliklerine doğrulama kuralları eklemek için var olmayan sınıfları da kullanıyoruz . Dolayısıyla, aslında bir stil sayfasında bildirilmeyen sınıfları kullanırken yanlış bir şey yoktur.

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.