Changer la couleur des puces d'une liste HTML sans utiliser span

88

Je me demandais s'il y avait un moyen de changer la couleur des puces dans une liste.

J'ai une liste comme celle-ci:

<ul>
   <li>House</li>
   <li>Car</li>
   <li>Garden</li>
</ul>

Il ne m'est pas possible d'insérer quoi que ce soit dans les li, comme un «span» ou un «p». Puis-je changer la couleur des puces mais pas le texte d'une manière intelligente?

Kim Andersen
la source

Réponses:

34

Si vous pouvez utiliser une image, vous pouvez le faire. Et sans image, vous ne pourrez pas modifier uniquement la couleur des puces et non le texte.

Utiliser une image

li { list-style-image: url(images/yourimage.jpg); }

Voir

image-style-liste

Sans utiliser d'image

Ensuite, vous devez modifier le balisage HTML et inclure une étendue dans la liste et colorer le li et l'étendue avec des couleurs différentes.

rahul
la source
1
Jep cela pourrait fonctionner. Mais en fait, j'ai décidé d'utiliser une image d'arrière-plan, puis un type de style liste: aucun; Cela m'a donné la liberté de positionner les "puces" un peu plus que l'image de style liste. Mais vous obtenez toujours le 1+ et la bonne réponse.
Kim Andersen
6
Fonctionne également avec les svgs data-uri:list-style-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"><circle fill="red" cx="5" cy="5" r="2"/></svg>');
Jon Surrell
En utilisant la méthode @JonSurrell, j'ai pu obtenir un résultat très agréable. C'est dommage que ce ne soit pas l'une des réponses suggérées. La solution est cross-browser pour post IE8 et facilement modifiable pour créer des formes personnalisées intéressantes.
KoldBane
@KoldBane voir ma nouvelle réponse :)
Jon Surrell
@DimitryK s'il vous plaît jetez un œil à la réponse complète que j'ai écrite et envoyez vos commentaires là-bas. Fonctionne bien dans FF43.
Jon Surrell
186

J'ai réussi cela sans ajouter de balisage, mais en utilisant à la place li:before. Cela a évidemment toutes les limitations de :before(pas d'ancien support IE), mais il semble fonctionner avec IE8, Firefox et Chrome après quelques tests très limités. Le style de puce est également limité par ce qui est en unicode.

li {
  list-style: none;
}
li:before {
  /* For a round bullet */
  content: '\2022';
  /* For a square bullet */
  /*content:'\25A0';*/
  display: block;
  position: relative;
  max-width: 0;
  max-height: 0;
  left: -10px;
  top: 0;
  color: green;
  font-size: 20px;
}
<ul>
  <li>foo</li>
  <li>bar</li>
</ul>

Marc
la source
5
Aussi, voici comment vous pourriez faire la même chose pour les listes ordonnées: jsfiddle.net/uZRGN
Nightfirecat
3
Excellent. Avec une utilisation aussi large d'IE8 +, je pense que cela devrait être la réponse maintenant. (Remarquez que j'avais l'habitude font-size:1emd'obtenir une balle mieux proportionnée!)
EvilDr
Je n'aime pas cette approche, car que se passe-t-il quand quelqu'un essaie de rendre un ul avec le type de style liste défini sur aucun? Cela signifie que vous devez étendre ces styles sous une classe, par exemple ul.greenDisc
ctb
19

Nous pouvons combiner list-style-image avec svgs, que nous pouvons inline en css ! Cette méthode offre un contrôle incroyable sur les "balles", qui peuvent devenir n'importe quoi.

Pour obtenir un cercle rouge, utilisez simplement le css suivant:

ul {
  list-style-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" width="10" height="10"><circle fill="red" cx="5" cy="5" r="2"/></svg>');
}

Mais ce n'est que le début. Cela nous permet de faire tout ce que nous voulons avec ces balles. les cercles ou les rectangles sont faciles, mais tout ce que vous pouvez dessiner avec svgvous pouvez y rester! Découvrez l'exemple ci-dessous:

Attributs largeur / hauteur

Certains navigateurs exigent widthque les heightattributs soient définis sur le<svg> , ou ils n'afficheront rien. Au moment de la rédaction de cet article, les versions récentes de Firefox présentent ce problème. J'ai défini les deux attributs dans les exemples.

Encodages

Un commentaire récent m'a rappelé les encodages pour le data-uri. Cela a été un problème pour moi récemment, et je peux partager un peu d'informations que j'ai recherchées.

La spécification data-uri , qui fait référence à la spécification URI , indique que le svg doit être codé selon la spécification URI . Cela signifie que toutes sortes de caractères doivent être encodés, par exemple <devient %3C.

Certaines sources suggèrent un encodage base64, qui devrait résoudre les problèmes d'encodage, mais cela augmentera inutilement la taille du SVG, contrairement à l'encodage URI. Je recommande l'encodage URI.

Plus d'informations:

support du navigateur: > ie8

astuces css sur svgs

mdn sur svgs

Jon Surrell
la source
1
C'est la meilleure réponse à ce jour, et cela fonctionne même avec des convertisseurs de présentation comme Cleaver.
gaborous
1
J'aime vraiment cette approche, car le style ne gâchera pas les utilisations irrégulières de ul, c'est-à-dire lorsque le type de style de liste est défini sur aucun, et aussi parce que cela ne dépend pas de l'encapsulation du contenu du li dans un autre élément. Cependant, cela ne fonctionne pas pour moi dans IE11 ou Edge ...?
ctb
@ctb Je n'ai pas testé ces navigateurs spécifiquement, mais avez-vous lu la mise en garde d'encodages? Vous ne pourrez peut-être pas copier / coller le <svg>code "joli" , essayez d'abord de l'exécuter via un encodeur uri.
Jon Surrell
1
@JonSurrell ouais, a fonctionné une fois que j'ai encodé le code svg. Thx, c'était super.
ctb
1
J'aime cette réponse car elle prend également en charge les tailles relatives telles que r = "1.5em"
plexoos
16

S'appuyant sur la solution de @ Marc - puisque le caractère de puce est rendu différemment avec différentes polices et navigateurs, j'ai utilisé la technique css3 suivante avec un rayon de bordure pour créer une puce sur laquelle j'ai plus de contrôle:

li:before {
    content: '';
    background-color: #898989;
    display: inline-block;
    position: relative;
    height: 12px;
    width: 12px;
    border-radius: 6px;
    -webkit-border-radius: 6px;
    -moz-border-radius: 6px;
    -moz-background-clip: padding;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
    margin-right: 4px;
    top: 2px;
}
Jessica
la source
1
@ddilsaver vous avez raison, je définissais la couleur d'arrière-plan dans une autre règle spécifique à chaque élément de campagne (le client voulait une couleur différente sur chacun). J ai mis a jour.
jessica
2
Très belle solution. Je suggérerais de changer le rayon de la bordure à 50% pour le rendre un peu plus flexible en cas de changement de hauteur / largeur.
Tim
10

Je sais que c'est une question vraiment, vraiment ancienne, mais je jouais avec ça et j'ai trouvé une façon que je n'ai pas vue publiée. Donnez une couleur à la liste, puis écrasez la couleur du texte à l'aide du ::first-linesélecteur. Je ne suis pas un expert, alors peut-être qu'il y a quelque chose qui ne va pas avec cette approche qui me manque, mais cela semble fonctionner.

li {
  color: blue;
}

li::first-line {
  color: black;
}
<ul>
  <li>House</li>
  <li>Car</li>
  <li>Garden</li>
</ul>

Lasse Jørgensen
la source
belle solution simple pour les listes à une seule ligne
planetClaire
6

Construire à la fois les solutions @Marc et @jessica - Voici la solution que j'utilise:

li { 
   position:relative;
}
li:before {
      content:'';
      display: block;
      position: absolute;
      width: 6px;
      height:6px;
      border-radius:6px;
      left: -20px;
      top: .5em;
      background-color: #000;
}

J'utilise empour les tailles de police, donc si vous définissez votre topvaleur, .5emelle sera toujours placée au milieu de votre première ligne de texte. J'ai utilisé left:-20pxparce que c'est la position par défaut des puces dans les navigateurs: parent padding/2

ddilsaver
la source
2

J'ai aussi beaucoup aimé la réponse de Marc - j'avais besoin d'un ensemble d'UL de couleurs différentes et évidemment, il serait plus facile d'utiliser simplement une classe. Voici ce que j'ai utilisé pour l'orange, par exemple:

ul.orange {
    list-style: none;
    padding: 0px;
}
ul.orange > li:before {
    content: '\25CF ';
    font-size: 15px;
    color: #F00;
    margin-right: 10px;
    padding: 0px;
    line-height: 15px;
}

De plus, j'ai trouvé que le code hexadécimal que j'utilisais pour "content:" était différent de celui de Marc (ce cercle hexadécimal semblait être un peu trop haut). Celui que j'ai utilisé semble s'asseoir parfaitement au milieu. J'ai également trouvé plusieurs autres formes (carrés, triangles, cercles, etc.) ici même

Beverly Lodge
la source
1

Pour moi, la meilleure option est d'utiliser des pseudo éléments CSS, donc pour discle style de puce, cela ressemblerait à ça:

ul {
  list-style-type: none;
}

li {
  position: relative;
}

li:before {
  content: '';
  display: block;
  position: absolute;
  width: 5px; /* adjust to suit your needs */
  height: 5px; /* adjust to suit your needs */
  border-radius: 50%;
  left: -15px; /* adjust to suit your needs */
  top: 0.5em;
  background: #f00; /* adjust to suit your needs */
}
<ul>
  <li>first</li>
  <li>second</li>
  <li>third</li>
</ul>

Remarques:

  • widthet heightdevrait avoir des valeurs égales pour garder les pointeurs arrondis
  • vous pouvez mettre border-radiusà zéro si vous voulez avoir des squarepuces de liste

Pour plus de styles de puces, vous pouvez utiliser d'autres formes css https://css-tricks.com/examples/ShapesOfCSS/ (choisissez ceci qui ne nécessite pas de pseudo éléments pour fonctionner, donc par exemple des triangles)

jmarceli
la source
1

::marqueur

Vous pouvez utiliser le ::markerpseudo-élément CSS pour sélectionner la zone de marqueur d'un élément de liste (c'est-à-dire des puces ou des nombres).

ul li::marker {
  color: red;
}

Remarque: au moment de publier cette réponse, cela est considéré comme une technologie expérimentale et n'a été implémenté que dans Firefox et Safari (jusqu'à présent).

Grant Miller
la source
Testé et fonctionne dans Firefox et Safari actuels. Voir le support pour les autres navigateurs https://caniuse.com
daniels
0

S'appuyant sur la réponse de @ ddilsaver. Je voulais pouvoir utiliser un sprite pour la balle. Cela semble fonctionner:

li {
  list-style: none;
  position: relative;
}

li:before {
  content:'';
  display: block;
  position: absolute;
  width: 20px;
  height: 20px;
  left: -30px;
  top: 5px;
  background-image: url(i20.png); 
  background-position: 0px -40px; /* or whatever offset you want */
}
James Whittred
la source
0

J'ai essayé cela aujourd'hui et
j'ai tapé ceci: j'avais besoin d'afficher des marqueurs de couleur dans mes listes (à la fois des puces et des nombres). Je suis tombé sur cette astuce et j'ai écrit dans ma feuille de style avec la mutualisation des propriétés:

ul,
ol {
  list-style: none;
  padding: 0;
  margin: 0 0 0 15px;
}
ul {}
ol {
  counter-reset: li;
}
li {
  padding-left: 1em; 
}
ul li {}
ul li::before,
ol li::before {
  color: #91be3c;
  display: inline-block;
  width: 1em;
}
ul li::before {
  content: "\25CF";
  margin: 0 0.1em 0 -1.1em;
}
ol li {
  counter-increment: li;
}
ol li::before {
  content: counter(li);
  margin: 0 0 0 -1em;
}

J'ai choisi un personnage différent pour afficher une puce, en la regardant ici . J'avais besoin d'ajuster la marge en conséquence, peut-être que les valeurs ne s'appliqueront pas avec la police que vous avez choisie (les chiffres utilisent votre police Web).

Mars
la source
0

Essayez plutôt d'utiliser ceci:

ul {
  color: red;
}
utilisateur3051730
la source
0

Version en ligne, fonctionne pour Outlook Desktop:

<ul style="list-style:square;">
  <li style="color:red;"><span style="color:black;">Lorem.</span></li>
  <li style="color:red;"><span style="color:black;">Lorem.</span></li>
</ul>

JSFiddle .

Daniel Ferreira
la source