À la fin de chaque message dans mon thème Tumblr, j'ai ce code:
<p class="permalink">
<a href="{Permalink}">{NoteCountWithLabel}</a>
{block:HasTags} # filed under:
{block:Tags}
<a href="{TagURL}">{Tag}</a>
{/block:Tags}
{/block:HasTags}
</p>
(Je sais que le bit
n'est pas vraiment un acte de classe. C'était ma solution de contournement en quatre secondes et ce n'est pas le but de cette question, alors supportez-moi!)
Sur un post avec plusieurs tags, cela donne:
Si j'ajoute juste une virgule après {Tag}
pour le rendre <a href="{TagURL}">{Tag},</a>
, je reçois:
La dernière balise a une virgule superflue, et les posts avec une seule balise montreraient également la virgule supplémentaire avec cette méthode.
Comment puis-je ajouter le nombre correct de virgules?
Mise à jour:
La réponse de Jeremy ci-dessous a fait ce que je voulais. Mais, dans une tentative de avoir envie être "conforme aux normes" (bien que je ne sache pas pourquoi ceux qui utilisent IE8 liraient mon tumblr), j'ai tenté de mettre en œuvre la suggestion de w3d. Alors maintenant, le CSS ressemble à:
a.tag:before {
content:", ";
}
a.tag:first-child:before {
content:"";
}
Le résultat est maintenant:
( n.b .: le saut de ligne n'est pas lié - j'ai ajouté volontairement. )
Alors. Qu'est ce qui ne s'est pas bien passé?
J'ai une autre idée.
{block:Tags}<a class="tag" href="{TagURL}">{Tag}</a><span class="tagtail"></span>{/block:Tags}
Cela ajoutera un span avec la classe "tagtail" après chaque balise.
Ensuite, ajoutez ce css:
span.tagtail + a.tag:before {
content:", ";
}
Cela sélectionnera chaque balise ancre qui suit un tagtail (donc chacun sauf le premier). De cette façon, nous évitons d'avoir à utiliser le premier-enfant ou dernier-enfant sélecteurs.
PDATE:
Si vous voulez vous assurer que les virgules sont bien séparées de l'ancre, vous pouvez également procéder comme suit:
{block:Tags}<span class="taghead">, </span><a class="tag" href="{TagURL}">{Tag}</a>{/block:Tags}
puis coiffez-le comme ceci:
span.taghead { display:none; }
a.tag + span.taghead { display:inline; }
Toutefois, cela peut nécessiter des ajustements car les navigateurs diffèrent par les règles prioritaires.
Essayez quelques astuces CSS (pour le faire fonctionner dans IE 8, vous devez spécifier un <! DOCTYPE> en haut du document).
<p class="permalink">
<a href="{Permalink}">{NoteCountWithLabel}</a>
{block:HasTags} # filed under:
{block:Tags}
<a class="tag" href="{TagURL}">{Tag}</a>
{/block:Tags}
{/block:HasTags}
</p>
Ensuite, ajoutez le CSS suivant:
a.tag:after {
content:",";
}
a.tag:last-child:after {
content:"";
}
Il utilise le pseudo-sélecteur : after et la propriété peu utilisée content pour ajouter la virgule après coup. La deuxième règle remplace la propriété content de la dernière balise de la séquence.
Suite de la réponse de @ Jeremy ... Pour prendre en charge IE8 (et IE7), vous devrez utiliser la pseudo-classe first-child
plutôt que last-child
. IE8 ne supporte pas last-child
, même en mode conforme aux normes (c'est-à-dire avec un DOCTYPE).
a.tag:before {
content:", "; /* comma + space */
}
a.tag:first-child:before {
content:"";
}
EDIT: Cependant, une légère mise en garde avec cette approche est que vous devrez probablement supprimer tout espace blanc supplémentaire apparaissant après la fermeture </a>
dans votre balisage/thème.
{block:Tags}<a class="tag" href="{TagURL}">{Tag}</a>{/block:Tags}
EDIT: Capture d'écran de la sortie de violon dans Safari 5.0 sur OS X:
S'appuyant sur la suggestion :before
dans les réponses précédentes. Si vous travaillez avec une liste de balises, il est fort possible que vous les placiez dans une liste. Si vous utilisez chaque balise li
avec :before
plutôt que la balise a de la balise li
, chaque balise sera le premier enfant de la balise li
, mais une seule La balise li
sera le premier enfant de la balise ul
ou ol
! J'utilise une liste de description car je souhaitais mettre des "balises" dans la balise d
t. Il en va de même pour la balise d
d.
L'utilisation d'une liste de description présente toutefois une complexité supplémentaire. La première balise dd
n'est jamais le premier enfant de la balise dl
, il s'agit de la balise dt
. Vous devez donc utiliser nth-child(2)
pour la cibler. L'inconvénient d'utiliser nth-child(2)
est que, là encore, il n'est pas conforme à IE 8, de sorte que le problème se reproduit.
Voici ma solution.
{block:HasTags}
<div class="t">
<dl>
<dt>Tags</dt>
{block:Tags}
<dd><a href="{TagURL}" class="tag">{Tag}</a></dd>
{/block:Tags}
</dl>
</div>
{/block:HasTags}
Également dans les réponses précédentes, ils suggèrent que l’utilisation d’un espace dans le contenu (content: ", ";
) fonctionne. Est-ce que ça marche? Je ne peux pas le faire fonctionner mais "\ 00a0" le fera.
.t dl {
margin: 0px;
list-style-type: none;
}
.t dt {
margin: 0px 5px 0px 0px;
float: left;
}
.t dd {
margin: 0px;
float: left;
}
.t dd:before {
padding: 0px 5px 0px 0px;
content: ",\00a0";
float: left;
}
.t dd:nth-child(2):before {
padding: 0px 0px 0px 0px;
content: "";
float: left;
}