List Marker - how to Style💅
^^this is a List Marker. These little visual denotations to literally mark an item, inside a list. They can be different in shape or form, like alpha-numeric characters, symbols such as discs / dashes, and even custom characters (if you so wish it to be).
And this is all great, and to most, this level of basic customisation out of the box for a list would be enough. But is it though? 🤔 For years, Developers would provide a hack in CSS to remove the List Marker, style something in it's place, and override it. It was convoluted, and a bit wild, but overtime we became over-reliant on it. Even now I still see it in use today.
List structure
<ul>List: <li>List item </ul>
The HTML above is a basic List, unordered, with a single list item. But what if we wanted to customise the list marker using that hack, we would target the ::before
pseudo-element of the List Item to override the marker using the content
CSS property along with a bunch of other properties like display
& background
. As an example, let's say you wanted to customise your List Item with an image.... 👇
li::before { content: ''; display: inline-block; height: 25px; width: 25px; background-image: url('path-to-image.png'); background-size: contain; background-repeat: no-repeat; }
But now....(and actually since 2015 I believe 😅) we can just do this instead:
li::marker { content: url('path-to-image.png'); }
From 7 lines of CSS...to 1. Sure, you might argue it's not really down to only 1 because you might want to re-add those size property constrants or other CSS properties for extra customisation. But still, we now have a direct selector that we can use to customise those List Markers. 👏👏👏The only caveat here is that the List Marker must have a display: list-item
native to the pseudo-element itself or specified direct in our CSS.
Believe it or not, this really opens the door to continue adding value to your unique designs / branding persona on the web. The ::marker
pseudo-element can even be animated in CSS. As with all pseudo-elements however, they are not natively part of the DOM and don't interact in the typical fashion that a normal Element would, hence the term pseudo, (as in....not genuine to the DOM 🙈🙊🙉).
Extending Functionality across other HTML List / Group elements
Are you a fan of Description Lists and their respective nested children....or maybe you need to use a native HTML collapse element such as the Details & Summary combo? Well no sweat, ::marker
will work for those too.
Example using it with Description Lists:
Here we have a Description List with a single nested Description Term, and a sibling Description Detail:
<dl> <dt>Halloween:</dt> <dd>Is the best holiday of the year. All of the spoops!</dd> </dl>
Now as it is highlighting the best holiday of the year. 👻🎃 We can use some emojis to add some flair to it.
dt { display: list-item; } dt::marker { content: '👻'; } dd::marker { content: '🎃'; }
If you want to see more of this in action, I have an old Codepen with some example, and even one example that takes an SVG as the List Marker, (I have it currently commented out as the SVG is massive 🙈😅). In this codepen, I even have a Details element with a child Summary element doing some fun little things with a custom List Marker and content update depending on the open/closed state of the parent Details element, .....all being controlled in CSS. Crazy right? 🤯 Take a look:
Happy Halloween 😈😈 Spruce up your CSS with some custom List Markers. Share your own CSS tips and tricks too. 🤜