Lists—we’ve all worked with them in one form or another. I’m talking about HTML’s <ol>
and <ul>
. Much of the time, because we desire styling control, we turn off the list’s markers completely with list-style-type: none
, and start styling from there. Other times, we choose from a very limited set of unordered list markers, such as disc
, circle
, or square
; or a (much) wider range of ordered list markers. We might even, from time to time, supply the URL of an image to be used.
But what if we want to style the markers differently than the contents of the list items? That’s always been difficult at best. Now, thanks to the ::marker
pseudo-element, it’s a whole lot easier. You don’t get the full range of CSS to apply to the markers, but there’s still a great deal that can be done.
::marker
is available in Firefox and, thanks to work by Igalia, Chrome as well.
Consider this list:
By default, that will yield an ordered list numbered from 1 to 5, using Arabic numerals (1, 2, 3, etc.), each followed by a dot (period), all of which will match the text contents in font face, size, style, color, and so on.
If you had a design direction that required making the numbers smaller or a different color, you’d have to manually create that effect by suppressing the markers and using the ::before
pseudo-element and CSS counters and negative text indenting and… well, it would take a scientist to explain it all.
Enter ::marker
. Add these styles to the above list, and you’ll get the result shown after.
That’s all you need!
Before you go tearing off to rewrite all your CSS, though, beware: the properties you can apply via ::marker
are fairly limited at the moment. As of February 2021, the properties that markers should recognize are:
- All font properties (
font-face
,font-size
, etc.) - The
white-space
property - The
color
property - The internationalization properties
text-combine-upright
,unicode-bidi
, anddirection
- The
content
property - All animation and transition properties
There are some additions in some browsers, but almost all of the additions relate to text styling, not the box model. So if you were thinking you could put all your list numbers into circles with shaded backgrounds, ::marker
won’t get you there—you’ll have to return to the hackfest of ::before
generated content. For now, anyway: the specification explicitly says more properties may be permitted for ::marker
in the future.
There’s also a limitation around white-space
, which has rendering bugs in varying browsers. Chrome, for example, treats all whitespace in markers as white-space: pre
as the specification says, but won’t let you change it. This should be fixed when Chrome’s LayoutNG (Next Generation) ships, but not until then. Firefox, on the other hand, ignores any white-space
values, and treats whitespace like normal-flow text by default.
With those limits in mind, you can still jazz up your markers with the content
property. Instead of numbers followed by a period, you can put each number in brackets with a combination of counters and strings.
Note the space after the closing bracket in the content
value. That’s included to provide a little bit of space between the marker and the list content. Ordinarily you might think to use a marking or padding, but as we saw earlier, those properties can’t be applied with ::marker
. Which is frustrating! Also note the CSS counter list-item
. That wasn’t defined anywhere else in the CSS—it’s a built-in counter that all browsers (that understand CSS counters) use to count list items, like those in ordered lists. You can use it in your CSS as well!
If all you want to do is change the text content of a list marker and don’t care about changing any of its styles, you can do that with ::marker
, or you can do it with the new cross-browser support for string values on the list-style-type
property.
li.warning {
list-style-type:"⚠";
}
So that’s what’s new in the world of list markers. It might not be something you need to do often, but if you ever do, it’s good to know that the capabilities in this area have increased, and stand to be even better in the future. Let us know if you come up with some clever markers!
This post made me think… essentially ul and ol are a “text” thing..while we (I do) are using them endlessly in our interfaces. That means list-style-type:none; since forever in every css stylesheet and then reformatting when you need to format “text” uls /ols.
Is that ideal? Should we get rid of UL in our menus, list of everything? Maybe we could foster a new tag? nl not styled list?
Right. Anything can be a list. What are the benefits of
<ul>
,<ol>
, andmenu
if we undo their built in styles anyway? Do screen readers or other accessibility features recognize<ul>
,<ol>
, andmenu
over custom elements?I never knew there is a built-in counter that I can use with unordered list items, Thank you. No matter how long we’ve been writing CSS, there is always something new to learn!