AI CSS List Style — Custom List Markers, Bullets, and Numbering
Lists are everywhere on the web. Navigation menus, feature comparisons, step-by-step instructions, pricing tables, FAQ sections — they all rely on HTML lists under the hood. Yet most developers leave list styling at the browser defaults: plain black circles for unordered lists and sequential numbers for ordered lists. The CSS list-style property family gives you full control over markers, positioning, and appearance, turning generic lists into design elements that match your brand.
An AI CSS list-style generator helps you explore every marker option, preview custom bullets and numbering schemes, and export clean CSS that works across browsers without the trial-and-error of manual tweaking.
The List Style Shorthand
The list-style shorthand combines three sub-properties into one declaration: list-style-type, list-style-position, and list-style-image:
/* Shorthand: type | position | image */
ul {
list-style: square inside none;
}
/* Equivalent longhand */
ul {
list-style-type: square;
list-style-position: inside;
list-style-image: none;
}
In practice, most developers use the shorthand for simple cases and break out individual properties when they need fine-grained control. The order in the shorthand is flexible — the browser identifies each value by its type rather than position.
Built-in List Style Types
CSS provides dozens of built-in marker types beyond the familiar disc, circle, and square. Many developers never explore past the defaults, but the options cover international numbering systems, alphabetic sequences, and symbolic markers:
/* Common unordered markers */
.bullets-disc { list-style-type: disc; } /* ● filled circle (default) */
.bullets-circle { list-style-type: circle; } /* ○ hollow circle */
.bullets-square { list-style-type: square; } /* ■ filled square */
/* Ordered numbering systems */
.numbers { list-style-type: decimal; } /* 1, 2, 3 */
.leading-zero { list-style-type: decimal-leading-zero; } /* 01, 02, 03 */
.roman { list-style-type: upper-roman; } /* I, II, III */
.roman-lower { list-style-type: lower-roman; } /* i, ii, iii */
.alpha { list-style-type: upper-alpha; } /* A, B, C */
.alpha-lower { list-style-type: lower-alpha; } /* a, b, c */
/* International numbering */
.cjk { list-style-type: cjk-decimal; } /* 一, 二, 三 */
.georgian { list-style-type: georgian; } /* ა, ბ, გ */
.ethiopic { list-style-type: ethiopic-numeric; } /* ፩, ፪, ፫ */
These built-in types handle numbering logic automatically, including proper sequencing for complex scripts. For more advanced numbering with custom formats, see our CSS counter generator guide.
Custom Markers with ::marker
The ::marker pseudo-element gives you direct styling control over list markers without removing the default list behavior. This is the modern approach to custom bullets:
/* Style the marker directly */
li::marker {
color: #6c5ce7;
font-size: 1.2em;
font-weight: bold;
}
/* Emoji markers */
ul.features li::marker {
content: "✅ ";
}
ul.warnings li::marker {
content: "⚠️ ";
}
/* Numbered with custom format */
ol.steps li::marker {
content: "Step " counter(list-item) ": ";
color: #00cec9;
font-weight: 600;
}
::marker pseudo-element has limited styleable properties compared to regular elements. You can set color, content, font properties, direction, unicode-bidi, and animation properties. For full creative control, use the ::before pseudo-element approach described below.Full Custom Markers with ::before
When ::marker is too limited, remove the default marker and use ::before for complete control over size, position, color, and even animation:
/* Remove default markers */
ul.custom {
list-style: none;
padding-left: 0;
}
ul.custom li {
padding-left: 1.5em;
position: relative;
}
/* Custom SVG-like bullet */
ul.custom li::before {
content: "";
position: absolute;
left: 0;
top: 0.6em;
width: 6px;
height: 6px;
background: #6c5ce7;
border-radius: 50%;
}
/* Gradient bullet */
ul.gradient li::before {
content: "";
position: absolute;
left: 0;
top: 0.5em;
width: 8px;
height: 8px;
background: linear-gradient(135deg, #6c5ce7, #00cec9);
border-radius: 50%;
}
This technique is widely used in marketing pages, landing pages, and documentation sites where brand-consistent bullet styling matters. The tradeoff is more CSS to maintain, but you get pixel-perfect control over every aspect of the marker.
Marker Position: Inside vs Outside
The list-style-position property controls whether markers sit outside or inside the content flow of each list item:
/* Outside (default): marker in the margin */
ul.outside {
list-style-position: outside;
padding-left: 1.5em;
}
/* Inside: marker flows with text */
ul.inside {
list-style-position: inside;
padding-left: 0;
}
With outside (the default), markers hang in the left margin and text wraps neatly below the first line. With inside, the marker is part of the text flow, so wrapped lines start at the left edge of the marker rather than aligning with the text above. For most content, outside produces cleaner results. Use inside when you need markers contained within a bordered or background-colored box.
Removing List Styles
Navigation menus, card grids, and tag lists often use <ul> for semantic structure but need no visible markers. Resetting list styles is one of the most common CSS patterns:
/* Complete reset */
.nav-list {
list-style: none;
margin: 0;
padding: 0;
}
/* Reset with flexbox layout */
.tag-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
When you remove list styles for navigation, keep the <ul> and <li> elements for accessibility. Screen readers use the list structure to announce how many items exist and let users navigate between them. Add role="list" if you find that some screen readers drop list semantics when list-style: none is applied (Safari VoiceOver does this). For more on accessible design patterns, see our color contrast accessibility guide.
Nested List Styling
Multi-level lists need visual differentiation between nesting levels. You can use different marker types at each depth:
/* Level 1: filled circle */
ul { list-style-type: disc; }
/* Level 2: hollow circle */
ul ul { list-style-type: circle; }
/* Level 3: square */
ul ul ul { list-style-type: square; }
/* Ordered nested lists */
ol { list-style-type: decimal; } /* 1, 2, 3 */
ol ol { list-style-type: lower-alpha; } /* a, b, c */
ol ol ol { list-style-type: lower-roman; } /* i, ii, iii */
For complex document outlines with numbering like “1.1.2”, CSS counters provide automatic hierarchical numbering. Our CSS counter generator covers this pattern in detail.
List Images and SVG Markers
The list-style-image property lets you use any image as a bullet marker, but it comes with limitations — you cannot control the size or vertical alignment of the image:
/* Image as bullet (limited control) */
ul.image-bullets {
list-style-image: url('checkmark.svg');
}
/* Better approach: background image on li */
ul.svg-bullets {
list-style: none;
padding-left: 0;
}
ul.svg-bullets li {
padding-left: 1.8em;
background-image: url('checkmark.svg');
background-repeat: no-repeat;
background-position: 0 0.3em;
background-size: 1em 1em;
}
The background-image approach gives you full control over sizing and positioning. For inline SVGs, the ::before method with encoded SVG in the content property or background works even better since it avoids extra HTTP requests. Combine this with CSS custom properties to make marker colors themeable.
Building Better Lists
Lists are structural elements that deserve the same design attention as headings and buttons. Whether you need simple bullet swaps, emoji markers, gradient bullets, or hierarchical numbering, CSS gives you the tools. The AI CSS List Style Generator lets you experiment with every option visually, preview how markers look with your actual content, and export the CSS you need without memorizing dozens of property values.
Explore built-in markers, emoji bullets, custom numbering, and nested list patterns. Preview with your content and export production-ready CSS.
Try AI CSS List Style Generator →
Pair list styling with CSS multi-column layouts for newspaper-style lists, or use CSS counters for complex document numbering. The AI CSS List Style Generator is the fastest way to find the right combination for your design.