Menu w html5 canvas
W tutorialu pokażę jak stworzyć ciekawe menu wykorzystując html5 canvas (menu html5 canvas - demo). Na początek przygotujmy dokument html. W sekcji head załączamy bibliotekę jquery, skrypt menu_shape.js, w którym umieścimy kod skryptu odpowiedzialnego za działanie menu oraz trochę stylów css. W sekcji body umieszczamy element canvas oraz listę ul z odnośnikami do poszczególnych sekcji menu.
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Html5 canvas menu - demo</title> <link href="css/menu.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <script type="text/javascript" src="js/menu_shape.js"></script> <style type="text/css"> body { background:url("bg2.jpg") no-repeat top center; } div.container { position:relative; margin:50px auto 0 auto; width:800px; } #menu_shape { position:absolute; top:0; padding:0; margin:17px 0 0 20px; width:100%; } #menu_shape li { float:left; list-style:none; padding:0; margin:0; margin-right:10px; } #menu_shape li a { text-decoration:none; font:14px Verdana, Arial, Helvetica, sans-serif; color:white; font-weight:bold; width:180px; float:left; text-align:center; } </style> </head> <body> <div class="container"> <canvas id="canvas" width="800px" height="100px"></canvas> <ul id="menu_shape"> <li><a href="#">HOME</a></li> <li><a href="#">PORTFOLIO</a></li> <li><a href="#">CONTACT</a></li> </ul> </div> </body> </html>Teraz będziemy stopniowo uzupełniać plik javascript. Najpierw łapiemy element canvas oraz jego context. Ustalamy również startowe wartości pomocniczych zmiennych (kappa - poziom zaokręglenia elipsy, up - zmienna do sprawdzania, w którą stronę idzie animacja, all - zlicza liczę elementów li w menu).
$(document).ready(function() { var canvas = document.getElementById("canvas"), context = canvas.getContext("2d"); var kappa = 0.75; var up = true, interval, all = $('#menu_shape li').length; });Dopiszmy funkcję rysującą elipsę i narysujmy trzy elipsy odpowiadające li w naszym menu.
function drawEllipse(context, x, y, w, h, number_ellipse,kappa) { ox = (w / 2) * kappa, oy = (h / 2) * kappa, x = x+((number_ellipse-1)*190),//odpowiednie przesuniecie elipsy aby pasowala do kolejnego li xe = x + w, ye = y + h, xm = x + w / 2, ym = y + h / 2; context.fillStyle = 'rgba(112,209,215,0.3)'; context.strokeStyle = 'rgba(112,209,215,0.6)'; context.beginPath(); context.moveTo(x, ym); context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); context.closePath(); context.stroke(); context.fill(); } drawEllipse(context, 20, 5, 180, 40, 1, kappa); drawEllipse(context, 20, 5, 180, 40, 2, kappa); drawEllipse(context, 20, 5, 180, 40, 3, kappa);Wprowadzimy teraz obsługę zdarzenia hover na elemencie menu. Po najechaniu wskaźnikiem myszy na li uruchomi się funkcja anim_menu, po zjechaniu stop_anim_menu.
$('#menu_shape li').hover(function() { anim_menu(this); }, function() { stop_anim_menu(this); });Pozostała nam już tylko implementacja funkcji animujących.
function anim_menu(element) { var ind = $(element).index(); interval = window.setInterval(function() { if(kappa>=1.4) { up = false; } if(kappa<=0.7) { up = true; } if(up) { kappa+=0.1; } if(!up) { kappa-=0.1; } context.clearRect(0,0,canvas.width,canvas.height); //rysujemy przekształconą elipsę drawEllipse(context, 20, 5, 180, 40, ind+1, kappa); //poniższa petla ustawia pozostale elipsy w swoich pozycjach for(var i=1; i <= all;i++) { if(i != ind+1) { drawEllipse(context, 20, 5, 180, 40, i, 0.75); } } }, 100); } function stop_anim_menu(element) { window.clearInterval(interval); context.clearRect(0,0,canvas.width,canvas.height); for(var i=1; i <= all;i++) { drawEllipse(context, 20, 5, 180, 40, i, 0.75); } }Animacja polega na przekształcaniu elipsy. Po zjechaniu wskaźnika myszy z li przerywamy animację (clearInterval) i ustawiamy nasze elipsy w wyjściowej pozycji.