导航菜单

自由拖拽弹性圆形菜单

阿里云

这是一款基于 jquery ui 的可自由拖拽的弹性圆形菜单效果。该圆形菜单可以通过点击一个圆形按钮来弹出 4 个子菜单按钮。弹性效果由 anime.js 来制作,效果非常炫酷。

使用方法:

在页面中引入 jquery 和 jqueryui 文件,以及 anime.js 和需要的样式文件 style.css。

也想出现在这里?联系我们
创客主机
  1. <link rel="stylesheet" href="css/style.css">
  2. <script src="path/to/jquery.min.js"></script>
  3. <script src="path/to/jquery-ui.min.js"></script>
  4. <script src="path/to/anime.js"></script>

HTML 结构:

圆形菜单的 HTML 结构如下:

  1. <div class="center menu">
  2.     <div id="myMenu"></div>
  3. </div>

初始化插件:

在页面 DOM 元素加载完毕之后,通过下面的 js 代码来完成圆形菜单的拖拽功能,以及弹性效果。

  1. var timeOut;
  2. class Item {
  3.     constructor(icon, backgroundColor) {
  4.         this.$element = $(document.createElement("div"));
  5.         this.icon = icon;
  6.         this.$element.addClass("item");
  7.         this.$element.css("background-color", backgroundColor);
  8.         var i = document.createElement("i");
  9.         $(i).addClass("fi-" + icon);
  10.         this.$element.append(i);
  11.         this.prev = null;
  12.         this.next = null;
  13.         this.isMoving = false;
  14.         var element = this;
  15.         this.$element.on("mousemove", function() {
  16.             clearTimeout(timeOut);
  17.             timeOut = setTimeout(function() {
  18.                 if (element.next && element.isMoving) {
  19.                     element.next.moveTo(element);
  20.                 } 
  21.             }, 10);
  22.         });
  23.     }
  24.  
  25.     moveTo(item) {
  26.         anime({
  27.             targets: this.$element[0],
  28.             left: item.$element.css("left"),
  29.             top: item.$element.css("top"),
  30.             duration: 700,
  31.             elasticity: 500
  32.         });
  33.         if (this.next) {
  34.             this.next.moveTo(item);
  35.         }
  36.     }
  37.  
  38.     updatePosition() {    
  39.         anime({
  40.             targets: this.$element[0],
  41.             left: this.prev.$element.css("left"),
  42.             top: this.prev.$element.css("top"),
  43.             duration: 200
  44.         });
  45.  
  46.         if (this.next) {
  47.             this.next.updatePosition();
  48.         }
  49.     }
  50. }
  51.  
  52. class Menu {
  53.     constructor(menu) {
  54.         this.$element = $(menu);
  55.         this.size = 0;
  56.         this.first = null;
  57.         this.last = null;
  58.         this.timeOut = null;
  59.         this.hasMoved = false;
  60.         this.status = "closed";
  61.     }
  62.  
  63.     add(item) {
  64.         var menu = this;
  65.         if (this.first == null) {
  66.             this.first = item;
  67.             this.last = item;
  68.             this.first.$element.on("mouseup", function() {
  69.                 if (menu.first.isMoving) {
  70.                     menu.first.isMoving = false;        
  71.                 } else {
  72.                     menu.click();
  73.                 }
  74.             }); 
  75.             item.$element.draggable(
  76.                 {
  77.                     start: function() {
  78.                         menu.close();
  79.                         item.isMoving = true;
  80.                     }  
  81.                 },
  82.                 {
  83.                     drag: function() {
  84.                         if (item.next) {
  85.                             item.next.updatePosition();
  86.                         }
  87.                     }
  88.                 },
  89.                 {
  90.                     stop: function() {
  91.                         item.isMoving = false;
  92.                         item.next.moveTo(item);
  93.                     }
  94.                 }
  95.             );
  96.         } else {
  97.             this.last.next = item;
  98.             item.prev = this.last;
  99.             this.last = item;
  100.         }
  101.         this.$element.after(item.$element);
  102.  
  103.  
  104.     }
  105.  
  106.     open() {
  107.         this.status = "open";
  108.         var current = this.first.next;
  109.         var iterator = 1;
  110.         var head = this.first;
  111.         var sens = head.$element.css("left") < head.$element.css("right") ? 1 : -1;
  112.         while (current != null) {
  113.             anime({
  114.                 targets: current.$element[0],
  115.                 left: parseInt(head.$element.css("left"), 10) + (sens * (iterator * 50)),
  116.                 top: head.$element.css("top"),
  117.                 duration: 500
  118.             });
  119.             iterator++;
  120.             current = current.next;
  121.         }    
  122.     }
  123.  
  124.     close() {
  125.         this.status = "closed";
  126.         var current = this.first.next;
  127.         var head = this.first;
  128.         var iterator = 1;
  129.         while (current != null) {
  130.             anime({
  131.                 targets: current.$element[0],
  132.                 left: head.$element.css("left"),
  133.                 top: head.$element.css("top"),
  134.                 duration: 500
  135.             });
  136.             iterator++;
  137.             current = current.next;
  138.         }
  139.     }
  140.  
  141.     click() {
  142.         if (this.status == "closed") {
  143.             this.open();
  144.         } else {
  145.             this.close();
  146.         }
  147.     }
  148.  
  149. }
  150.  
  151. var menu = new Menu("#myMenu");
  152. var item1 = new Item("list");
  153. var item2 = new Item("torso", "#FF5C5C");
  154. var item3 = new Item("social-facebook", "#5CD1FF");
  155. var item4 = new Item("paypal", "#FFF15C");
  156. var item5 = new Item("link", "#64F592");
  157.  
  158. menu.add(item1);
  159. menu.add(item2);
  160. menu.add(item3);
  161. menu.add(item4);
  162. menu.add(item5);
  163. $(document).delay(50).queue(function(next) {
  164.     menu.open();
  165.     next();
  166.     $(document).delay(1000).queue(function(next) {
  167.         menu.close();
  168.         next();
  169.     });
  170. });

自由拖拽弹性圆形菜单

已有 465 人购买
查看演示升级 VIP立刻购买

演示地址 下载地址
收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!