Search code examples
htmlcsscss-shapes

How to make this arrow in CSS only?


I'm building a wizard-like ordering process where I have this menu: menu

The active page is colored green (in this case, Model).

How does one make this arrow using only CSS?:

arrow

At the moment i'm achieving my goal by using several divs and images:

<div class="menuItem">
    <div></div> <!-- The left image -->
    <div>Varianten</div>
    <div></div> <!-- The right image -->
</div>

The left image: enter image description here

The right image:enter image description here

I found a SO answer which does part of this: Arrow Box with CSS, however i'm having trouble with the indent at the left.

If you have a better idea about how to do this, please let me know!


Solution

  • If the space between the arrows does not need to be transparent (it is solid color) you can use the :before and :after to create the edges (without new elements in DOM)

    Basically, it creates rotated squares with the borders we want and places them accordingly

    #flowBoxes {
        margin:auto;
        padding:20px;
        min-width:700px;
    
    }
    #flowBoxes div {
        display:inline-block;
        position:relative;
        height:25px;
        line-height:25px;
        padding:0 20px;
        border:1px solid #ccc;
        margin-right:2px;
        background-color:white;
    }
    
    #flowBoxes div.right:after{
        content:'';
        border-top:1px solid #ccc;
        border-right:1px solid #ccc;
        width:18px;
        height:18px;
        position:absolute;
        right:0;
        top:-1px;
        background-color:white;
        z-index:150;
        
        -webkit-transform: translate(10px,4px) rotate(45deg);
           -moz-transform: translate(10px,4px) rotate(45deg);
            -ms-transform: translate(10px,4px) rotate(45deg);
             -o-transform: translate(10px,4px) rotate(20deg); 
                transform: translate(10px,4px) rotate(45deg);
    }
    
    #flowBoxes div.left:before{
        content:'';
        border-top:1px solid #ccc;
        border-right:1px solid #ccc;
        width:18px;
        height:18px;
        position:absolute;
        left:0;
        top:-1px;
        background-color:white;
        z-index:50;
        
        -webkit-transform: translate(-10px,4px) rotate(45deg);
           -moz-transform: translate(-10px,4px) rotate(45deg);
            -ms-transform: translate(-10px,4px) rotate(45deg);
             -o-transform: translate(-10px,4px) rotate(20deg);
                transform: translate(-10px,4px) rotate(45deg);
    }
    #flowBoxes .active{
        background-color:green;
        color:white;
    }
    #flowBoxes div.active:after{
        background-color:green;
    }
    <div id="flowBoxes">
            <div class="right">Diersoort / I&amp;R</div>
            <div class="left right active">Model</div>
            <div class="left right">Varianten</div>
            <div class="left right">Bedrukkingen</div>
            <div class="left">Bevestiging</div>
    </div>