Puis-je cibler toutes les balises <H> avec un seul sélecteur?

155

Je souhaite cibler toutes les balises h d'une page. Je sais que tu peux le faire de cette façon ...

h1,
h2,
h3,
h4,
h5,
h6 {
  font: 32px/42px trajan-pro-1,trajan-pro-2;
}

mais y a-t-il un moyen plus efficace de le faire en utilisant des sélecteurs CSS avancés? par exemple quelque chose comme:

[att^=h] {
  font: 32px/42px trajan-pro-1,trajan-pro-2;
}

(mais évidemment cela ne fonctionne pas)

SparrwHawk
la source
8
Cela devient de plus en plus fastidieux lors de la sélectionh1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, ...
Vortico

Réponses:

128

Non, une liste séparée par des virgules est ce que vous voulez dans ce cas.

Dave Markle
la source
14
Pour ceux qui arrivent ici de google et se demandent ce que signifie une liste séparée par des virgules en CSS, c'est le premier exemple donné par OP. C'est h1, h2, h3 {}.
bluesmonk
44

Ce n'est pas un css basique, mais si vous utilisez LESS ( http://lesscss.org ), vous pouvez le faire en utilisant la récursivité:

.hClass (@index) when (@index > 0) {
    h@{index} {
        font: 32px/42px trajan-pro-1,trajan-pro-2;
    }
    .hClass(@index - 1);
}
.hClass(6);

Sass ( http://sass-lang.com ) vous permettra de gérer cela, mais n'autorisera pas la récursivité; ils ont une @forsyntaxe pour ces instances:

@for $index from 1 through 6 {
  h#{$index}{
    font: 32px/42px trajan-pro-1,trajan-pro-2;
  }
}

Si vous n'utilisez pas un langage dynamique qui se compile en CSS comme LESS ou Sass, vous devriez certainement vérifier l'une de ces options. Ils peuvent vraiment simplifier et dynamiser votre développement CSS.

Steve
la source
12
je suis presque sûr de taper manuellement que de créer une boucle for en CSS comme h1, h2, h3 ... prend moins de temps, d'espace ... plus clair à comprendre maintenant et plus tard.
Muhammad Umer
¯_ (ツ) _ / ¯ "can" != "should". Même ainsi, les options Sass / LESS vous offrent une extensibilité que le CSS vanille ne fait pas. Pensez à quelque chose comme font-size: (48px / @index).
Steve
Ce n'est pas grave si cela répond le mieux à vos besoins. Comme mentionné dans un commentaire précédent, si, pour une raison quelconque, vous devez opérer sur l'index en LESS ou Sass, cette approche vous permet de le faire facilement. Votre implémentation peut être dynamique en fonction du numéro d'en-tête.
Steve
Pour les personnes qui ne souhaitent pas s'intégrer scss/sassdans leur projet, mais qui souhaitent générer cssavec scss/sasselles peuvent utiliser cet outil en ligne appelé sassmeister
Sameer Khan
38

Si vous utilisez SASS, vous pouvez également utiliser ce mixin:

@mixin headings {
    h1, h2, h3,
    h4, h5, h6 {
        @content;
    }
}

Utilisez-le comme ceci:

@include headings {
    font: 32px/42px trajan-pro-1, trajan-pro-2;
}

Modifier: Ma façon préférée de le faire en étendant éventuellement un sélecteur d'espace réservé sur chacun des éléments de titre.

h1, h2, h3,
h4, h5, h6 {
    @extend %headings !optional;
}

Ensuite, je peux cibler tous les en-têtes comme je ciblerais n'importe quelle classe unique, par exemple:

.element > %headings {
    color: red;
}
Ben Fleming
la source
C'est un tout petit pas de SCSS à SCSS + Compass: compass-style.org/reference/compass/helpers/selectors - headings ($ from, $ to)
Imperative
1
Wow, je suis tombé dessus deux ans plus tard .. et le montage a l'air d'or! Je suis sûr que je comprends le but du !optionaldrapeau sur l'extension cependant? Et ne semble pas trouver quoi que ce soit sur google ...
Projet de loi
3

Stylus l » interpolation de sélection

for n in 1..6
  h{n}
    font: 32px/42px trajan-pro-1,trajan-pro-2;
réflexe de retard
la source
Cela ne fonctionne pas. Veuillez tester votre code avant de publier une réponse car cela est préjudiciable à quiconque pourrait essayer de l'utiliser. J'ai édité votre réponse avec un code testé et fonctionnel.
Développement web hybride
@Hybridwebdev Cela semble fonctionner pour moi. C'est aussi ainsi que la documentation décrit l' itération
laggingreflex
3

Le sélecteur jQuery pour toutes les balises h (h1, h2, etc.) est ": header". Par exemple, si vous souhaitez rendre toutes les balises h de couleur rouge avec jQuery, utilisez:

$(':header').css("color","red")

Fabian Madurai
la source
pouvez-vous cibler tous les titres dans une division spécifique uniquement? par exemple $('.my_div :header').css("color","red")?
user1063287
1

Pour résoudre ce problème avec du CSS vanille, recherchez des modèles dans les ancêtres des h1..h6éléments:

<section class="row">
  <header>
    <h1>AMD RX Series</h1>
    <small>These come in different brands and types</small>
  </header>
</header>

<div class="row">
  <h3>Sapphire RX460 OC 2/4GB</h3>
  <small>Available in 2GB and 4GB models</small>
</div>

Si vous pouvez repérer des motifs, vous pourrez peut-être écrire un sélecteur qui cible ce que vous voulez. Compte tenu de l'exemple ci-dessus, tous les h1..h6éléments peuvent être ciblés en combinant les :first-childet les :notpseudo-classes de CSS3, disponibles dans tous les navigateurs modernes, comme ceci:

.row :first-child:not(header) { /* ... */ }

Dans le futur, les sélecteurs de pseudo-classes avancés comme :has(), et les combinateurs ultérieurs ( ~), offriront encore plus de contrôle à mesure que les normes Web continueront d'évoluer au fil du temps.

Josh Habdas
la source
1

Vous pouvez également utiliser PostCSS et le plugin de sélecteurs personnalisés

@custom-selector :--headings h1, h2, h3, h4, h5, h6;

article :--headings {
  margin-top: 0;
}

Production:

article h1,
article h2,
article h3,
article h4,
article h5,
article h6 {
  margin-top: 0;
}
Mattia Astorino
la source
1

Vous pouvez .classer tous les titres de votre document si vous souhaitez les cibler avec un seul sélecteur, comme suit,

<h1 class="heading">...heading text...</h1>
<h2 class="heading">...heading text...</h2>

et dans le css

.heading{
    color: #Dad;
    background-color: #DadDad;
}

Je ne dis pas que c'est toujours la meilleure pratique, mais cela peut être utile, et pour cibler la syntaxe, plus facile à bien des égards,

donc si vous donnez à tous les h1 à h6 la même classe .heading dans le html, vous pouvez les modifier pour tous les documents html qui utilisent cette feuille css.

à la hausse, contrôle plus global par rapport à "section div article h1, etc {}",

inconvénient, au lieu d'appeler tous les sélecteurs en place dans le css, vous aurez beaucoup plus de saisie dans le html, mais je trouve qu'avoir une classe dans le html pour cibler tous les en-têtes peut être bénéfique, faites juste attention à la priorité dans le css, car des conflits peuvent survenir

DennisWPaulsenJR
la source
0

La nouvelle :is()pseudo-classe CSS peut le faire dans un seul sélecteur:

:is(h1, h2, h3, h4, h5, h6) {
  color: red;
}
vent d'argent
la source