Puis-je utiliser des classes CSS non existantes?

260

J'ai une table où je montre / cache une colonne complète de jQuery via une classe CSS qui n'existe pas:

<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>

Avec ce DOM, je peux le faire en une seule ligne via jQuery: $('.target').css('display','none');

Cela fonctionne parfaitement, mais est-il valable d'utiliser des classes CSS qui ne sont pas définies? Dois-je créer une classe vide pour cela?

<style>.target{}</style>

Y a-t-il des effets secondaires ou existe-t-il une meilleure façon de le faire?

totymedli
la source
9
Je ne vois rien de mal à cela, bien que je l'aurais fait partie de la feuille de style si possible plutôt que d'utiliser .css, les styles définis avec .css sont très difficiles à remplacer sans causer d'autres problèmes, j'ai donc tendance à les éviter.
Kevin B
8
comme note de côté que vous voudrez peut-être utiliser .toggle(), c'est un tout petit peu plus court dans votre code.
Math chiller
4
Dans Visual Studio + ReSharper, si vous utilisez une classe qui n'est pas définie, cela vous donnera un avertissement, ce qui est utile si je n'ai qu'une faute de frappe, mais est ennuyeux dans des situations comme celle-ci. Dans ce cas, vous avez le choix entre ajouter le style vide ou désactiver l'avertissement (ou simplement l'ignorer) - personnellement, j'ajoute simplement le style vide. Je ne sais pas si d'autres IDE se comportent de la même manière.
Joe Enos
8
Ce n'est pas seulement possible, mais recommandé explicitement par certains. Puisque votre targetest à des fins de javascript, beaucoup de gens utilisent le préfixe js-pour ces classes, c'est-à-dire js-target. BTW: Target est une sorte de mauvaise réputation;) Pour plus d'informations, voir: philipwalton.com/articles/decoupling-html-css-and-javascript
k0pernikus
1
stackoverflow.com/questions/2832117/… est plus ou moins un doublon de cela, sans l'idée fausse.
naught101

Réponses:

491

"Classe CSS" est un terme impropre; classest un attribut (ou une propriété, en termes de script) que vous attribuez aux éléments HTML. En d' autres termes, vous déclarez des classes en HTML, CSS pas, donc dans votre cas la classe « cible » fait dans exist d'information sur ces éléments spécifiques, et votre balisage est parfaitement valide car il est.

Cela ne signifie pas nécessairement que vous devez avoir une classe déclarée dans le HTML avant de pouvoir l'utiliser en CSS non plus. Voir le commentaire du ruakh. La validité d'un sélecteur dépend entièrement de la syntaxe du sélecteur et CSS possède son propre ensemble de règles pour gérer les erreurs d'analyse , dont aucune ne concerne le balisage. Essentiellement, cela signifie que HTML et CSS sont complètement indépendants l'un de l'autre en ce qui concerne la validité. 1

Une fois que vous comprenez cela, il devient clair qu'il n'y a aucun effet secondaire de ne pas définir de .targetrègle dans votre feuille de style. 2 Lorsque vous affectez des classes à vos éléments, vous pouvez référencer ces éléments par ces classes dans une feuille de style, un script ou les deux. Ni l'un ni l'autre ne dépend de l'autre. Au lieu de cela, ils font tous deux référence au balisage (ou, plus précisément, à sa représentation DOM). Ce principe s'applique même si vous utilisez JavaScript pour appliquer des styles, comme vous le faites dans votre one-liner jQuery.

Lorsque vous écrivez une règle CSS avec un sélecteur de classe, tout ce que vous dites est «Je veux appliquer des styles aux éléments qui appartiennent à cette classe». De même, lorsque vous écrivez un script pour récupérer des éléments par un certain nom de classe, vous dites «Je veux faire des choses avec des éléments qui appartiennent à cette classe». Si oui ou non il y a des éléments qui appartiennent à la classe en question est une question tout à fait distincte.


1 C'est aussi pourquoi un sélecteur d'ID CSS fait correspondre tous les éléments avec l'ID donné, que l'ID apparaisse exactement une ou plusieurs fois (ce qui entraîne un document HTML non conforme).

2 La seule situation à ma connaissance où une règle CSS vide comme celle-ci est nécessaire est lorsque certains navigateurs refusent d'appliquer correctement certaines autres règles à la suite d'un bogue; la création d'une règle vide entraînera l'application de ces autres règles pour une raison quelconque. Voir cette réponse pour un exemple d'un tel bogue. Cependant, c'est du côté CSS et ne devrait donc avoir rien à voir avec le balisage.

BoltClock
la source
5
Il m'a fallu des siècles pour réaliser que les cours n'avaient rien à voir avec CSS. Mais à la même époque, tout le monde s'est rendu compte et les microformats sont arrivés.
Konrad Rudolph
13
+1, bien que cette réponse puisse être considérée comme impliquant, à tort, que CSS ne peut se référer qu'aux classes qui se produisent réellement dans le HTML. Il est en fait assez courant qu'un site utilise du CSS à l'échelle du site sur toutes les pages, même si certaines des classes auxquelles il se réfère n'apparaissent pas sur chaque page. (Par exemple, le site peut avoir un style personnalisé pour les liens externes, a.extlinketc., même si certaines pages ne contiennent aucun lien externe.)
ruakh
1
@ruakh: Excellent point, merci. Je ne pouvais pas trouver un moyen de l'adapter à ma réponse brève d'origine sans dévier du sujet, mais je vois comment l'utilisation du terme dépendance pourrait avoir donné cette impression, j'ai donc changé un peu. Cela dit, j'ai ajouté une note de bas de page faisant référence à votre commentaire et développant davantage.
BoltClock
66

Il n'y a aucun effet néfaste à utiliser des classes qui n'ont pas de styles. En effet, cela fait partie de l'utilité de CSS, c'est qu'il est découplé du balisage et peut styliser ou non les éléments / classes / etc. comme requis.

Ne les considérez pas comme des "classes CSS". Considérez-les comme des "classes" que CSS utilise également si nécessaire.

David
la source
11
+1 pour "Ne les considérez pas comme des" classes CSS ". Considérez-les comme des "classes" que CSS utilise également si nécessaire "
laike9m
48

Selon la spécification HTML5 :

Un attribut de classe doit avoir une valeur qui est un ensemble de jetons séparés par des espaces représentant les différentes classes auxquelles l'élément appartient. ... Il n'y a pas de restrictions supplémentaires sur les jetons que les auteurs peuvent utiliser dans l'attribut class, mais les auteurs sont encouragés à utiliser des valeurs qui décrivent la nature du contenu, plutôt que des valeurs qui décrivent la présentation souhaitée du contenu.

Aussi, dans la version 4 :

L'attribut class a plusieurs rôles en HTML:

  • En tant que sélecteur de feuille de style (lorsqu'un auteur souhaite affecter des informations de style à un ensemble d'éléments).
  • Pour le traitement général par les agents utilisateurs.

Votre cas d'utilisation relève du deuxième scénario, ce qui en fait un exemple légitime d'utilisation d'un attribut de classe.

Vitalii Fedorenko
la source
13
+1 pour citer les spécifications pertinentes. J'ai souvent oublié de faire ça.
BoltClock
40

Vous pouvez utiliser une classe qui n'a pas de styles, c'est du HTML entièrement valide.

Une classe référencée dans un fichier CSS n'est pas une définition d'une classe, elle est utilisée comme règle de sélection à des fins de style.

Sec
la source
25

Lorsque vous utilisez un nom de classe en JavaScript, il ne regarde pas le CSS pour trouver cette classe. Il regarde directement dans le code HTML.

Tout ce qui est requis est que le nom de classe soit dans le HTML. Il n'a pas besoin d'être dans le CSS.

En fait, beaucoup de gens pensent que c'est en fait une bonne idée de garder des classes séparées à utiliser avec CSS et Javascript , car cela permet à vos concepteurs et codeurs de travailler indépendamment sans se gêner mutuellement en utilisant leurs classes respectives.

(Remarque, le paragraphe ci-dessus est évidemment plus applicable pour les projets plus importants, alors ne pensez pas que vous devez aller à cet extrême si vous travaillez seul; je l'ai mentionné pour faire valoir que les deux peuvent être entièrement séparés )

Spudley
la source
13

Vous pouvez utiliser des classes CSS sans l'utiliser, mais je suggère que si vous ajoutez des classes CSS uniquement pour le code JavaScript / jQuery, préfixez-le js-YourClassNameafin que les développeurs frontaux n'utilisent jamais ces classes pour styliser les éléments. Ils doivent comprendre que ces classes peuvent être supprimées à tout moment.

Aamir Afridi
la source
10

Au moment où vous ajoutez la classe dans votre code HTML, la classe sera définie, donc votre solution est parfaitement adaptée

koningdavid
la source
7
L'utilisation de la classe en HTML ne la définit pas. Je dirais plutôt que la définition n'est pas pertinente: il n'y a pas de pénalité pour l'utilisation de classes non définies.
JAL
10

Il n'est pas nécessaire de définir des classes CSS dans votre feuille de style. Il devrait fonctionner parfaitement. Cependant, l'ajouter ne nuira pas.

Rameez
la source
Je ne dis pas d'ajouter ces styles, c'est à lui s'il le souhaite, s'il prévoit de prendre en charge ces styles, alors pourquoi pas? de toute façon merci pour vote négatif inutile :)
Rameez
Vous avez dit "ça ... ne fera pas de mal", mais ça finira par arriver.
Pavlo
oui ça ne fera pas de mal. s'il a des sens pour ajouter ces styles vides, il aura évidemment des sens pour les gérer. De toute évidence, je ne vais pas ajouter .. ni je conseille d'ajouter.
Rameez
8

Une chose que personne ici n'a pleinement mentionnée est que JavaScript (aidé par jQuery dans ce cas) n'est pas en mesure de modifier directement la feuille de style en cascade d'un document. La css()méthode de jQuery ne fait que modifier l'ensemble des stylepropriétés des éléments correspondants . CSS et JavaScript sont complètement indépendants de cet aspect.

$('.target').css('display','none');ne change pas du tout votre .target { }déclaration CSS. Ce qui s'est passé ici à la place, c'est que tout élément avec un class"cible" ressemble maintenant à ceci:

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

Y a-t-il des effets secondaires causés par la non-définition d'une règle de style CSS? Pas du tout.

Y a-t-il une meilleure manière de faire cela? Côté performances, oui!

Comment améliorer les performances?

Plutôt que de modifier directement le stylede chaque élément, vous pouvez plutôt prédéfinir une nouvelle classe et l'ajouter à vos éléments correspondants en utilisantaddClass() (une autre méthode jQuery).

Sur la base de ce JSPerf préexistant qui se compare css()à addClass(), nous pouvons voir que addClass()c'est en fait beaucoup plus rapide:

css () vs addClass ()

Comment pouvons-nous mettre cela en œuvre nous-mêmes?

Tout d'abord, nous pouvons ajouter dans notre nouvelle déclaration CSS:

.hidden {
    display: none;
}

Votre code HTML resterait le même, cette classe prédéfinie est simplement en place pour une utilisation ultérieure.

Nous pouvons maintenant modifier le JavaScript à utiliser à la addClass()place:

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

Lors de l'exécution de ce code, plutôt que de modifier directement la stylepropriété de chacun de vos éléments "cible" correspondants, cette nouvelle classe aura désormais été ajoutée:

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

Avec la nouvelle classe "cachée", cet élément héritera du style déclaré dans votre CSS et votre élément ne sera plus affiché.

James Donnelly
la source
Bon conseil. Il y a rarement une bonne raison d'utiliser .css()au lieu de basculer les classes IMO.
BoltClock
6

Comme cela est mentionné par tant d'autres, oui, l'utilisation de classes sans CSS assigné est parfaitement valide et plutôt que de les considérer comme des `` classes CSS '', vous devez simplement reconnaître la sémantique de la classe et de l'ID comme étant respectivement des groupes et des éléments individuels.

Je voulais intervenir car je sentais qu'un point important n'avait pas été soulevé étant donné l'exemple. Si jamais vous devez effectuer des manipulations visuelles sur une longueur variable d'éléments (dans ce cas, vous utilisez des lignes de tableau), il est toujours logique de reconnaître que le coût de le faire via Javascript peut potentiellement être très coûteux (par exemple, si vous avez milliers de lignes).

Dans cette situation, disons que nous savons que la colonne 2 a toujours le potentiel d'être cachée (c'est une fonction consciente de votre table), alors il est logique de concevoir un style CSS pour gérer ce cas d'utilisation.

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

Ensuite, plutôt que d'utiliser JS pour parcourir le DOM en trouvant N éléments, nous devons simplement basculer une classe sur une (notre table).

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

En attribuant un identifiant à la table, cela serait encore plus rapide et vous pourriez même vous référer à la colonne en utilisant le :nth-childsélecteur, ce qui réduirait davantage votre balisage, mais je ne peux pas commenter l'efficacité. Une autre raison pour cela est que je déteste le style en ligne, et je ferai de grands efforts pour l'éradiquer!

Ian Clark
la source
1
+1 pour "groupes et éléments individuels" et pour une utilisation efficace de la structure du document
deltab
5

Cela n'aura aucun effet si vous appliquez une classe sur un élément HTML et que cette classe n'est pas définie en CSS. C'est une pratique courante et comme l'a dit Aamir afridi si vous utilisez des classes uniquement pour js, c'est une bonne pratique de les préfixer avec js-.

Il est non seulement valable pour les calsses, mais aussi pour l'attribut id des éléments html.

Altaf Hussain
la source
4

Il n'y a aucun problème à utiliser des classes pour simplement rechercher des éléments. J'avais l'habitude de donner à ces noms de classe le sys-préfixe (par exemple, je nommerai votre classe sys-target) pour les distinguer des classes utilisées pour le style. C'était une convention utilisée par certains développeurs de microsoft dans le passé. J'ai également remarqué une pratique croissantejs- préfixe à cette fin.

Si vous n'êtes pas à l'aise avec l'utilisation de classes à des fins autres que le style, je recommande d'utiliser le plug- in Role.js jQuery qui vous permet d'atteindre le même objectif à l'aide de l' roleattribut, vous pouvez donc écrire votre balisage <td role="target">et le rechercher à l'aide de $("@target"). La page du projet a une bonne description et des exemples. J'utilise ce plugin pour les grands projets parce que j'aime vraiment garder les classes à des fins de style uniquement.

Ashraf Sabry
la source
3

Reportez-vous au moteur de validation jQuery . Même là-bas, nous utilisons également des classes inexistantes pour ajouter des règles de validation sur les attributs HTML . Il n'y a donc rien de mal à utiliser des classes qui ne sont pas réellement déclarées dans une feuille de style.

dhruvin
la source