After all these years I still discover new ways in which to use css. This week I came across css shapes, while looking for a way to make an arrow for a menu rollover.
In this design, each active menu item has a unique shape. I couldn’t use a bitmap here, because the text in each menu item could change in size. The client could add new items, or make existing ones shorter or longer. With css shapes – and a little help of jQuery – the arrow gets dynamically re-sized to match the menu item width.
DEMO
See the Pen EjaYpN by pawel (@paweldebik) on CodePen.
Here’s the html, css, and jQuery that makes it all work:
HTML
<div id="navi-example"> <ul> <li ><a href="">item 1</a></li> <li ><a href="">item 2</a></li> <li ><a href="">item 3</a></li> <li ><a href="">item 4</a></li> <li ><a href="">item 5</a></li> </ul> </div>
CSS
#navi-example ul { list-style: none; background-color: black; } #navi-example li { float: left; width: 20%; } #navi-example a { color: white; line-height: 50px; padding: 17px 20px; text-decoration: none; text-transform: uppercase; } #navi-example a:hover { background-color: #3c89c8; }
jQUERY
$('#navi-example li a').hover(function(){ var w = $(this).width()+40; var z = (($(this).width())/2)+20; $(this).after('<div class="hover-bottom" \ style=\'border: #3c89c8; \ border-left: '+z+'px solid transparent; \ border-right: '+z+'px solid transparent; \ border-top: 27px solid #3c89c8; content: ""; \ height: 0; \ margin: 0; \ position: absolute; \ width: 0;\'></div>'); $(this).before('<div class="hover-bottom" \ style=\'height: 15px; \ width: '+w+'px; \ background-color: #3c89c8; \ margin-top: -15px; \ position: absolute; \'></div><div class="hover-bottom" \ style=\'border-bottom: 15px solid #1b5d93; \ border-right: 15px solid transparent; \ height: 0; \ width: 0; \ margin-top: -15px; \ margin-left: '+w+'px; \ position: absolute; \'></div>'); }, function(){ $('.hover-bottom').remove(); });