Reputation: 17410
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
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
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.
list-style-type
to set a custom markerli { list-style-type: "π§ "; }
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
::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>
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.
::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>
list-style-type
<string>
(vs. list-style-type
)::marker
Upvotes: 5
Reputation: 1297
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...
background-size
is actually only as of IE9.list-style
(the more logical choice) easier.Enjoy.
Upvotes: 122
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
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
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
Reputation: 2554
Today, there is a ::marker
option. so,
li::marker {
content: "\2605";
}
Upvotes: 8
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
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
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
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
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
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
Reputation: 8334
Try this code...
li:before {
content: "β "; /* caractΓ¨re UTF-8 */
}
Upvotes: 0