I am trying to create an ordered list of tasks. As each task is completed, the task turns green, and the line becomes solid. I am looking for help on the static example below.
I have seen some examples of doing this, but I am struggling with the lines and colors. If I use ul li.circle:after for the circle, and ul li.circle:before for the line, I can get it to connect, but they all become solid lines, I cant figure out how to interchange with a dotted line. I would like to use list items to define the line, and color of circle.
In the css there is padding: 0 0 20px 50px; which is why the lines do not connect to the dots as desired, but without the padding, there is no spacing between. To change the color, I can change the color of all, using before/after but I cannot add another class as shown below for the color.
The start css class should be a line with a top, like a letter T, and the arrowDown should have a stem to connect to the dotted line.
The CSS File and lay out of the page:
.red {
background: #ff0000;
}
.green {
background: #00ff00;
}
.start {
/* polygon? T like shape*/
}
ul {
max-width: 400px;
margin: 0 auto;
list-style-type: none;
margin: 0;
font-family: sans-serif;
color: #ffffff;
}
ul li {
padding: 0 0 20px 50px;
position: relative;
margin: 0;
}
/* Circle */
ul li.circle:after {
position: absolute;
color: #ccc;
top: 0;
left: 0;
content: '';
border: 2px solid #fff;
border-radius: 50%;
height: 24px;
width: 24px;
text-align: center;
line-height: 24px;
background: #000000;
}
/* Circle
ul li.circle:before {
position: absolute;
left: 10px;
top: 0px;
content: "";
height: 100%;
width: 0;
border-left: 2px solid #ffffff;
}
*/
/* Line */
ul li.line:before {
position: absolute;
left: 10px;
top: 0px;
content: "";
height: 100%;
width: 0;
border-left: 2px solid #ffffff;
}
/* dottedLine */
ul li.dottedLine:before {
position: absolute;
left: 10px;
top: 0px;
content: "";
height: 100%;
width: 0;
border-left: 2px dotted #ffffff;
}
/* Missing the stem */
ul li.arrowDown:after {
position: absolute;
transform: rotate(45deg);
top: 10px;
left: 4px;
content: '';
display: inline-block;
text-align: center;
line-height: 24px;
border: solid #ffffff;
border-width: 0px 3px 3px 0px;
display: inline-block;
padding: 6px;
}
<li>
<li class="start">Monday</li>
<li class="line"></li>
<li class="circle green">Task 1</li>
<li class="line"></li>
<li class="circle green">Task 2</li>
<li class="dottedLine"></li>
<li class="circle red">Task 3</li>
<li class="dottedLine"></li>
<li class="arrowDown">Tuesday</li>
</ul>
Please see the attached for desired output from above.
enter image description here
Firstly your opening ul is a li
Then to style as you want you would need to add a height to .line and .dottedline classes like so.
ul li.line, ul li.dottedLine {
height: 20px
}
make you padding padding: 0 0 10px 50px; for ul li
For you start class use a before pseudo class
For you circle background colour add the color to the ul li.circle:after and then over ride it for ul li.red:after
Here is the code with adjustments
body {
background: black;
}
.red {
/* Not needed add color to pseudo element
* background: #ff0000;*/
}
.green {
/* Not needed add color to pseudo element
* background: #00ff00;*/
}
.start {
/* See below: ul li.start:before */
}
ul {
max-width: 400px;
margin: 0 auto;
list-style-type: none;
margin: 0;
font-family: sans-serif;
color: #ffffff;
}
ul li {
padding: 0 0 10px 50px;
position: relative;
margin: 0;
}
/* Circle */
ul li.circle:after {
position: absolute;
color: #ccc;
top: 0;
left: 0;
content: '';
border: 2px solid #fff;
border-radius: 50%;
height: 24px;
width: 24px;
text-align: center;
background: #00ff00;
}
ul li.red:after {
background: #ff0000;
}
/* Line */
ul li.line {
list-style-type:none;
}
ul li.line, ul li.dottedLine {
height: 20px;
}
/* make the first line which is 2nd child 0 */
ul li:nth-child(2) {
height: 10px;
}
ul li.line:before {
position: absolute;
left: 13px;
top: 0px;
content: "";
height: 100%;
width: 0;
border-left: 2px solid #ffffff;
}
/* dottedLine */
ul li.dottedLine:before {
position: absolute;
left: 13px;
top: 0px;
content: "";
height: 100%;
width: 0;
border-left: 2px dotted #ffffff;
}
/* Start T top added */
ul li.start:before {
position: absolute;
content: "";
width: 26px;
left: 0;
top: 24%;
border-top: 2px solid #ffffff;
background: white;
}
/* Missing the stem
* stem added with pseudo class
* start:after slightly modified below
*/
ul li.start:after, ul li.arrowDown:before {
position: absolute;
left: 13px;
top: 0px;
content: "";
height: 90%;
width: 0;
border-left: 2px solid #ffffff;
}
ul li.start:after {
top: 24%;
height: 78%;
}
ul li.arrowDown:after {
position: absolute;
transform: rotate(45deg);
top: 10px;
left: 7px;
content: '';
display: inline-block;
text-align: center;
line-height: 24px;
border: solid #ffffff;
border-width: 0px 3px 3px 0px;
display: inline-block;
padding: 6px;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<ul>
<li class="start">Monday</li>
<li class="line"></li>
<li class="circle green">Task 1</li>
<li class="line"></li>
<li class="circle green">Task 2</li>
<li class="dottedLine"></li>
<li class="circle red">Task 3</li>
<li class="dottedLine"></li>
<li class="arrowDown">Tuesday</li>
</ul>
</body>
</html>
Related
I modified 3 different peoples code to make css arrows and I think I made it more complicated than it needs to be. Any CSS expert than can help me clean this up?
I can't seem to modify padding and other attributes to get this where I want it within the divs.
css
<style>
/* These are the Stage Arrows - styles */
#testStatus {
position: relative;
width: auto;
height: 30px;
left: 10px;
}
.testStatus li {
position: relative;
text-indent: 10px;
height: 30px;
display: inline-block;
zoom: 1;
margin-left: -3px;
padding: 10px 10px 10px 10px;
color: white;
font-size: 12px;
text-align: center;
line-height: auto;
}
ul.testStatus {
list-style: none;
}
li.testStatus:first-child:after, li.testStatusGood:after, li.testStatusNoGood:after {
content: "";
position: absolute;
width: 0;
height: 0;
border-top: 15px solid transparent;
border-left: 10px solid #767676;
border-bottom: 15px solid transparent;
margin: -10px 0px 0px 10px;
z-index: 3;
}
li.testStatus:last-child:before, li.testStatusGood:before, li.testStatusNoGood:before {
content: "";
position: absolute;
width: 0;
height: 0;
left: 0;
border-top: 15px solid transparent;
border-left: 10px solid #EEEEEE;
border-bottom: 15px solid transparent;
margin: -10px 0px 0px 0px;
z-index: 2;
}
li.testStatus:first-child {
padding-left: 10px;
margin-left: 0;
background-color: #767676;
}
li.testStatus:last-child {
padding-right: 10px;
background-color: #767676;
}
li.testStatusGood {
background-color: #77a942;
}
li.testStatusGood:after {
border-left: 10px solid #77a942;
}
li.testStatusNoGood {
background-color: #c42c00;
}
li.testStatusNoGood:after {
border-left: 10px solid #c42c00;
}
/* End arrow formatting */
</style>
html
<ul>
<li>
<div id="testStatus">
<ul class="testStatus">
<li class="testStatus">Step 1</li>
<li class="testStatusGood">Step 2</li>
<li class="testStatusNoGood">Step 3</li>
<li class="testStatusNoGood">Step 4</li>
<li class="testStatus">Step 5</li>
</ul>
</div>
</li>
</ul>
My arrows display nicely but I am having difficulty adjusting the padding to 0. I've tried the #, the ul class, the il class and I am a bit baffled why I cannot remove the 10px (I believe its the padding).
There is also a faintly darker border on the left side of the triangular portion of the arrows, if you look closely, that I'd like to have match the color exactly.
Duo's code output above image, Ojer code output below image
I'm going backwards :)
Here you go:
.breadcrumbs {
border: 1px solid #cbd2d9;
border-radius: 0.3rem;
display: inline-flex;
overflow: hidden;
}
.breadcrumbs__item {
background: #fff;
color: #333;
outline: none;
padding: 0.75em 0.75em 0.75em 1.25em;
position: relative;
text-decoration: none;
transition: background 0.2s linear;
}
.breadcrumbs__item:hover:after,
.breadcrumbs__item:hover {
background: #edf1f5;
}
.breadcrumbs__item:focus:after,
.breadcrumbs__item:focus,
.breadcrumbs__item.is-active:focus {
background: #323f4a;
color: #fff;
}
.breadcrumbs__item:after,
.breadcrumbs__item:before {
background: white;
bottom: 0;
clip-path: polygon(50% 50%, -50% -50%, 0 100%);
content: "";
left: 100%;
position: absolute;
top: 0;
transition: background 0.2s linear;
width: 1em;
z-index: 1;
}
.breadcrumbs__item:before {
background: #cbd2d9;
margin-left: 1px;
}
.breadcrumbs__item:last-child {
border-right: none;
}
.breadcrumbs__item.is-active {
background: #edf1f5;
}
/* Some styles to make the page look a little nicer */
body {
color: #323f4a;
background: #f5f7fa;
display: flex;
align-items: center;
justify-content: center;
}
html, body {
height: 100%;
}
.gray{
background-color:gray;
}
.breadcrumbs__item.gray:after{
background-color:gray;
}
.red{
background-color:red;
}
.breadcrumbs__item.red:after{
background-color:red;
}
.green{
background-color:green;
}
.breadcrumbs__item.green:after{
background-color:green;
}
<li class="breadcrumbs">
Prospect
Opportunity
Accound
Sales
Support
</li>
This can work for you.
Check this Pen
HTML:
<ul class="steps">
<li class="past">
<span>
<strong>Step 1</strong>
</span><i></i>
</li>
<li class="present">
<span>
<strong>Step 2</strong>
</span><i></i>
</li>
<li class="future">
<span>
<strong>Step 3</strong>
</span><i></i>
</li>
<li class="future1">
<span>
<strong>Step 4</strong>
</span><i></i>
</li>
<li class="present1">
<span>
<strong>Step 5</strong>
</span><i></i>
</li>
</ul>
CSS:
.steps {
padding-left: 0;
list-style: none;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 12px;
line-height: 1;
margin: 30px auto;
border-radius: 3px;
}
.steps strong {
font-size: 14px;
display: block;
line-height: 2.1;
}
.steps > li {
position: relative;
display: block;
/* border: 1px solid #ddd; */
padding: 12px 50px 8px 50px;
width: 140px;
height: 40px;
}
#media (min-width: 768px) {
.steps > li {
float: left;
}
.steps .past {
color: #fff;
background: blue;
}
.steps .present {
color: #000;
background: yellow;
}
.steps .future {
color: #fff;
background: green;
}
.steps .present1 {
color: #000;
background: red;
}
.steps .future1 {
color: #fff;
background: purple;
}
.steps .present1 {
color: #fff;
}
.steps li > span:after,
.steps li > span:before {
content: "";
display: block;
width: 0px;
height: 0px;
position: absolute;
top: 0;
left: 0;
border: solid transparent;
border-left-color: #f0f0f0;
border-width: 30px;
}
.steps li > span:after {
top: -4px;
z-index: 1;
border-left-color: white;
border-width: 34px;
}
.steps li > span:before {
z-index: 2;
}
.steps li.past + li > span:before {
border-left-color: blue;
}
.steps li.present + li > span:before {
border-left-color: yellow;
}
.steps li.future + li > span:before {
border-left-color: green;
}
.steps li.future1 + li > span:before {
border-left-color: purple;
}
.steps li:first-child > span:after,
.steps li:first-child > span:before {
display: none;
}
/* Arrows at start and end */
.steps li:first-child i,
.steps li:last-child i {
display: block;
position: absolute;
top: 0;
left: 0;
border: solid transparent;
border-left-color: white;
border-width: 30px;
}
.steps li:last-child i {
left: auto;
right: -30px;
border-left-color: transparent;
border-top-color: white;
border-bottom-color: white;
}
}
I'm writing a code that creates a tree structure of data. and it is as below.
ul::before {
content: '';
position: absolute;
top: 0;
left: 50%;
border-left: 2px solid #000;
width: 0;
height: 2em;
}
#theAccount {
width: 100%;
max-width: 325px;
margin: auto;
border: 1px solid #ccc;
border-radius: 5px;
margin-top: 10px;
background-color: #f4f6f9;
text-align: center;
background-color: #fff9e3;
}
ul {
position: relative;
padding: 2em 0;
white-space: nowrap;
margin: 0 auto;
text-align: center;
}
ul:after {
content: '';
display: table;
clear: both;
}
li {
display: inline-block;
vertical-align: top;
text-align: center;
list-style-type: none;
position: relative;
padding: 2em .5em 0 .5em;
}
li:before,
li:after {
content: '';
position: absolute;
top: 0;
right: 50%;
border-top: 2px solid #000;
width: 50%;
height: 2em;
}
li:after {
right: auto;
left: 50%;
border-left: 2px solid #000;
}
li:only-child:after,
li:only-child::before {
display: none;
}
li:only-child {
padding-top: 0;
}
li:first-child::before,
li:last-child::after {
border: 0 none;
}
li:last-child::before {
border-right: 2px solid #000;
border-radius: 0 5px 0 0;
}
li:first-child::after {
border-radius: 5px 0 0 0;
}
<div>
<div>
<div id="theAccount">
<h1>
Main
</h1>
</div>
<ul>
<li>
Sub1 Tyesxt </li>
<li>
Sub 2 Tyesxt
</li>
<li>
Sub3 Tyesxt
</li>
<li>
Sub4 Tyesxt
</li>
<li>
Sub5 Tyesxt
</li>
</ul>
</div>
</div>
Here the tree output that we get is top to bottom, I want to know how I can rotate it by 90 degrees. i.e. I want the tree to be from left to right like below with proper styling.
|--Sub1 Tyesxt
|--Sub2 Tyesxt
Main ------|--Sub3 Tyesxt
|--Sub4 Tyesxt
|--Sub5 Tyesxt
Please let me know how Can I get this done.
Thanks
Give a try for rotate() function.
As mdn says:
The rotate() CSS function defines a transformation that rotates an
element around a fixed point on the 2D plane, without deforming it.
Its result is a data type.
An example:
ul::before {
content: '';
position: absolute;
top: 0;
left: 50%;
border-left: 2px solid #000;
width: 0;
height: 2em;
}
#theAccount {
width: 100%;
max-width: 325px;
margin: auto;
border: 1px solid #ccc;
border-radius: 5px;
margin-top: 10px;
background-color: #f4f6f9;
text-align: center;
background-color: #fff9e3;
}
ul {
position: relative;
padding: 2em 0;
white-space: nowrap;
margin: 0 auto;
text-align: center;
}
ul:after {
content: '';
display: table;
clear: both;
}
li {
display: inline-block;
vertical-align: top;
text-align: center;
list-style-type: none;
position: relative;
padding: 2em .5em 0 .5em;
}
li:before,
li:after {
content: '';
position: absolute;
top: 0;
right: 50%;
border-top: 2px solid #000;
width: 50%;
height: 2em;
}
li:after {
right: auto;
left: 50%;
border-left: 2px solid #000;
}
li:only-child:after,
li:only-child::before {
display: none;
}
li:only-child {
padding-top: 0;
}
li:first-child::before,
li:last-child::after {
border: 0 none;
}
li:last-child::before {
border-right: 2px solid #000;
border-radius: 0 5px 0 0;
}
li:first-child::after {
border-radius: 5px 0 0 0;
}
.foo {
transform: rotate(270deg);
margin-top: 150px;
}
h1 {
transform: rotate(90deg);
}
span {
transform: rotate(90deg);
display: block;
margin: 38px 0 0 0;
}
<div>
<div class="foo">
<div id="theAccount">
<h1>
Main
</h1>
</div>
<ul>
<li>
<span>Sub1 Tyesxt</span>
</li>
<li>
<span>Sub 2 Tyesxt</span>
</li>
<li>
<span>Sub3 Tyesxt</span>
</li>
<li>
<span>Sub4 Tyesxt</span>
</li>
<li>
<span>Sub5 Tyesxt</span>
</li>
</ul>
</div>
</div>
You can also give a try with flex & grid, then border and list-style:
body > div > div {
display: grid;
grid-template-columns: repeat(2, auto);
width: max-content;
margin: auto;
align-items: center;
font-size: 18px;
}
#theAccount {
display: flex;
}
#theAccount:after {
content: "";
width: 7.5vw;/* whatever*/
border: solid 1px ;
margin: auto 0;
}
h1 {
border-radius: 0.25em;
border: solid 1px;
padding: 0.15em 0.25em;
background: ivory;
}
ul {
border-left: solid 3px;
padding: 0;
border-radius: 15px;
}
li {
list-style: "\23e4\23e4\2800";
list-style-position: inside;
padding: 0;
margin: 0.5em 0;
}
li:first-of-type {
margin-top: -0.55em;
}
li:last-of-type {
margin-bottom: -0.45em;
}
li:first-of-type,
li:last-of-type {
list-style: "\2800\23e4\2800\20 ";
list-style-position: inside;
}
<div>
<div>
<div id="theAccount">
<h1>Main</h1>
</div>
<ul>
<li>Sub1 Tyesxt </li>
<li>Sub2 Tyesxt</li>
<li>Sub3 Tyesxt</li>
<li>Sub4 Tyesxt</li>
<li>Sub5 Tyesxt</li>
</ul>
</div>
</div>
I have two questions:
Can I set the border-right's height?
Can I hide the last li's border-right?
body {
margin: 0;
padding: 0;
}
#banner {
height: 30px;
width: 750px;
margin: 0 auto;
background-color: aquamarine;
}
#banner ul {
list-style: none;
height: 30px;
padding: 0;
}
#banner ul li {
float: left;
margin: auto 0;
height: 30px;
line-height: 30px;
width: 100px;
text-align: center;
border-right: 1px solid #aba;
}
<div id="banner">
<ul>
<li>Home</li>
<li>link</li>
<li>product</li>
<li>phone</li>
<li>cat</li>
<li>about</li>
</ul>
</div>
Instead of a border you can experiment with ::before and ::after
ul {
display: flex;
}
li {
position: relative;
display: flex;
justify-content: center;
flex: 1;
padding: 10px 0;
background-color: gray;
list-style-type: none;
}
li::after {
content: "";
position: absolute;
top: 5px; /* control the 'height' with top/bottom */
bottom: 5px;
right: 0;
width: 5px; /*same as what your border was */
background-color: black; /* instead of border-color */
}
li:last-child::after { /*hides last 'border' */
display: none;
}
<div>
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
</div>
Try #banner ul li:last-child { border-right: 0; or border-right-color: hsla(0, 0%, 0%, 0);}
fiddle
https://jsfiddle.net/Hastig/kkx33des/
Hide the last border
This is your border:
li { border-right: 1px solid #aba; }
But you don't want it to appear on the last item. So try this instead:
li + li {
border-left: 1px solid #aba;
}
The new rule applies a left-side border to li elements that come immediately after another li. This will exclude a left border on the first li and a right border on the last li.
Shorter borders
You want the borders to be less than full height. You can achieve the effect with absolutely-positioned pseudo-elements:
li {
position: relative; /* establish the containing block for abspos children */
}
li+li::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
height: 50%;
width: 2px;
background-color: red;
}
body {
margin: 0;
padding: 0;
}
#banner {
height: 30px;
width: 750px;
margin: 0 auto;
background-color: aquamarine;
}
#banner ul {
list-style: none;
height: 30px;
padding: 0;
}
#banner ul li {
float: left;
margin: auto 0;
height: 30px;
line-height: 30px;
width: 100px;
text-align: center;
/* border-right: 1px solid #aba; */
position: relative;
}
li+li::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
height: 50%;
width: 2px;
background-color: red;
}
<div id="banner">
<ul>
<li>Home</li>
<li>link</li>
<li>product</li>
<li>phone</li>
<li>cat</li>
<li>about</li>
</ul>
</div>
Try This :
li:not(:last-child):after {
content: "";
display: inline-block;
margin-left: 40px;
border-right: 3px solid orange;
height: 20px;
top: 5px;
position: absolute;
}
Full Code :
body {
margin: 0;
padding:0;
}
#banner {
height:30px;
width: 750px;
margin: 0 auto;
background-color: aquamarine;
vertical-align: middle;
}
#banner ul{
list-style: none;
height:30px;
padding: 0;
position: relative;
}
#banner ul li {
float: left;
margin: auto 0;
height: 30px;
line-height: 30px;
width: 100px;
text-align:center;
}
li:not(:last-child):after {
content: "";
display: inline-block;
margin-left: 40px;
border-right: 3px solid orange;
height: 20px;
top: 5px;
position: absolute;
}
<div id="banner">
<ul >
<li>Home</li>
<li>link</li>
<li>product</li>
<li>phone</li>
<li>cat</li>
<li>about</li>
</ul>
</div>
To remove the border for the last li, use the pseudo-class :last-child
I used display:flex and align-item:center after adding a margin to the top and bottom of the li to center it
body {
margin: 0;
padding:0;
}
#banner {
height:30px;
width: 750px;
margin: 0 auto;
background-color: aquamarine;
}
#banner ul{
list-style: none;
height:30px;
padding: 0;
display: flex;
align-items: center;
}
#banner ul li {
float: left;
width: 100px;
text-align:center;
border-right:1px solid #aba;
margin-top:10px;
margin-bottom: 10px;
}
#banner ul li:last-child {
border-right: 0;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
<link rel="stylesheet" href="styles/index.css" type="text/css">
</head>
<body>
<div id="banner">
<ul >
<li>Home</li>
<li>link</li>
<li>product</li>
<li>phone</li>
<li>cat</li>
<li>about</li>
</ul>
</div>
</body>
</html>
U can try pipe symbol as an alternaten using :after selector of each li
You need :last-child pseudo Css selector to hide the border of last li
In this fiddle I create a simple breadcrumb. I like to change the dependencies of class "div.arrow-right". I like to control the arrow size by "#sequence". So that the size of the arrow belongs to the font-size. That means if I change the font-size the right-arrow should fit automatically the same high as the div which contains the writing.
#sequence {
font-size: 28px;
}
And I like to add a gap or lets say a white thin arrow between two breadcrumb elements, see the picture below.
An alternate using :before and :after pseudo elements. Fiddle
.breadcrumb {
list-style: none;
overflow: hidden;
font-size: 28px;
}
.breadcrumb li {
color: white;
text-decoration: none;
padding: 8px 0 8px 50px;
position: relative;
display: block;
float: left;
cursor: pointer;
}
.breadcrumb li:after {
content: "";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 30px solid #74c476;
position: absolute;
top: 50%;
margin-top: -50px;
left: 100%;
z-index: 2;
}
.breadcrumb li:before {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 30px solid white;
position: absolute;
top: 50%;
margin-top: -50px;
margin-left: 2px;
left: 100%;
z-index: 1;
}
li:nth-child(1) {
padding-left: 20px;
background-color: #74c476;
}
li:nth-child(2) {
background-color: #61a362;
}
li:nth-child(3) {
background-color: #518851;
}
li:nth-child(1):after {
border-left-color: #74c476;
}
li:nth-child(2):after {
border-left-color: #61a362;
}
li:nth-child(3):after {
border-left-color: #518851;
}
<ul class="breadcrumb">
<li>hello</li>
<li>operator</li>
<li>layout</li>
</ul>
How this one can achieved in CSS. I googled out but i didn't find any solution.
Try this:
HTML
<nav class="nav">
<ul>
<li>1. Account Info</li>
<li>2. Verification</li>
<li>3. Enjoy</li>
</ul>
</nav>
StyleSheet
.nav ul {
margin: 0;
padding: 0;
list-style: none;
overflow: hidden;
width: 100%;
}
.nav ul li {
float: left;
margin: 0 .2em 0 1em;
}
.nav ul a {
background: red;
padding: .3em 1em;
float: left;
text-decoration: none;
color: #fff;
position: relative;
}
.nav ul li:first-child a:before {
content: normal;
}
.nav ul li:last-child a:after {
content: normal;
}
.nav ul a:before {
content: "";
position: absolute;
top: 50%;
margin-top: -1.5em;
border-width: 1.5em 0 1.5em 1em;
border-style: solid;
border-color: red rgba(0, 0, 0, 0);
left: -1em;
margin-left: 1px;
}
.nav ul a:after {
content: "";
position: absolute;
top: 50%;
margin-top: -1.5em;
border-top: 1.5em solid rgba(0, 0, 0, 0);
border-bottom: 1.5em solid rgba(0, 0, 0, 0);
border-left: 1em solid red;
right: -1em;
margin-right: 1px;
}
Here is the Demo
Try:
HTML:
<div class="arrow">
<p>1. Acount Info</p>
</div>
<div class="arrow2">
<p>2. Verification</p>
</div>
<div class="arrow3">
<p>3. Enjoy</p>
</div>
CSS:
.arrow {
width: 200px;
height: 33px;
background-color: red;
border: 1px solid red;
position: relative;
display:inline-block;
}
.arrow:after {
content:'';
position: absolute;
top: 0px;
left: 201px;
width: 0;
height: 0;
border: 17px solid transparent;
border-left: 12px solid red;
}
.arrow2 {
width: 200px;
height: 33px;
background-color: red;
border: 1px solid red;
position: relative;
display: inline-block;
margin-left: 8px;
}
.arrow2:after {
content:'';
position: absolute;
top: 0px;
left: 201px;
width: 0;
height: 0;
border: 17px solid transparent;
border-left: 12px solid red;
}
.arrow2:before {
content:'';
position: absolute;
top: 0px;
left: -1px;
width: 0;
height: 0;
border: 17px solid transparent;
border-left: 12px solid white;
}
.arrow3 {
width: 200px;
height: 33px;
background-color: red;
border: 1px solid red;
position: relative;
display: inline-block;
margin-left: 8px;
}
.arrow3:before {
content:'';
position: absolute;
top: 0px;
left: -1px;
width: 0;
height: 0;
border: 17px solid transparent;
border-left: 12px solid white;
}
p {
color:white;
text-align: center;
margin-top: 6px;
}
And the DEMO
Here's my attempt: http://codepen.io/anon/pen/xDeCd/
This example works well even if the user changes his font-size or triggers a page zoom. List-items should not break in several lines if the browser is resized.
Screenshot
Markup
<ol>
<li>1. Account info</li>
<li>2. Verification</li>
<li>3. Enjoy</li>
</ol>
(add links if/where necessary, I've just supposed they are not links but simply information labels about the required steps during a process).
Relevant CSS
ol {
white-space: nowrap;
}
li:after, li:before {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
position: absolute;
top: 0;
width: 1em;
height: 100%;
}
li {
display: inline-block;
position: relative;
height: 3em;
padding: 0 1em;
margin-right: 3em;
background: #d12420;
color: #f0f0f0;
font: 1em/3em Arial;
}
li + li { margin-left: -1.8em; }
li:not(:last-child):after {
left: 100%;
content: "";
border-left: 1em solid #d12420;
border-top: 1.5em solid transparent;
border-bottom: 1.5em solid transparent;
}
li + li:before {
content: "";
right: 100%;
border-left: 1em solid #transparent;
border-top: 1.5em solid #d12420;
border-bottom: 1.5em solid #d12420;
}
li:nth-child(1) { z-index: 3; }
li:nth-child(2) { z-index: 2; }
li:nth-child(3) { z-index: 1; }
Here is some code, it may be useful for youDEMO
<div class="breadcrumb flat">
<a class="active" href="#">1.Account Verification</a>
2.Verification
3.Enjoy
</div>