Ändern Sie die Farbe der Aufzählungszeichen einer HTML-Liste, ohne span zu verwenden

88

Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Farbe der Kugeln in einer Liste zu ändern.

Ich habe eine Liste wie diese:

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

Es ist mir nicht möglich, irgendetwas in die Li einzufügen, wie zum Beispiel eine 'span' oder ein 'p'. Kann ich also die Farbe der Aufzählungszeichen ändern, aber nicht den Text auf intelligente Weise?

Kim Andersen
quelle

Antworten:

34

Wenn Sie ein Bild verwenden können, können Sie dies tun. Und ohne ein Bild können Sie nicht nur die Farbe der Aufzählungszeichen und nicht den Text ändern.

Verwenden eines Bildes

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

Sehen

Listenstil-Bild

Ohne ein Bild zu verwenden

Dann müssen Sie das HTML-Markup bearbeiten und einen Bereich in die Liste aufnehmen und das Li und den Bereich mit verschiedenen Farben färben.

rahul
quelle
1
Jep das könnte funktionieren. Aber eigentlich habe ich mich für ein Hintergrundbild und dann für einen Listenstil entschieden: keine; Dies gab mir die Freiheit, die "Kugeln" etwas mehr als das Bild im Listenstil zu positionieren. Trotzdem bekommst du die 1+ und richtige Antwort.
Kim Andersen
6
Funktioniert auch mit Data-Uri-SVGs: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
Mit der @ JonSurrell-Methode konnte ich ein sehr angenehmes Ergebnis erzielen. Es ist schade, dass es nicht eine der vorgeschlagenen Antworten ist. Die Lösung ist browserübergreifend für Post-IE8 und kann leicht geändert werden, um interessante benutzerdefinierte Formen zu erstellen.
KoldBane
@ KoldBane siehe meine neue Antwort :)
Jon Surrell
@DimitryK Bitte werfen Sie einen Blick auf die vollständige Antwort, die ich geschrieben habe, und richten Sie alle Kommentare dort. Funktioniert gut in FF43.
Jon Surrell
185

Ich habe dies ohne Hinzufügen von Markup geschafft, sondern mit li:before. Dies hat offensichtlich alle Einschränkungen von :before(keine alte IE-Unterstützung), aber es scheint nach einigen sehr begrenzten Tests mit IE8, Firefox und Chrome zu funktionieren. Der Aufzählungsstil wird auch durch die Unicode-Funktionen eingeschränkt.

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
quelle
5
Auch hier ist, wie Sie das gleiche für geordnete Listen tun könnten: jsfiddle.net/uZRGN
Nightfirecat
3
Ausgezeichnet. Bei einer derart breiten Nutzung von IE8 + sollte dies jetzt die Antwort sein. (Beachten Sie, dass ich früher font-size:1emeine besser proportionierte Kugel bekommen habe!)
EvilDr
Ich mag diesen Ansatz nicht, denn was passiert, wenn jemand versucht, eine ul mit einem Listenstil vom Typ none zu rendern? Es bedeutet, dass Sie diese Stile unter einer bestimmten Klasse einordnen
müssen
19

Wir können list-style-imagemit svgs kombinieren , was wir in CSS inline können ! Diese Methode bietet eine unglaubliche Kontrolle über die "Kugeln", die alles werden können.

Um einen roten Kreis zu erhalten, verwenden Sie einfach das folgende CSS:

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>');
}

Dies ist jedoch nur der Anfang. Dies ermöglicht es uns, mit diesen Kugeln alles zu tun, was wir wollen. Kreise oder Rechtecke sind einfach, aber alles, was Sie zeichnen können, svgkann dort bleiben! Schauen Sie sich das Bullseye-Beispiel unten an:

Attribute für Breite / Höhe

Einige Browser erfordern widthund heightAttribute müssen auf dem festgelegt werden<svg> , oder sie zeigen nichts an. Zum Zeitpunkt des Schreibens weisen neuere Versionen von Firefox dieses Problem auf. Ich habe beide Attribute in den Beispielen festgelegt.

Kodierungen

Ein kürzlich veröffentlichter Kommentar erinnerte mich an Codierungen für die Daten-Uri. Dies war in letzter Zeit ein Problem für mich und ich kann ein paar Informationen teilen, die ich recherchiert habe.

Die Daten-Uri-Spezifikation , die auf die URI-Spezifikation verweist , besagt, dass die SVG gemäß der URI-Spezifikation codiert werden sollte . Das bedeutet, dass alle Arten von Zeichen codiert werden sollten, z . B. <wird %3C.

Einige Quellen schlagen eine Base64-Codierung vor, die Codierungsprobleme beheben sollte, jedoch die Größe des SVG unnötig erhöht, während dies bei der URI-Codierung nicht der Fall ist. Ich empfehle die URI-Codierung.

Mehr Info:

Browser-Unterstützung: > ie8

CSS-Tricks auf SVGs

mdn auf svgs

Jon Surrell
quelle
1
Dies ist die bisher beste Antwort und funktioniert sogar mit Präsentationskonvertern wie Cleaver.
gaborous
1
Ich mag diesen Ansatz wirklich, weil der Stil unregelmäßige Verwendungen von ul nicht durcheinander bringt, dh wenn der Listenstil-Typ auf none gesetzt ist, und auch, weil es nicht darauf ankommt, den Inhalt des li in einen anderen zu packen Element. Es funktioniert jedoch nicht für mich in IE11 oder Edge ...?
CTB
@ctb Ich habe diese Browser nicht speziell getestet, aber haben Sie die Einschränkung der Codierungen gelesen? Möglicherweise können Sie den "hübschen" <svg>Code nicht kopieren / einfügen. Versuchen Sie zunächst, ihn über einen Uri-Encoder auszuführen.
Jon Surrell
1
@ JonSurrell Ja, hat funktioniert, als ich den SVG-Code verschlüsselt habe. Thx, das war großartig.
CTB
1
Ich mag diese Antwort, weil sie auch relative Größen wie r = "1.5em"
Plexoos
16

Aufbauend auf der Lösung von @ Marc - da das Aufzählungszeichen mit verschiedenen Schriftarten und Browsern unterschiedlich gerendert wird, habe ich die folgende CSS3-Technik mit Rahmenradius verwendet, um ein Aufzählungszeichen zu erstellen, über das ich mehr Kontrolle habe:

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
quelle
1
@ddilsaver Sie haben Recht, ich habe die Hintergrundfarbe in einer anderen Regel festgelegt, die für jede Werbebuchung spezifisch ist (der Kunde wollte für jede eine andere Farbe). ich habe aktualisiert.
Jessica
2
Sehr schöne Lösung. Ich würde vorschlagen, den Randradius auf 50% zu ändern, um ihn etwas flexibler zu machen, falls sich Höhe / Breite ändern.
Tim
10

Ich weiß, dass dies eine wirklich, wirklich, alte Frage ist, aber ich habe damit herumgespielt und mir einen Weg ausgedacht, den ich noch nicht gesehen habe. Geben Sie der Liste eine Farbe und überschreiben Sie die Textfarbe mit der ::first-lineAuswahl. Ich bin kein Experte, also stimmt vielleicht etwas mit diesem Ansatz nicht, aber es scheint zu funktionieren.

li {
  color: blue;
}

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

Lasse Jørgensen
quelle
schöne einfache Lösung für einzeilige Listen
planetClaire
6

Aufbau von @ Marc- und @ Jessica-Lösungen - Dies ist die Lösung, die ich verwende:

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

Ich verwende emfür Schriftgrößen. Wenn Sie also Ihren topWert so einstellen .5em, wird er immer an der Mitte Ihrer ersten Textzeile platziert. Ich habe verwendet, left:-20pxweil dies die Standardposition von Aufzählungszeichen in Browsern ist: Eltern padding/2

ddilsaver
quelle
2

Marc's Antwort hat mir auch sehr gut gefallen - ich brauchte einen Satz verschiedenfarbiger ULs und natürlich wäre es einfacher, nur eine Klasse zu verwenden. Folgendes habe ich zum Beispiel für Orange verwendet:

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;
}

Außerdem stellte ich fest, dass der Hex-Code, den ich für "content:" verwendete, anders war als der von Marc (dieser Hex-Kreis schien etwas zu hoch zu sein). Der, den ich benutzt habe, scheint perfekt in der Mitte zu sitzen. Ich habe hier auch einige andere Formen (Quadrate, Dreiecke, Kreise usw.) gefunden

Beverly Lodge
quelle
1

Für mich ist die beste Option die Verwendung von CSS-Pseudoelementen. Für das discAufzählungszeichen sieht es also so aus:

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>

Anmerkungen:

  • widthund heightsollten gleiche Werte haben, um Zeiger gerundet zu halten
  • Sie können border-radiusauf Null setzen , wenn Sie squareListenaufzählungszeichen haben möchten

Für weitere Aufzählungszeichenstile können Sie andere CSS-Formen verwenden. Https://css-tricks.com/examples/ShapesOfCSS/ (Wählen Sie diese Option , für die keine Pseudoelemente erforderlich sind, z. B. Dreiecke.)

jmarceli
quelle
1

::Marker

Sie können das ::markerCSS-Pseudoelement verwenden, um das Markierungsfeld eines Listenelements (dh Aufzählungszeichen oder Zahlen) auszuwählen.

ul li::marker {
  color: red;
}

Hinweis: Zum Zeitpunkt der Veröffentlichung dieser Antwort gilt dies als experimentelle Technologie und wurde (bisher) nur in Firefox und Safari implementiert.

Grant Miller
quelle
Getestet und funktioniert in aktuellen Firefox und Safari. Siehe Unterstützung für andere Browser https://caniuse.com
Daniels
0

Aufbauend auf der Antwort von @ ddilsaver. Ich wollte in der Lage sein, ein Sprite für die Kugel zu verwenden. Dies scheint zu funktionieren:

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
quelle
0

Ich habe dies heute versucht und Folgendes eingegeben:
Ich musste Farbmarkierungen in meinen Listen anzeigen (sowohl Aufzählungszeichen als auch Zahlen). Ich bin auf diesen Tipp gestoßen und habe in mein Stylesheet mit Gegenseitigkeit der Eigenschaften geschrieben:

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;
}

Ich habe einen anderen Charakter ausgewählt, um eine Kugel anzuzeigen, und sie hier angesehen . Ich musste den Rand entsprechend anpassen, möglicherweise gelten die Werte nicht für die von Ihnen gewählte Schriftart (die Zahlen verwenden Ihre Webschrift).

Mars
quelle
0

Versuchen Sie stattdessen Folgendes:

ul {
  color: red;
}
user3051730
quelle
0

Inline-Version, funktioniert für 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
quelle