当前位置:首页 > VUE

vue实现环形菜单

2026-01-19 10:29:53VUE

实现环形菜单的基本思路

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

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过渡效果使展开更平滑:

vue实现环形菜单

.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 3 和 Vue Router 的菜单实现方案: 基础菜单结构 在 Vue 中,菜单通常是一个递…

jquery菜单

jquery菜单

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

css制作下拉菜单

css制作下拉菜单

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

css div 制作导航菜单

css div 制作导航菜单

使用 CSS 和 Div 制作导航菜单 导航菜单是网站的重要组成部分,以下是通过 CSS 和 div 元素制作导航菜单的方法。 基本 HTML 结构 创建一个简单的 div 结构作为导航菜单的基础:…

vue实现横排菜单

vue实现横排菜单

实现横排菜单的方法 在Vue中实现横排菜单可以通过多种方式完成,以下是几种常见的实现方法。 使用Flex布局实现横排菜单 通过CSS Flex布局可以轻松实现横排菜单,代码简洁且兼容性好。…

vue实现菜单缩放

vue实现菜单缩放

实现思路 通过 Vue 的响应式数据和 CSS 过渡效果,结合动态绑定 class 或 style 来实现菜单的缩放功能。核心是利用 v-bind:class 或 v-bind:style 控制菜单宽…