103 votes

CSS :première-lettre ne fonctionne pas

Je essaie d'appliquer des styles CSS à certaines fragments HTML qui ont été générés à partir d'un document Word Microsoft. L'HTML que Word a généré est assez atroce, et comprend beaucoup de styles en ligne. Ça ressemble à ceci :

...et simplement, j'aimerais styliser la première lettre de la section du titre. Elle doit juste être plus grande et dans une police différente. Pour cela, j'essaie d'utiliser le sélecteur :first-letter, avec quelque chose qui ressemble à ceci :

p b span:first-letter {
    font-size: 500px !important;
}

Mais cela ne semble pas fonctionner. Voici un exemple illustrant cela :

http://jsfiddle.net/KvGr2/

Des idées sur ce qui ne va pas/comment styliser correctement la première lettre de la section du titre ? Je peux apporter des modifications mineures au balisage (comme ajouter un div conteneur autour des éléments), bien que pas sans quelques difficultés.

253voto

sandeep Points 43178

::first-letter ne fonctionne pas sur des éléments inline tels qu'un span. ::first-letter fonctionne sur des éléments block tels qu'un paragraphe, une légende de tableau, une cellule de tableau, un élément de liste, ou ceux ayant leur propriété display définie sur inline-block.

Il est donc préférable d'appliquer ::first-letter à un élément p au lieu d'un span.

p::first-letter {font-size: 500px;}

ou si vous voulez un sélecteur ::first-letter dans un span alors écrivez-le comme ceci :

p b span::first-letter {font-size: 500px !important;}
span {display:block}

MDN fournit la justification de ce comportement non évident :

Le pseudo-élément CSS ::first-letter sélectionne la première lettre de la première ligne d'un bloc, si elle n'est pas précédée par un autre contenu (tel que des images ou des tableaux inline) sur sa ligne.

...

Une première ligne a du sens uniquement dans une boîte de type block-container, par conséquent le pseudo-élément ::first-letter n'a d'effet que sur les éléments avec une valeur de display de block, inline-block, table-cell, list-item ou table-caption. Dans tous les autres cas, ::first-letter n'a aucun effet.

Un autre cas étrange (en dehors de ne pas fonctionner sur des éléments inline) est si vous utilisez :before le ::first-letter s'appliquera au before et non à la première lettre réelle voir codepen

Exemples

Références

https://developer.mozilla.org/fr/docs/Web/CSS/::first-letter http://reference.sitepoint.com/css/pseudoelement-firstletter

21voto

Dovev Hefetz Points 121

Vous pouvez obtenir le comportement souhaité en définissant la propriété d'affichage de la balise span sur inline-block:

.heading span {
  display: inline-block;
}

.heading span:first-letter {
  color: red;
}

  An
  Interesting
  Heading

9voto

Ofer Zelig Points 8595

Cela est dû au fait que :first-letter ne fonctionne que sur les éléments blocs / en ligne. SPAN est un élément en ligne.

Extrait de http://reference.sitepoint.com/css/pseudoelement-firstletter:

Le pseudo-élément :first-letter est principalement utilisé pour créer des effets typographiques courants tels que les lettrines. Ce pseudo-élément représente le premier caractère de la première ligne formatée du texte dans un élément de niveau bloc, un élément en ligne, une légende de tableau, une cellule de tableau ou un élément de liste.

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