265 votes

Puis-je utiliser des classes CSS non existantes ?

J'ai un tableau où j'affiche/masque une colonne complète par 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 faire cela en une 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 à cet effet ?

<style>.target{}</style>

Y a-t-il des effets secondaires ou une meilleure façon de procéder ?

9 votes

Je ne vois rien de mal à cela, bien que j'aurais fait en sorte que cela fasse partie de la feuille de style si cela était possible plutôt que d'utiliser .css Les styles définis à l'aide de .css sont très difficiles à modifier sans causer d'autres problèmes, c'est pourquoi j'ai tendance à les éviter.

8 votes

À titre d'information, vous pouvez utiliser .toggle() il est un peu plus court dans votre code.

4 votes

Dans Visual Studio + ReSharper, si vous utilisez une classe qui n'est pas définie, vous recevrez un avertissement, ce qui est utile si j'ai juste une faute de frappe, mais qui 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 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.

493voto

BoltClock Points 249668

La "classe CSS" est un terme mal choisi ; class est un attribut (ou une propriété, en termes de script) que vous attribuez aux éléments HTML. En d'autres termes, vous déclarez les classes en HTML, et non en CSS. Dans votre cas, la classe "target" est la suivante fait existent en fait sur ces éléments spécifiques, et votre balisage est parfaitement valide en l'état.

Cela ne signifie pas nécessairement que vous devez déclarer une classe dans le code HTML avant de pouvoir l'utiliser dans le code CSS. Voir le commentaire de Ruakh. Si un sélecteur est valide ou non dépend entièrement de la syntaxe du sélecteur et CSS a son propre ensemble de règles de traitement des erreurs d'analyse syntaxique qui ne concernent pas du tout 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 avez compris cela, il devient clair qu'il n'y a aucun effet secondaire à ne pas définir un .target dans votre feuille de style. 2 Lorsque vous attribuez des classes à vos éléments, vous pouvez référencer ces éléments par ces classes soit dans une feuille de style, soit dans un script, soit dans les deux. Aucun des deux n'a de dépendance vis-à-vis de l'autre. Au contraire, 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 jQuery one-liner.

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 les éléments qui appartiennent à cette classe." Qu'il y ait ou non sont qui appartiennent à la classe en question est une question tout à fait distincte.


1 C'est aussi pourquoi <a href="https://stackoverflow.com/questions/7262195/several-elements-with-the-same-id-responding-to-one-css-id-selector/8753329#8753329">un sélecteur CSS ID correspond <em>tous </em>éléments avec l'ID donné sans tenir compte </a>que l'ID apparaisse exactement une fois ou plusieurs fois (ce qui donne un document HTML non conforme).

2 La seule situation que je connaisse où une règle CSS vide de ce type est nécessaire est lorsque certains navigateurs refusent d'appliquer certaines autres règles correctement en raison 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 <a href="https://stackoverflow.com/questions/15301357/safari-bug-first-child-doesnt-update-displayblock-when-items-are-removed-with/15302066#15302066">cette réponse </a>pour un exemple d'un tel bug. Cependant, il s'agit d'un problème de CSS qui n'a rien à voir avec le balisage.

5 votes

Il m'a fallu du temps pour comprendre que les classes n'ont rien à voir avec CSS. Mais à peu près au même moment, tout le monde a compris et les microformats sont apparus.

14 votes

+1, bien que cette réponse puisse être considérée comme impliquant, à tort, que les CSS ne peuvent se référer qu'aux classes qui existent réellement dans le HTML. Il est en fait assez courant qu'un site ait un CSS utilisé sur toutes les pages, même si certaines des classes auxquelles il fait référence n'apparaissent pas sur chaque page. (Par exemple, le site peut avoir un style personnalisé pour les liens externes, a.extlink ou autre, même si certaines pages ne contiennent pas de liens externes).

2 votes

@ruakh : Excellent point, merci. Je n'ai pas trouvé le moyen de l'intégrer dans ma réponse initiale et brève sans m'écarter du sujet, mais je vois comment l'utilisation du terme dépendance a pu donner cette impression et je l'ai donc modifié un peu. Cela dit, j'ai ajouté une note de bas de page faisant référence à votre commentaire, ainsi que d'autres précisions.

66voto

David Points 65209

Il n'y a aucun inconvénient à utiliser des classes qui n'ont pas de styles. En effet, une partie de l'utilité de CSS est qu'il est découplé du balisage et peut styliser ou non les éléments/classes/etc. selon les besoins.

Ne les considérez pas comme des "classes CSS". Considérez-les comme des "classes" que CSS utilise également en cas de besoin.

11 votes

+1 pour "Ne les considérez pas comme des 'classes CSS'. Pensez-y comme à des 'classes' que CSS utilise également si nécessaire".

48voto

Vitalii Fedorenko Points 17469

Selon Spécification HTML5 :

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

De même, dans le version 4 :

L'attribut class joue plusieurs rôles dans le langage HTML :

  • En tant que sélecteur de feuille de style (lorsqu'un auteur souhaite attribuer des informations de style à un ensemble d'éléments). à un ensemble d'éléments).
  • Pour le traitement à des fins générales par 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.

13 votes

+1 pour avoir cité les spécifications pertinentes. J'ai souvent oublié de le faire.

40voto

Curt Points 42871

Vous pouvez utiliser une classe qui n'a pas de styles, c'est du HTML tout à fait valide.

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

25voto

Spudley Points 85371

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

Il suffit que le nom de la classe se trouve dans le HTML. Il n'est pas nécessaire qu'il figure 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 pour l'utilisation de CSS et de Javascript. Il permet aux concepteurs et aux codeurs de travailler indépendamment sans se gêner mutuellement en utilisant leurs classes respectives.

(remarque : le paragraphe ci-dessus s'applique évidemment davantage aux grands projets, ne vous sentez donc pas obligé d'aller jusqu'à cette extrémité si vous travaillez seul ; je l'ai mentionné pour montrer que les deux peuvent être entièrement séparés).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X