这是一款效果非常炫酷的液态环形按钮菜单jQuery特效。该特效使用GSAP来制作圆形按钮的变形动画,当用户点击主按钮时,按钮会像液体一样变形,并分离出3个子菜单按钮。
使用方法
使用该液态环形按钮菜单特效需要在页面中引入jQuery和TweenMax.min.js以及font-awesome字体图标文件。
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"> <script type="text/javascript" src="js/jquery.min.js"></script> <script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.2/TweenMax.min.js'></script>
HTML结构
该液态环形按钮菜单的HTML结构非常简单,子菜单使用的是一个无序列表,每个列表项中是一个按钮元素以及一个用于制作弹性效果的div层。主菜单按钮就是一个按钮元素。
<div class='content'> <div class='menu'> <div class='menu-wrapper'> <ul class='menu-items'> <li class='menu-item'> <button class='menu-item-button'> <i class='fa fa-reply-all'></i> </button> <div class='menu-item-bounce'></div> </li> <li class='menu-item'> <button class='menu-item-button'> <i class='fa fa-inbox'></i> </button> <div class='menu-item-bounce'></div> </li> <li class='menu-item'> <button class='menu-item-button'> <i class='fa fa-trash'></i> </button> <div class='menu-item-bounce'></div> </li> </ul> <button class='menu-toggle-button'> <i class='fa fa-plus menu-toggle-icon'></i> </button> </div> </div> </div>
CSS样式
为菜单添加下面的一些简单的CSS样式。
.menu { width: 300px; height: 200px; margin: 0 auto 100px; position: relative; -webkit-transform: translateZ(0); transform: translateZ(0); } .menu-wrapper { position: absolute; left: 50%; bottom: 10px; } .menu-toggle-button, .menu-item-bounce, .menu-item-button { background: #4f4f64; border-radius: 50%; width: 80px; height: 80px; margin-left: -40px; margin-top: -40px; height: 80px; color: #fff; border: none; outline: none; position: relative; } .menu-toggle-button { background: transparent; position: absolute; top: 0; left: 0; } .menu-toggle-icon { font-size: 30px; position: absolute; top: 0; left: 0; width: 80px; height: 80px; line-height: 80px; } .menu-items { list-style-type: none; padding: 0; margin: 0; position: absolute; left: 0; top: 0; } .menu-item { position: absolute; top: 0; left: 0; width: 0; height: 0; } .menu-item-bounce { position: absolute; top: 0; left: 0; } .menu-item-button { width: 60px; height: 60px; margin-left: -30px; margin-top: -30px; position: absolute; top: 0; left: 0; color: #AD4C4C; } .menu-item-button .fa { font-size: 1.5rem; color: #fff; } .menu-item-button .fa-inbox { transform: rotate(182deg); } .menu-item-button .fa-reply-all { transform: rotate(-120deg); } .menu-item-button .fa-trash { transform: rotate(120deg); }
JavaScript
该液态环形按钮菜单使用GSAP来制作按钮的动画效果。其中openMenu()
函数为打开菜单,closeMenu()
函数为关闭菜单。
$(document).ready(function(){ var menuItemNum=$(".menu-item").length; var angle=120; var distance=90; var startingAngle=180+(-angle/2); var slice=angle/(menuItemNum-1); TweenMax.globalTimeScale(0.8); $(".menu-item").each(function(i){ var angle=startingAngle+(slice*i); $(this).css({ transform:"rotate("+(angle)+"deg)" }) $(this).find(".menu-item-icon").css({ transform:"rotate("+(-angle)+"deg)" }) }) var on=false; $(".menu-toggle-button").mousedown(function(){ TweenMax.to($(".menu-toggle-icon"),0.1,{ scale:0.65 }) }) $(document).mouseup(function(){ TweenMax.to($(".menu-toggle-icon"),0.1,{ scale:1 }) }); $(document).on("touchend",function(){ $(document).trigger("mouseup") }) $(".menu-toggle-button").on("mousedown",pressHandler); $(".menu-toggle-button").on("touchstart",function(event){ $(this).trigger("mousedown"); event.preventDefault(); event.stopPropagation(); }); function pressHandler(event){ on=!on; TweenMax.to($(this).children('.menu-toggle-icon'),0.4,{ rotation:on?45:0, ease:Quint.easeInOut, force3D:true }); on?openMenu():closeMenu(); } function openMenu(){ $(".menu-item").each(function(i){ var delay=i*0.08; var $bounce=$(this).children(".menu-item-bounce"); TweenMax.fromTo($bounce,0.2,{ transformOrigin:"50% 50%" },{ delay:delay, scaleX:0.8, scaleY:1.2, force3D:true, ease:Quad.easeInOut, onComplete:function(){ TweenMax.to($bounce,0.15,{ // scaleX:1.2, scaleY:0.7, force3D:true, ease:Quad.easeInOut, onComplete:function(){ TweenMax.to($bounce,3,{ // scaleX:1, scaleY:0.8, force3D:true, ease:Elastic.easeOut, easeParams:[1.1,0.12] }) } }) } }); TweenMax.to($(this).children(".menu-item-button"),0.5,{ delay:delay, y:distance, force3D:true, ease:Quint.easeInOut }); }) } function closeMenu(){ $(".menu-item").each(function(i){ var delay=i*0.08; var $bounce=$(this).children(".menu-item-bounce"); TweenMax.fromTo($bounce,0.2,{ transformOrigin:"50% 50%" },{ delay:delay, scaleX:1, scaleY:0.8, force3D:true, ease:Quad.easeInOut, onComplete:function(){ TweenMax.to($bounce,0.15,{ // scaleX:1.2, scaleY:1.2, force3D:true, ease:Quad.easeInOut, onComplete:function(){ TweenMax.to($bounce,3,{ // scaleX:1, scaleY:1, force3D:true, ease:Elastic.easeOut, easeParams:[1.1,0.12] }) } }) } }); TweenMax.to($(this).children(".menu-item-button"),0.3,{ delay:delay, y:0, force3D:true, ease:Quint.easeIn }); }) } })