Caractère Unicode comme puce pour élément de liste en CSS

114

Je dois utiliser, par exemple, le symbole étoile (★) comme puce pour un élément de liste.

J'ai lu le module CSS3: Lists , qui décrit, comment utiliser du texte personnalisé comme puces, mais cela ne fonctionne pas pour moi. Je pense que les navigateurs ne prennent tout simplement pas en charge le ::markerpseudo élément.

Comment puis-je le faire, sans utiliser d'images?

AntonAL
la source
pouvez-vous mettre en place le code que vous utilisez? Et dans quel navigateur testez-vous cela?
Jonny Haynes
1
stackoverflow.com/questions/3068199/… a quelques puces Unicode. Ni le symbole d'étoile que vous avez ci-dessus, ni 26AB (cercle noir moyen) ne s'affichent sur ma machine Windows, bien qu'ils soient OK sur Ubuntu.
Pete Kirkham
Cette réponse (à une question similaire) l'a résolu pour moi: stackoverflow.com/a/12216973/907575
Piotr Migdal

Réponses:

77

ÉDITER

Je ne recommanderais probablement plus d'utiliser des images. Je m'en tiendrai à l'approche consistant à utiliser un caractère Unicode, comme ceci:

li:before {
  content: "\2605";
}

ANCIENNE RÉPONSE

Je choisirais probablement un arrière-plan d'image, ils sont beaucoup plus efficaces, polyvalents et compatibles avec tous les navigateurs.

Voici un exemple:

<style type="text/css">
  ul {list-style:none;} /* you should use a css reset too... ;) */
  ul li {background:url(images/icon_star.gif) no-repeat 0 5px;}
</style>

<ul>
  <li>List Item 1</li>
  <li>List Item 2</li>
  <li>List Item 3</li>
</ul>
agbb
la source
47
En quoi est-ce «beaucoup plus efficace»? Vous envoyez une requête HTTP supplémentaire pour récupérer l'image et le fichier total augmente au fur et à mesure que vous chargez une image pour quelque chose qui pourrait simplement être fait en utilisant un seul caractère Unicode.
Mathias Bynens
2
vous avez raison, probablement "efficace" n'est pas le mot que j'aurais dû utiliser si vous recherchez des performances, mais utiliser un fond d'image est certainement beaucoup plus polyvalent que d'utiliser du texte.
agbb
3
Il n'est pas très bon de redimensionner une image, mais un personnage est parfait sur toutes les tailles, donc je dirais qu'un personnage est plus polyvalent: PI pense que le mot est compatible avec les backword ou avec la plus large gamme de support de navigateur ...
JustGoscha
Cela ne fonctionne pas bien lorsque le <li>texte est renvoyé à la ligne: la puce ne reste pas indentée et finit par ressembler au début d'un paragraphe de texte. Cette réponse résout ce problème: stackoverflow.com/a/14301918/1450294
Michael Scheper
105

Utilisation du texte sous forme de puces

À utiliser li:beforeavec une entité HTML hexadécimale échappée (ou tout autre texte brut).


Exemple

Mon exemple produira des listes avec des coches sous forme de puces.

CSS :

ul {
    list-style: none;
    padding: 0px;
}

ul li:before
{
    content: '\2713';
    margin: 0 1em;    /* any design */
}

Compatibilité du navigateur

Je n'ai pas testé moi-même, mais il devrait être pris en charge à partir d'IE8. Au moins, c'est ce que disent quirksmode et css-tricks .

Vous pouvez utiliser des commentaires conditionnels pour appliquer des solutions plus anciennes / plus lentes telles que des images ou des scripts. Mieux encore, utilisez les deux avec <noscript>pour les images.

HTML :

<!--[if lt IE 8]>
    *SCRIPT SOLUTION*
    <noscript>
        *IMAGE SOLUTION*
    </noscript>
<![endif]-->

À propos des images d'arrière-plan

Les images d'arrière-plan sont en effet faciles à manipuler, mais ...

  1. La prise en charge du navigateur background-sizen'est en fait qu'à partir d'IE9.
  2. Les couleurs de texte HTML et les polices spéciales ( folles ) peuvent faire beaucoup, avec moins de requêtes HTTP.
  3. Une solution de script peut simplement injecter l'entité HTML et laisser le même CSS faire le travail.
  4. Un bon code CSS de réinitialisation pourrait faciliter list-style(le choix le plus logique).

Prendre plaisir.

222
la source
1
outil de conversion utile pour échapper des caractères spéciaux rishida.net/tools/conversion
iiz
23
Cela ne fonctionne pas correctement si le contenu de l' liélément passe sur plusieurs lignes; ces lignes enveloppées ne seront pas indentées correctement.
Richard Ev
5
float: left; margin-left: -12px;le: avant de s'occuper de ça, @RichardEverett
Dudo
1
Je travaille pour une ligne mais ne fonctionne pas si plusieurs lignes s'embrouillent.
VDarricau
1
Fonctionne uniquement pour les éléments de liste sur une seule ligne. Les lignes multiples tomberont sous la puce plutôt que de se mettre en retrait.
Clarus Dignus
35

Vous pouvez le construire:

#modal-select-your-position li {
/* handle multiline */
    overflow: visible;
    padding-left: 17px;
    position: relative;
}

#modal-select-your-position li:before {
/* your own marker in content */
   content: "—";
   left: 0;
   position: absolute;
}
Defann
la source
4
C'est une excellente technique car si vous ne faites pas le positionnement absolu du personnage, alors vous vous retrouvez avec la "puce" étant en ligne avec le reste de l'élément de liste. C'est un comportement très différent de celui d'une balle. Donc, avec ce correctif, vous obtenez la "puce" à gauche de l'élément de liste comme vous le feriez avec une puce normale.
General Redneck
Merci pour ça! Exactement ce dont j'avais besoin pour que mes balles se comportent à nouveau.
tubaguy50035
1
Cela fait un merveilleux arbre de navigation en utilisant '\21B3'! Merci! Cela a mieux fonctionné que les autres réponses ici. Également changé le padding-leftdans ma conception en 1em, qui s'adapte bien lorsque les niveaux de votre arbre changent de taille.
ndm13
23

C'est la solution W3C. Vous pouvez l'utiliser en 3012!

ul { list-style-type: "*"; }
/* Sets the marker to a "star" character */

https://drafts.csswg.org/css-lists/#text-markers

PHPst
la source
12
J'entends qu'en 3012, Internet Explorer fonctionne enfin!
Mark K Cowan
2
Cela fonctionne dans Firefox 48, mais pas dans Chromium 51 ou sur mon téléphone / ma tablette. On devra utiliser la li:beforesolution.
CoderGuy123
1
Travaux. Bienvenue dans le futur, mesdames et messieurs.
Mikko Ohtamaa le
12

Les images ne sont pas recommandées car elles peuvent apparaître pixélisées sur certains appareils (appareils Apple avec écran Retina) ou lorsqu'elles sont agrandies. Avec un personnage, votre liste est toujours superbe.

Voici la meilleure solution que j'ai trouvée jusqu'à présent. Cela fonctionne très bien et c'est multi-navigateur (IE 8+).

ul {
    list-style: none;
    padding-left: 1.2em;
    text-indent: -1.2em;
}

li:before {
    content: "►";
    display: block;
    float: left;
    width: 1.2em;
    color: #ff0000;
}

L'important est d'avoir le caractère dans un bloc flottant avec une largeur fixe afin que le texte reste aligné s'il est trop long pour tenir sur une seule ligne. 1.2em est la largeur que vous souhaitez pour votre personnage, changez-la selon vos besoins. N'oubliez pas de réinitialiser le remplissage et la marge pour les éléments ul et li.

EDIT: sachez que la taille "1.2em" peut varier si vous utilisez une police différente dans ul et li: before. Il est plus sûr d'utiliser des pixels.

NicolasBernier
la source
Peut-être ajouter "hauteur: 1px" ou similaire au li: avant? Cela garantit que le flotteur ne s'étend pas jusqu'au prochain <li>, provoquant une imbrication indésirable.
Alan De Smet
Pourquoi l'affichage: bloc; sur li: avant? est-ce parce que par défaut il est en ligne et que vous ne pouvez pas spécifier de largeur?
Alexander Solonik
6

Pour ajouter une étoile, utilisez le caractère Unicode 22C6.

J'ai ajouté un espace pour faire un petit écart entre la liet l'étoile. Le code de l'espace est A0.

li:before {
    content: '\22C6\A0';
}
Poignard
la source
4

Un exemple plus complet de la réponse de 222 :

ul {
    list-style:none;
    padding: 0 0 0 2em;     /* padding includes space for character and its margin */

    /* IE7 and lower use default */
    *list-style: disc;
    *padding: 0 0 0 1em;
}
ul li:before {
    content: '\25BA';
    font-family: "Courier New", courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace;
    margin: 0 1em 0 -1em;   /* right margin defines spacing between bullet and text. negative left margin pushes back to the edge of the parent <ul> */

    /* IE7 and lower use default */
    *content: none;
    *margin: 0;
}
ul li {
    text-indent: -1em;      /* negative text indent brings first line back inline with the others */

    /* IE7 and lower use default */
    *text-indent: 0;
}

J'ai inclus des propriétés star-hack pour restaurer les styles de liste par défaut dans les anciennes versions d'IE. Vous pouvez les extraire et les inclure dans une inclusion conditionnelle si vous le souhaitez, ou les remplacer par une solution basée sur une image d'arrière-plan. Mon humble avis est que les styles de puces spéciaux implémentés de cette manière devraient se dégrader gracieusement sur les quelques navigateurs qui ne prennent pas en charge les pseudosélecteurs.

Testé dans Firefox, Chrome, Safari et IE8-10 et rend correctement dans tous.

pospi
la source
text-indent: -1em;est une propriété importante si vous avez des éléments de liste sur plusieurs lignes. Sans elle, la deuxième ligne et les suivantes s'allument avec la puce plutôt que la ligne précédente.
Andris
3
ul {
    list-style-type: none;    
}

ul li:before {
    content:'*'; /* Change this to unicode as needed*/
    width: 1em !important;
    margin-left: -1em;
    display: inline-block;
}
Iacchus
la source
1

J'ai parcouru toute cette liste et il y a des éléments partiellement corrects et partiellement incorrects, à partir de 2020.

J'ai trouvé que le retrait et le décalage étaient le plus gros problème lors de l'utilisation de UTF-8, donc je publie ceci comme une solution CSS compatible 2020 en utilisant la puce "triangle vertical" comme exemple.

ul {
    list-style: none;
    text-indent: -2em; // needs to be 1 + ( 2 x margin), and the result 'negative'
}

ul li:before {
    content: "\25B2";
    margin: 0 0.5em; // 0.5 x 2 = 1, + 1 offset to get the bullet back in the right spot
}

utiliser emcomme unité pour éviter les conflits avec la taille de la police

Beerswiller
la source
0

Essayez ce code ...

li:before {
    content: "→ "; /* caractère UTF-8 */
}
Charaf JRA
la source
-1

Ce sujet est peut-être ancien, mais voici une solution rapide ul {list-style:outside none square;}ou ul {list-style:outside none disc;}, etc ...

puis ajoutez un remplissage à gauche à l'élément de liste

ul li{line-height: 1.4;padding-bottom: 6px;}
user2415803
la source