Hello everyone, surely when doing Front-end many times you will encounter the keyword ‘Step Progress Bar’ (from here I will call it SPB for short). What does it mean? SPB is basically a simulation of process steps in a certain event stream. For example, the shopping cart function includes: Add products to the cart> Confirm the shopping cart> Checkout, or account registration function including: Fill information> Confirmation> Register, blabla … Thus, thanks to SPB, users can easily know which step they are in to easily interact with the system, and in this article, I will work with you to build SPB entirely with CSS.
In this article I will demo the flow of 5 steps and we are in step 3 , ie step 1 and 2 are completed . Other cases are similar. The final product will look like this
Steps to take
Step 1: Create the HTML structure
The HTML structure as described above will be as follows
1 2 3 4 5 6 7 8 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> ul</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> progressbar <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> li</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> complete <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Step 1 <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> li</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> li</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> complete <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Step 2 <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> li</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> li</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> active <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Step 3 <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> li</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> li</span> <span class="token punctuation">></span></span> Step 4 <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> li</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> li</span> <span class="token punctuation">></span></span> Step 5 <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> li</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> ul</span> <span class="token punctuation">></span></span> |
Step 2: Basic style for ul
and li
tags
Next we will need CSS for ul
and li
tags. There are some points to note that the parent ul
tag will need the counter-reset
to initialize the CSS counter, and the li tags will float: left
to lie on the same line and have the same width: calc(100% / 5)
ie width: calc(100% / 5)
(because I have 5 steps )
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token selector">.progressbar</span> <span class="token punctuation">{</span> <span class="token property">counter-reset</span> <span class="token punctuation">:</span> step <span class="token punctuation">;</span> <span class="token property">padding</span> <span class="token punctuation">:</span> 0 <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">.progressbar li</span> <span class="token punctuation">{</span> <span class="token property">float</span> <span class="token punctuation">:</span> left <span class="token punctuation">;</span> <span class="token property">list-style</span> <span class="token punctuation">:</span> none <span class="token punctuation">;</span> <span class="token property">position</span> <span class="token punctuation">:</span> relative <span class="token punctuation">;</span> <span class="token property">text-align</span> <span class="token punctuation">:</span> center <span class="token punctuation">;</span> <span class="token property">width</span> <span class="token punctuation">:</span> <span class="token function">calc</span> <span class="token punctuation">(</span> 100% / 5 <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Step 3: Style for li:before
The dots we will use :before
to create, in addition to the basic styles you need to note content: counter(step)
and counter-increment: step
, will help us fill the above-created counter to each step. This will prevent you from having to manually fill in the count for each step
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token selector">.progressbar li:before</span> <span class="token punctuation">{</span> <span class="token property">background</span> <span class="token punctuation">:</span> #fff <span class="token punctuation">;</span> <span class="token property">border</span> <span class="token punctuation">:</span> 2px solid #bebebe <span class="token punctuation">;</span> <span class="token property">border-radius</span> <span class="token punctuation">:</span> 50% <span class="token punctuation">;</span> <span class="token property">color</span> <span class="token punctuation">:</span> #bebebe <span class="token punctuation">;</span> <span class="token property">content</span> <span class="token punctuation">:</span> <span class="token function">counter</span> <span class="token punctuation">(</span> step <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token property">counter-increment</span> <span class="token punctuation">:</span> step <span class="token punctuation">;</span> <span class="token property">display</span> <span class="token punctuation">:</span> block <span class="token punctuation">;</span> <span class="token property">font-weight</span> <span class="token punctuation">:</span> 700 <span class="token punctuation">;</span> <span class="token property">height</span> <span class="token punctuation">:</span> 30px <span class="token punctuation">;</span> <span class="token property">line-height</span> <span class="token punctuation">:</span> 27px <span class="token punctuation">;</span> <span class="token property">margin</span> <span class="token punctuation">:</span> 0 auto 10px <span class="token punctuation">;</span> <span class="token property">text-align</span> <span class="token punctuation">:</span> center <span class="token punctuation">;</span> <span class="token property">width</span> <span class="token punctuation">:</span> 30px <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Step 3: Style for li:after
Next we will create a horizontal line connecting the dots with each other by using :after
1 2 3 4 5 6 7 8 9 10 11 | <span class="token selector">.progressbar li:after</span> <span class="token punctuation">{</span> <span class="token property">background</span> <span class="token punctuation">:</span> #979797 <span class="token punctuation">;</span> <span class="token property">content</span> <span class="token punctuation">:</span> <span class="token string">''</span> <span class="token punctuation">;</span> <span class="token property">height</span> <span class="token punctuation">:</span> 3px <span class="token punctuation">;</span> <span class="token property">left</span> <span class="token punctuation">:</span> -50% <span class="token punctuation">;</span> <span class="token property">position</span> <span class="token punctuation">:</span> absolute <span class="token punctuation">;</span> <span class="token property">top</span> <span class="token punctuation">:</span> 15px <span class="token punctuation">;</span> <span class="token property">width</span> <span class="token punctuation">:</span> 100% <span class="token punctuation">;</span> <span class="token property">z-index</span> <span class="token punctuation">:</span> -1 <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
However, after adding, you will see 5 dots but there will only be 4 lines so we have to delete a line of the first child item by adding the following CSS line.
1 2 3 4 | <span class="token selector">.progressbar li:first-child:after</span> <span class="token punctuation">{</span> <span class="token property">content</span> <span class="token punctuation">:</span> none <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Step 4: Add own styles for the active
and complete
states
And finally, to distinguish the active
and complete
states, we will add a bit of CSS for :before
:after
as follows
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token selector">.progressbar li.active:after, .progressbar li.complete:after</span> <span class="token punctuation">{</span> <span class="token property">background</span> <span class="token punctuation">:</span> #3aac5d <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">.progressbar li.active:before, .progressbar li.complete:before</span> <span class="token punctuation">{</span> <span class="token property">background</span> <span class="token punctuation">:</span> #3aac5d <span class="token punctuation">;</span> <span class="token property">border-color</span> <span class="token punctuation">:</span> #3aac5d <span class="token punctuation">;</span> <span class="token property">color</span> <span class="token punctuation">:</span> #fff <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">.progressbar li.active</span> <span class="token punctuation">{</span> <span class="token property">color</span> <span class="token punctuation">:</span> #3aac5d <span class="token punctuation">;</span> <span class="token property">font-weight</span> <span class="token punctuation">:</span> 700 <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">.progressbar li.complete</span> <span class="token punctuation">{</span> <span class="token property">color</span> <span class="token punctuation">:</span> #333 <span class="token punctuation">;</span> <span class="token property">font-weight</span> <span class="token punctuation">:</span> 700 <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
You can see the result quickly here
Advantages
Advantages
- Responsive is good because there is no hard fix width for each step
- Works well on many browsers
- Automatically fill the CSS counter for each step without manual input
Defect
- Due to the use of
float
andwidth
, we always need to change thewidth
value if the number of steps changes, which makes us consider thinking of a more flexible way of dividing width by usingflex: 1
may come. In the following articles, let’s wait and see =))
Conclude
Above I have introduced to you ‘Step by step building Step Progress Bar with CSS’, hope to help you when working
If you find a good article, give me +1 upvote. If you like me, click the follow button for more cool stuff. Good luck !