I am building a stepper, trying to achieve this:
I've built the following, but the problem is the color overflows on the right side of the bar.
.onboarding-steps {
display: flex;
}
.onboarding-steps-container {
background-color: #393D66;
border-top: 1px solid #AEAEAE;
border-bottom: 1px solid #AEAEAE;
background-position: -50% 0;
}
.onboarding-step.active {
color: white;
}
.onboarding-step.active ~ .onboarding-step {
background-color: #fff;
}
.container-fluid {
max-width: 94px;
margin-right: auto;
margin-left: auto;
}
.list-reset {
list-style: none;
padding: 0;
margin: 0;
}
.onboarding-step {
-ms-flex-positive: 1;
flex-grow: 1;
padding: 1.8rem 1rem 1.8rem 1.5rem;
}
<nav class="onboarding-steps-container">
<div class="container-fluid">
<ul class="list-reset clearfix onboarding-steps">
<li class="onboarding-step">
1
</li>
<li class="onboarding-step active">
2
</li>
<li class="onboarding-step">
3
</li>
<li class="onboarding-step">
4
</li>
</ul>
</div>
</nav>
I have also tried a variation by using a pseudoselector as such:
li.onboarding-step.active:before {
background-color: #f9f9f9;
content: '';
left: 0;
right: 0;
top: 0;
bottom: 0;
height: 100%;
position: absolute;
}
.onboarding-steps-container {
position: relative;
}
in that case the color goes on the entire bar.
Here is an example.
.breadcrumb {
margin: 0;
padding: 0;
list-style: none;
overflow: hidden;
height: 36px;
display: flex;
justify-content: center;
align-items: center;
align-content: center;
padding-right: 35px;
}
.breadcrumb li {
text-decoration: none;
padding: 10px;
position: relative;
cursor: pointer;
flex: auto;
border: 1px solid red;
}
.breadcrumb li span {
font-size: 11px;
display: inline-block;
width: 16px;
line-height: 16px;
border-radius: 50%;
background-color: white;
vertical-align: middle;
text-align: center;
margin-left: calc(100% - 8px);
}
.breadcrumb li:after {
content: "";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 30px solid #393D66;
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 {
background-color: #393D66;
}
li:first-child {} li.active ~ li {
background-color: #f5f5f5;
}
li.active ~ li:after {
border-left-color: #f5f5f5;
}
li.active ~ li:before {
border-left-color: #d5d5d5;
}
li.active ~ li span {
background-color: #c5c5c5;
color: white;
}
<div class="stepper">
<ul class="breadcrumb">
<li><span>1</span>
</li>
<li><span>2</span>
</li>
<li class="active"><span>3</span>
</li>
<li><span>4</span>
</li>
<li><span>5</span>
</li>
</ul>
</div>
I'm not sure if you're looking for an answer which alters the <li> elements before and after the active <li> and the first <li> but here's a solution for that if you need one. Otherwise pretty much same stuff as Pugazh's answer.
html,
body {
background-color: #ccc;
}
.onboarding-steps {
list-style: none;
overflow: hidden;
font: 18px Helvetica, Arial, Sans-Serif;
}
.onboarding-steps li {
float: left;
}
.onboarding-steps li span {
color: white;
text-decoration: none;
padding: 10px 20px 10px 45px;
background: #393D66;
position: relative;
display: block;
float: left;
}
.onboarding-steps li span i {
display: block;
padding: 0 5px;
width: 5px;
height: 15px;
font-size: 10px;
background-color: white;
color: grey;
border-radius: 50%;
border: 1px solid grey;
}
.onboarding-steps li:first-child span {
padding: 10px 50px 10px 65px;
}
.onboarding-steps li.active ~ li span {
color: black;
background: #ffffff;
}
.onboarding-steps li span:after {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 30px solid #393D66;
position: absolute;
top: 50%;
margin-top: -50px;
left: 100%;
z-index: 2;
}
.onboarding-steps li.active ~ li span:after {
border-left: 30px solid #ffffff;
}
.onboarding-steps li span: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: 1px;
left: 100%;
z-index: 1;
}
.onboarding-steps li.active ~ li span:before {
border-left: 30px solid grey;
}
<ul class="onboarding-steps">
<li>
<span><i>1</i></span>
</li>
<li class="active">
<span><i>2</i></span>
</li>
<li>
<span><i>3</i></span>
</li>
<li>
<span><i>4</i></span>
</li>
</ul>
EDIT:
Here's another example. I even made the items clickable so that you can see how the background reacts with the <li> with active class.
var elements = document.querySelectorAll(".list-item");
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener("click", function() {
for (var i = 0; i < elements.length; i++) {
elements[i].classList.remove("active");
}
this.classList.add("active");
});
}
html,
body {
background-color: #ccc;
}
.onboarding-container {
background: #FFFFFF;
border: 2px solid black;
padding: 30px;
}
.onboarding-steps {
width: 100%;
max-width: 900px;
margin: 0 auto;
padding: 0;
list-style: none;
overflow: hidden;
font: 18px Helvetica, Arial, Sans-Serif;
display: flex;
}
.onboarding-steps li {
position: relative;
background: #393D66;
border-top: 1px solid grey;
border-bottom: 1px solid grey;
padding: 10px 30px 10px 40px;
flex: 1;
transition: flex 300ms linear 0s, background 100ms linear 0s;
}
.onboarding-steps li.active {
flex: 0 0 200px;
transition: flex 300ms linear 0s, background 100ms linear 0s;
}
.onboarding-steps li:first-child {
padding: 10px 30px 10px 10px;
}
.onboarding-steps li:last-child {
margin-right: -1px;
}
.onboarding-steps li span {
display: block;
padding: 0 5px;
width: 5px;
height: 15px;
font-size: 10px;
background-color: white;
color: grey;
border-radius: 50%;
border: 1px solid grey;
}
.onboarding-steps li:after {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
border-left: 20px solid #393D66;
position: absolute;
top: 50%;
margin-top: -20px;
left: 100%;
margin-left: -2px;
z-index: 2;
transition: border-left 100ms linear 0s;
}
.onboarding-steps li:before {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
border-left: 20px solid white;
position: absolute;
top: 50%;
margin-top: -20px;
margin-left: -1px;
left: 100%;
z-index: 1;
transition: border-left 100ms linear 0s;
}
.onboarding-steps li:last-child:after {
margin-left: -22px;
}
.onboarding-steps li:last-child:before {
margin-left: -21px;
border-top: 20px solid #ffffff;
border-bottom: 20px solid #ffffff;
}
.onboarding-steps li.active ~ li {
background: #ffffff;
}
.onboarding-steps li.active ~ li:after {
border-left: 20px solid #ffffff;
transition: border-left 100ms linear 0s;
}
.onboarding-steps li.active ~ li:before {
border-left: 20px solid grey;
transition: border-left 100ms linear 0s;
}
<div class="onboarding-container">
<ul class="onboarding-steps">
<li class="list-item active">
<span>1</span>
</li>
<li class="list-item">
<span>2</span>
</li>
<li class="list-item">
<span>3</span>
</li>
<li class="list-item">
<span>4</span>
</li>
</ul>
</div>
EDIT 2:
Based on your comment I made one more example and this is probably the closest you can get with just using CSS. Hopefully this will help you. Please do open it in fullscreen to see it working.
var elements = document.querySelectorAll(".list-item");
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener("click", function() {
for (var i = 0; i < elements.length; i++) {
elements[i].classList.remove("active");
}
this.classList.add("active");
});
}
html,
body {
background-color: #ccc;
}
* {
box-sizing: border-box;
}
.onboarding-container {
width: 100%;
background: #FFFFFF;
border: 2px solid black;
padding: 20px 0px;
}
.onboarding-container-inner {
position: relative;
width: 100%;
border-top: 1px solid grey;
border-bottom: 1px solid grey;
background: transparent;
z-index: 1;
overflow: hidden;
}
.onboarding-steps:before {
content: "";
display: inline-block;
width: 40%;
background: #393D66;
left: 0;
top: 0;
height: 100%;
position: absolute;
}
.onboarding-steps:after {
content: "";
display: inline-block;
width: 40%;
background: #ffffff;
right: 0;
top: 0;
height: 100%;
position: absolute;
z-index: -1;
}
.onboarding-steps {
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 0;
list-style: none;
font: 18px Helvetica, Arial, Sans-Serif;
display: flex;
}
.onboarding-steps li {
position: relative;
background: #393D66;
padding: 10px 30px 10px 40px;
flex: 1;
transition: flex 300ms linear 0s, background 100ms linear 0s;
}
.onboarding-steps li.active {
//flex: 0 0 200px;
transition: flex 300ms linear 0s, background 100ms linear 0s;
}
.onboarding-steps li:first-child {
padding: 10px 30px 10px 10px;
}
.onboarding-steps li:last-child {
margin-right: -1px;
}
.onboarding-steps li span {
display: block;
padding: 0 4px;
width: 15px;
height: 15px;
font-size: 10px;
background-color: white;
color: grey;
border-radius: 50%;
border: 1px solid grey;
}
.onboarding-steps li:after {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
border-left: 20px solid #393D66;
position: absolute;
top: 50%;
margin-top: -20px;
left: 100%;
margin-left: -2px;
z-index: 2;
transition: border-left 100ms linear 0s;
}
.onboarding-steps li:before {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
border-left: 20px solid white;
position: absolute;
top: 50%;
margin-top: -20px;
margin-left: -1px;
left: 100%;
z-index: 1;
transition: border-left 100ms linear 0s;
}
.onboarding-steps li:last-child:after {
margin-left: -22px;
}
.onboarding-steps li:last-child:before {
margin-left: -21px;
border-top: 20px solid #ffffff;
border-bottom: 20px solid #ffffff;
}
.onboarding-steps li.active:last-child:before {
border-top: 20px solid #393D66;
border-bottom: 20px solid #393D66;
}
.onboarding-steps li.active ~ li {
background: #ffffff;
}
.onboarding-steps li.active ~ li:after {
border-left: 20px solid #ffffff;
transition: border-left 100ms linear 0s;
}
.onboarding-steps li.active ~ li:before {
border-left: 20px solid grey;
transition: border-left 100ms linear 0s;
}
.onboarding-steps li.active:last-child:before {
content: "";
display: inline-block;
background: #393D66;
position: absolute;
right: 0;
top: 0;
width: 2500px;
height: 100%;
z-index: 1;
border-top: 0;
border-left: 0;
border-bottom: 0;
margin-top: 0;
transition: width 100ms linear 0s;
}
<div class="onboarding-container">
<div class="onboarding-container-inner">
<ul class="onboarding-steps">
<li class="list-item active">
<span>1</span>
</li>
<li class="list-item">
<span>2</span>
</li>
<li class="list-item">
<span>3</span>
</li>
<li class="list-item">
<span>4</span>
</li>
</ul>
</div>
</div>
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 am really confused why I can't choose a span inside <a> tag by saying that
ul li a:hover span:first-child:before{
top: -10px;
left: -10px;
opacity: 1; }
This is the similar question I posted yesterday but a little bit different.
Yesterday,
what I wanted to try div wasn't children div however now span is the child of the <a> tag. I will appreciate any help.
body {
margin: 0;
padding: 0;
background: #ccc;
}
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.center ul {
margin: 0;
padding: 0;
}
.center ul li {
list-style: none;
display: inline-block;
padding: 10px;
position: relative;
margin: 5px;
font-size: 20px;
position: relative;
}
.center ul li a {
text-decoration: none;
color: white;
}
ul li a:hover span:first-child:before {
top: -10px;
left: -10px;
opacity: 1;
}
.center ul li a span:first-child::before {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-top: 5px solid black;
border-left: 5px solid black;
top: 0px;
left: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:first-child::after {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-top: 5px solid black;
border-right: 5px solid black;
top: 0px;
right: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:last-child::before {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-left: 5px solid black;
border-bottom: 5px solid black;
bottom: 0px;
left: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:last-child::after {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-bottom: 5px solid black;
border-right: 5px solid black;
bottom: 0px;
right: 0;
opacity: 0.4;
transition: .6s;
}
<div class="center">
<ul>
<li>HOME <span></span><span></span></li>
<li>MENU <span></span><span></span></li>
<li>CONTACT <span></span><span></span></li>
<li>PORTFOLIO <span></span><span></span></li>
</ul>
</div>
Place your hover effect after all your pseudo element declarations.
body{
margin: 0;
padding: 0;
background: #ccc;
}
.center{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
.center ul{
margin: 0;
padding: 0;
}
.center ul li{
list-style: none;
display: inline-block;
padding: 10px;
position: relative;
margin: 5px;
font-size: 20px;
position: relative;
}
.center ul li a{
text-decoration: none;
color: white;
}
.center ul li a span:first-child::before{
position: absolute;
content: '';
width: 8px;
height: 8px;
border-top: 5px solid black;
border-left: 5px solid black;
top: 0px;
left: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:first-child:after{
position: absolute;
content: '';
width: 8px;
height: 8px;
border-top: 5px solid black;
border-right: 5px solid black;
top: 0px;
right: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:last-child::before{
position: absolute;
content: '';
width: 8px;
height: 8px;
border-left: 5px solid black;
border-bottom: 5px solid black;
bottom: 0px;
left: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:last-child::after{
position: absolute;
content: '';
width: 8px;
height: 8px;
border-bottom: 5px solid black;
border-right: 5px solid black;
bottom: 0px;
right: 0;
opacity: 0.4;
transition: .6s;
}
ul li a:hover span:first-child::before{
top: -10px;
left: -10px;
opacity: 1;
}
I have tested it here: https://jsfiddle.net/9z7r3e8a/5/
Instead of :first-child you should use :first-of-type, because you already have text element in first place (and as first-child). The :first-of-type will select first span element among all children of <a>:
body {
margin: 0;
padding: 0;
background: #ccc;
}
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.center ul {
margin: 0;
padding: 0;
}
.center ul li {
list-style: none;
display: inline-block;
padding: 10px;
position: relative;
margin: 5px;
font-size: 20px;
position: relative;
}
.center ul li a {
text-decoration: none;
color: white;
}
ul li a:hover span:first-of-type:before {
top: -10px;
left: -10px;
opacity: 1;
}
.center ul li a span:first-of-type::before {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-top: 5px solid black;
border-left: 5px solid black;
top: 0px;
left: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:first-of-type::after {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-top: 5px solid black;
border-right: 5px solid black;
top: 0px;
right: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:last-of-type::before {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-left: 5px solid black;
border-bottom: 5px solid black;
bottom: 0px;
left: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a span:last-of-type::after {
position: absolute;
content: '';
width: 8px;
height: 8px;
border-bottom: 5px solid black;
border-right: 5px solid black;
bottom: 0px;
right: 0;
opacity: 0.4;
transition: .6s;
}
.center ul li a:hover span:first-of-type:before {
top: -10px;
left: -10px;
opacity: 1;
}
<div class="center">
<ul>
<li>HOME <span></span><span></span></li>
<li>MENU <span></span><span></span></li>
<li>CONTACT <span></span><span></span></li>
<li>PORTFOLIO <span></span><span></span></li>
</ul>
</div>
I need tab control like this
can any one please help me how to do.
I am able to create tab without background color like bellow:
#crumbs {
width: 100%;
display: grid;
}
#crumbs ul {
list-style: none;
padding: 7px 5px;
margin: 0px;
}
#crumbs ul li a {
display: block;
float: left;
height: 50px;
background: #3498db;
text-align: center;
padding: 30px 40px 0 80px;
position: relative;
margin: 0 10px 0 0;
font-size: 20px;
text-decoration: none;
color: #fff;
width: 22%;
}
#crumbs ul li a:after {
content: "";
border-top: 40px solid transparent;
border-bottom: 40px solid transparent;
border-left: 40px solid #3498db;
position: absolute;
right: -40px;
top: 0;
z-index: 1;
}
#crumbs ul li a:before {
content: "";
border-top: 40px solid transparent;
border-bottom: 40px solid transparent;
border-left: 40px solid #fff;
position: absolute;
left: 0;
top: 0;
}
#crumbs ul li a.inprogress {
display: block;
float: left;
height: 50px;
background: #34db3a;
text-align: center;
padding: 30px 40px 0 80px;
position: relative;
margin: 0 10px 0 0;
font-size: 20px;
text-decoration: none;
color: #fff;
width: 22%;
}
#crumbs ul li a.inprogress:after {
content: "";
border-top: 40px solid transparent;
border-bottom: 40px solid transparent;
border-left: 40px solid #34db3a;
position: absolute;
right: -40px;
top: 0;
z-index: 1;
}
#crumbs ul li a.inprogress:before {
content: "";
border-top: 40px solid transparent;
border-bottom: 40px solid transparent;
border-left: 40px solid #fff;
position: absolute;
left: 0;
top: 0;
}
#crumbs ul li a.cpmpleted {
display: block;
float: left;
height: 50px;
background: #b334db;
text-align: center;
padding: 30px 40px 0 80px;
position: relative;
margin: 0 10px 0 0;
font-size: 20px;
text-decoration: none;
color: #fff;
width: 22%;
}
#crumbs ul li a.cpmpleted:after {
content: "";
border-top: 40px solid transparent;
border-bottom: 40px solid transparent;
border-left: 40px solid #b334db;
position: absolute;
right: -40px;
top: 0;
z-index: 1;
}
#crumbs ul li a.cpmpleted:before {
content: "";
border-top: 40px solid transparent;
border-bottom: 40px solid transparent;
border-left: 40px solid #fff;
position: absolute;
left: 0;
top: 0;
}
<div id="crumbs">
<ul>
<li>One</li>
<li>Two</li>
<li> Three </li>
</ul>
</div>
I would consider skew transformation and pseudo element like this:
ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
padding: 0 20px;
}
li {
padding: 10px 30px;
position: relative;
}
li:before {
content: "";
z-index: -1;
position: absolute;
top: 0;
bottom: 50%;
right: 0;
left: 0;
background: var(--c);
transform: skew(40deg);
}
li:after {
content: "";
z-index: -1;
position: absolute;
top: 50%;
bottom: 0;
right: 0;
left: 0;
background: var(--c);
transform: skew(-40deg);
}
li.active:before {
border: 2px solid orange;
border-bottom: none;
}
li.active:after {
border: 2px solid orange;
border-top: none;
}
<ul>
<li style="--c:red"> Step 1</li>
<li style="--c:green" class="active"> Step 2</li>
<li style="--c:blue"> Step 3</li>
</ul>
I'm looking to achieve this with CSS:
and this is what I've got:
.breadcrumb {
list-style: none;
overflow: hidden;
font: 18px Helvetica, Arial, Sans-Serif;
margin: 0;
padding: 0;
}
.breadcrumb li {
float: left;
}
.breadcrumb li a {
border: 1px solid #c00;
color: black;
text-decoration: none;
padding: 10px 0 10px 55px;
background: #fff;
position: relative;
display: block;
float: left;
}
.breadcrumb li a:after {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
/* Go big on the size, and let overflow hide */
border-bottom: 50px solid transparent;
border-left: 30px solid #fff;
position: absolute;
top: 50%;
margin-top: -50px;
left: 100%;
z-index: 2;
}
.breadcrumb li a:before {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
/* Go big on the size, and let overflow hide */
border-bottom: 50px solid transparent;
border-left: 30px solid red;
position: absolute;
top: 50%;
margin-top: -50px;
margin-left: 1px;
left: 100%;
z-index: 1;
}
.breadcrumb li:first-child a {
padding-left: 10px;
}
.breadcrumb li a:hover {
background: hsla(34, 85%, 25%, 1);
}
.breadcrumb li a:hover:after {
border-left-color: hsla(34, 85%, 25%, 1) !important;
}
.breadcrumb li:last-child a {
border-right: 1px solid red;
}
.breadcrumb li:last-child a:before {
border-left: 0 solid transparent;
}
<ul class="breadcrumb">
<li>Home</li>
<li>Vehicles</li>
</ul>
Issues:
Can't get the right side borders to show correctly
Can't get the right border of last element to be normal (not a chevron)
Can't get hover state right because of right side borders.
Here's is my working jsFiddle
.breadcrumb {
list-style: none;
overflow: hidden;
font: 18px Helvetica, Arial, Sans-Serif;
margin: 0;
padding: 0;
}
.breadcrumb li {
float: left;
position: relative;
background: #fff;
margin: 0 5px;
}
.breadcrumb li a {
border: 1px solid #0976a1;
color: #0976a1;
text-decoration: none;
padding: 10px 10px 10px 32px;
position: relative;
display: block;
z-index: 99;
font-weight: bold;
}
.breadcrumb li:first-child a {
padding-left: 10px;
border-right: none;
}
.breadcrumb li:last-child a {
border-left: none;
}
.breadcrumb li:before, .breadcrumb li:after{
content: " ";
display: block;
width: 33px;
height: 29px;
border-top: 5px solid transparent;
border-bottom: 1px solid #0976a1;
border-right: 1px solid #0976a1;
position: absolute;
top: 4px;
z-index: -1;
background: #fff;
transform: rotate(-45deg);
-moz-transform: rotate(-45deg);
}
.breadcrumb li:before {
left: 87%;
}
.breadcrumb li:after {
left: 81%;
}
.breadcrumb li:first-child:before, .breadcrumb li:first-child:after{ z-index: 1; }
.breadcrumb li:first-child:after{ left: 73%; }
.breadcrumb li:last-child:before, .breadcrumb li:last-child:after{
display: none;
}
.breadcrumb li:first-child:hover:after, .breadcrumb li:hover{ background: #0976a1; }
.breadcrumb li:hover a{ border-color: transparent; }
.breadcrumb li:hover a{ color: #fff; }
<ul class="breadcrumb">
<li>Home</li>
<li>Vehicles</li>
</ul>
I hope this will help you :)
I think this code is helpful.
.breadcrumb {
list-style: none;
overflow: hidden;
font: 18px Helvetica, Arial, Sans-Serif;
margin: 0;
padding: 0;
}
.breadcrumb li {
float: left;
margin-right: 10px;
}
.breadcrumb li:first-child {
z-index: 9;
position:relative;
}
.breadcrumb li a {
border: 1px solid #006A9C;
color: black;
text-decoration: none;
padding: 10px 10px 10px 10px;
background: #fff;
position: relative;
display: block;
float: left;
}
.breadcrumb li:first-child a:after {
border-color:#fff;
border-style: solid;
border-width: 15px;
bottom: -30px;
box-shadow: 0 0 0 0 #c00, -1px 1px 0 1px #006A9C;
content: "";
height: 0;
position: absolute;
right: -29px;
transform: rotate(-135deg);
transform-origin: 0 0 0;
width: 0;
z-index: -1;
}
.breadcrumb li:first-child a {
border-right: 0;
}
.breadcrumb li:last-child a {
border-left: 0;
}
.breadcrumb li:last-child a:after{
display:none;
}
.breadcrumb li:last-child a:before{
border-color:#fff;
border-style: solid;
border-width: 15px;
bottom: -30px;
box-shadow: 0 0 0 0 #006A9C, -1px 1px 0 1px #006A9C;
content: "";
height: 0;
position: absolute;
left: -1px;
transform: rotate(-135deg);
transform-origin: 0 0 0;
width: 0;
}
.breadcrumb li:last-child a {
padding-left: 28px;
}
.breadcrumb li a:hover {
background: #006A9C;
color: #fff;
}
.breadcrumb li a:first-child:hover::after {
border-color:#006A9C;
}
<ul class="breadcrumb">
<li>Home</li>
<li>Vehicles</li>
</ul>
*{
margin: 0;
padding: 0;
}
.container{
margin: 20px;
display: flex;
flex-direction: row;
border: 1px solid skyblue;
width: 200px;
overflow: hidden;
}
.left,.right{
display: inline-block;
//border: 1px solid black;
line-height: 50px;
width: 100px;
height: 100%;
position: relative;
}
.right{
text-align: center;
}
p:hover{
background-color: skyblue;
color: white;
}
.left::after{
content:'';
position: absolute;
left: 70px;
top: 3px;
display: inline-block;
width: 45px;
height: 45px;
z-index: 2;
background:white;
transform:rotate(-45deg);
border-right: 1px solid skyblue;
border-bottom: 1px solid skyblue;
}
.left:hover::after{
background-color: skyblue;
}
<div class="container">
<p class="left">LEFT</p>
<p class="right">RIGHT</p>
</div>
It is doing my best.
I hope it will be useful for you.
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>