Search code examples
htmlcsssasscss-shapes

Hollow arrow in front of an image


I'm trying to create a hollow css arrow in front of an image.

I got it… but it feels very dirty. Is there any better way to do this? Cross browser compatibility (IE8+) would be awesome.

SCSS

.arrowwrap {
    width:100%;
    padding:0;
    position:relative;
    overflow:hidden;
    margin:-$arrow_height 0 0 0;
    &:after {
        content:'';
        position:absolute;
        height:$arrow_height;
        width:50%;
        margin:-$arrow_height 0 0 -$arrow_width;
        left:0;
        z-index:99999;
        background:$box_color;
    }
    &:before {
        content:'';
        position:absolute;
        height:$arrow_height;
        width:100%;
        left:50%;
        margin:0 0 0 $arrow_width;
        z-index:99999;
        background:$box_color;
    }
    .arrowone {
        width: 0;
        height: 0;
        border-style: solid;
        border-width: $arrow_height $arrow_width 0 $arrow_width;
        /* border-color: transparent transparent #333 transparent; */
        border-color:transparent $box_color $box_color $box_color;
        margin:auto;
    }
}

http://jsfiddle.net/dhs2eba2/


Solution

  • If you want to minimise and remove all unsemantic markup you can do :

    DEMO

    This technique relies on pseudo elements and therefore prevents the use of unsemantic markup. Pseudo elements are supported by IE8+ see canIuse. It also needs the box-sizing property to enable responsive width (box-sizing: border-box is also supported by IE8+ see canIuse).

    HTML :

    <div class="wrap">
        <img src="http://placekitten.com/800/350" />
        <article>
            <h1>Hellow World, meow</h1>
        </article>
    </div>
    

    CSS :

    body {
        background:#fad;
        padding:0;
        margin:0;
    }
    
    $arrow_width: 20px;
    $arrow_height: 20px;
    $box_color: #d3d030;
    
    .wrap {
        img {
            width:100%;
            height:auto;
            vertical-align:bottom;
        }
        article{
            padding:20px;
            background:$box_color;
            color:#fff;
            position:relative;
        }
    }
    article:before, article:after{
        content:'';
        position:absolute;
        width:50%;
        bottom:100%;
        box-sizing:border-box;
    }
    article:before{
        left:0;
        border-bottom:20px solid #D3D030;
        border-right:20px solid transparent;
    }
    article:after{
        right:0;
        border-bottom:20px solid #D3D030;
        border-left:20px solid transparent;
    }