当前位置:首页 > VUE

vue实现环形菜单

2026-01-19 10:29:53VUE

实现环形菜单的基本思路

环形菜单通常指围绕中心点呈圆形排列的菜单项,点击后可能有展开或选中效果。Vue实现的核心在于计算每个菜单项的位置和动态交互。

基础HTML结构

<template>
  <div class="circle-menu">
    <div class="menu-center" @click="toggleMenu"></div>
    <div 
      v-for="(item, index) in menuItems" 
      :key="index"
      class="menu-item"
      :style="getItemStyle(index)"
      @click="handleItemClick(item)"
    >
      {{ item.label }}
    </div>
  </div>
</template>

核心CSS样式

.circle-menu {
  position: relative;
  width: 300px;
  height: 300px;
}

.menu-center {
  position: absolute;
  width: 60px;
  height: 60px;
  background: #42b983;
  border-radius: 50%;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  cursor: pointer;
}

.menu-item {
  position: absolute;
  width: 50px;
  height: 50px;
  background: #35495e;
  color: white;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all 0.3s ease;
}

计算菜单项位置

data() {
  return {
    isOpen: false,
    menuItems: [
      { label: 'A', action: () => console.log('A clicked') },
      { label: 'B', action: () => console.log('B clicked') },
      { label: 'C', action: () => console.log('C clicked') }
    ],
    radius: 100
  }
},
methods: {
  getItemStyle(index) {
    if (!this.isOpen) {
      return { transform: 'translate(-50%, -50%)' };
    }
    const angle = (index * (360 / this.menuItems.length)) * Math.PI / 180;
    const x = Math.cos(angle) * this.radius;
    const y = Math.sin(angle) * this.radius;
    return {
      left: `calc(50% + ${x}px)`,
      top: `calc(50% + ${y}px)`,
      transform: 'translate(-50%, -50%)'
    };
  }
}

添加交互逻辑

methods: {
  toggleMenu() {
    this.isOpen = !this.isOpen;
  },
  handleItemClick(item) {
    item.action();
    this.toggleMenu();
  }
}

动画优化

添加CSS过渡效果使展开更平滑:

.menu-item {
  transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}

响应式调整

监听窗口大小变化自动调整半径:

mounted() {
  window.addEventListener('resize', this.adjustRadius);
  this.adjustRadius();
},
methods: {
  adjustRadius() {
    this.radius = Math.min(window.innerWidth, window.innerHeight) * 0.2;
  }
}

高级功能扩展

  1. 添加子菜单层级
  2. 实现拖拽调整位置
  3. 添加图标代替文字
  4. 实现3D倾斜效果
  5. 添加点击波纹动画

完整实现需要根据具体需求调整参数和交互细节,上述代码提供了环形菜单的核心实现方案。

vue实现环形菜单

标签: 环形菜单
分享给朋友:

相关文章

vue实现左右菜单联动实现

vue实现左右菜单联动实现

Vue 实现左右菜单联动 使用事件总线通信 在 Vue 中可以通过事件总线实现左右菜单的通信。创建一个中央事件总线实例,让左右菜单通过事件监听和触发实现联动。 // eventBus.js impo…

css制作下拉菜单

css制作下拉菜单

CSS 制作下拉菜单的方法 使用纯 CSS 可以创建简单的下拉菜单效果,主要依赖 :hover 伪类和 display 属性控制子菜单的显示与隐藏。 基础 HTML 结构 <div clas…

纯css制作下拉菜单

纯css制作下拉菜单

纯CSS下拉菜单实现方法 通过CSS的:hover伪类和display属性可以实现纯CSS下拉菜单,无需JavaScript。以下是具体实现方式: HTML结构示例: <nav class=…

vue无限菜单怎么实现

vue无限菜单怎么实现

Vue 无限级菜单的实现 实现无限级菜单通常需要递归组件和动态数据结构的结合。以下是具体实现方法: 数据结构设计 采用嵌套结构表示菜单层级,每个菜单项包含 children 属性存储子菜单:…

jquery菜单

jquery菜单

以下是关于使用jQuery创建交互式菜单的几种常见方法及实现示例: 基础下拉菜单实现 通过jQuery的slideToggle和toggleClass实现简单下拉效果: $('.menu-item…

css制作下拉菜单

css制作下拉菜单

使用纯CSS制作下拉菜单 通过HTML和CSS可以创建无需JavaScript的下拉菜单,主要利用:hover伪类和display属性控制显示隐藏。 HTML结构示例: <div cla…