AntonAL
AntonAL

Reputation: 17410

Unicode character as bullet for list-item in CSS

I need to use, for example, the star-symbol(β˜…) as the bullet for a list-item.

I have read the CSS3 module: Lists, that describes, how to use custom text as bullets, but it's not working for me. I think, the browsers simply don't support the ::marker pseudo element.

How can I do it, without using images?

Upvotes: 133

Views: 182217

Answers (14)

Garrison Terrusa
Garrison Terrusa

Reputation: 61

To expand on the top answer, and address the issues brought up regarding the overflowing lines not indenting properly, you could make the list items padding-left 20px (for example) and the position relative. Then in the li:before, set the position to absolute and left -20px;

Example:

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

ul li {
    position: relative;
}

ul li:before {
    content: '\2713';
    position: absolute;
    top: 0;
    left: -20px; // or whatever your padding-left is on the ul
    font-size: inherit;
    line-height: inherit;
}

I would have written this as a comment on the answer, but don't have enough points to post a comment, but hopefully this can help someone having this issue.

Upvotes: 0

mandynicole
mandynicole

Reputation: 155

As mentioned in these two comments, the modern approach is to use list-style-type or ::marker. You can also combine them depending on your use case.

One of the more notable setbacks with these methods is that you can't yet apply margin or padding to ::marker, and instead must rely on whitespace (as illustrated in the examples here) or use an offset method as outlined in the demo provided in 2.1 below.

1. Using list-style-type to set a custom marker

li { list-style-type: "πŸ”§ "; }
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>


2. Using ::marker to style list-style-type

/* intentional whitespace, may vary cross-browser */
li { list-style-type: "β˜…      "; } 
li::marker { color: red; }
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>

2.1 Spacing

While it's not immediately apparent in the demo above, the marker is moving away from the list as opposed to pushing itself into it. This means that it may fall outside of your grid and/or may become obscured by another element.

I've created a demo on Codepen that highlights the whitespace issue alongside two potential solutions depending on if you need to match the default ul styling or create something that's inside the parent container.


3. Using ::marker exclusively for variants:

li.one::marker { content: "πŸ₯‡ "; }
li.two::marker { content: "πŸ₯ˆ "; }
li.three::marker { content: "πŸ₯‰ "; }
<ul>
  <li class="one">1</li>
  <li class="two">2</li>
  <li class="three">3</li>
</ul>


Additional Resources:

Upvotes: 5

222
222

Reputation: 1297

Using Text As Bullets

Use li:before with an escaped Hex HTML Entity (or any plain text).


Example

My example will produce lists with check marks as bullets.

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

ul li:before
{
    content: '\2713';
    margin: 0 1em;    /* any design */
}
<ul>
  <li>First item</li>
  <li>Second item</li>
</ul>


Browser Compatibility

Haven't tested myself, but it should be supported as of IE8. At least that's what quirksmode & css-tricks say.

You can use conditional comments to apply older/slower solutions like images, or scripts. Better yet, use both with <noscript> for the images.

HTML:

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

About background images

Background images are indeed easy to handle, but...

  1. Browser support for background-size is actually only as of IE9.
  2. HTML text colors and special (crazy) fonts can do a lot, with less HTTP requests.
  3. A script solution can just inject the HTML Entity, and let the same CSS do the work.
  4. A good resetting CSS code might make list-style (the more logical choice) easier.

Enjoy.

Upvotes: 122

NicolasBernier
NicolasBernier

Reputation: 1606

Images are not recommended since they may appear pixelated on some devices (Apple devices with Retina display) or when zoomed in. With a character, your list looks awesome everytime.

Here is the best solution I've found so far. It works great and it's cross-browser (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;
}
<ul>
  <li>First item</li>
  <li>Second item</li>
</ul>

The important thing is to have the character in a floating block with a fixed width so that the text remains aligned if it's too long to fit on a single line. 1.2em is the width you want for your character, change it for your needs. Don't forget to reset padding and margin for ul and li elements.

EDIT: Be aware that the "1.2em" size may vary if you use a different font in ul and li:before. It's safer to use pixels.

Upvotes: 15

defann
defann

Reputation: 359

You can construct it:

#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;
}
<ul id="modal-select-your-position">
  <li>First item</li>
  <li>Second item</li>
</ul>

Upvotes: 35

Real Dreams
Real Dreams

Reputation: 18010

This is the W3C solution. You can use it in 3012!

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

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

Update: according to the comments this works in all modern browsers in 2021.

Upvotes: 42

PMO1948
PMO1948

Reputation: 2554

Today, there is a ::marker option. so,

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

Upvotes: 8

Beerswiller
Beerswiller

Reputation: 679

I've been through this whole list and there are partially correct and partially incorrect elements right through, as of 2020.

I found that the indent and offset was the biggest problem when using UTF-8, so I'm posting this as a 2020 compatible CSS solution using the "upright triangle" bullet as my example.

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
}

use em as the unit to avoid conflict with font sizing

Upvotes: 2

whallz
whallz

Reputation: 2613

EDIT

I probably wouldn't recommend using images anymore. I'd stick to the approach of using a Unicode character, like this:

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

OLD ANSWER

I'd probably go for an image background, they're much more efficient versatile and cross-browser-friendly.

Here's an example:

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

Upvotes: 85

Iacchus
Iacchus

Reputation: 2838

ul {
    list-style-type: none;    
}

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

Upvotes: 3

user2415803
user2415803

Reputation: 1

This topic may be old, but here's a quick fix ul {list-style:outside none square;} or ul {list-style:outside none disc;} , etc...

then add left padding to list element

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

Upvotes: -1

Dirk
Dirk

Reputation: 89

To add a star use the Unicode character 22C6.

I added a space to make a little gap between the li and the star. The code for space is A0.

li:before {
    content: '\22C6\A0';
}

Upvotes: 8

pospi
pospi

Reputation: 3580

A more complete example of 222's answer:

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

I have included star-hack properties to restore the default list styles in older IE versions. You could pull these out and include them in a conditional include if desired, or replace with a background-image based solution. My humble opinion is that special bullet styles implemented in this manner should degrade gracefully on the few browsers that don't support pseudoselectors.

Tested in Firefox, Chrome, Safari and IE8-10 and renders correctly in all.

Upvotes: 4

Charaf JRA
Charaf JRA

Reputation: 8334

Try this code...

li:before {
    content: "→ "; /* caractère UTF-8 */
}

Upvotes: 0

Related Questions