当前位置:首页 > 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);
}

响应式调整

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

vue实现环形菜单

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. 添加点击波纹动画

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

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

相关文章

css菜单制作

css菜单制作

基础水平菜单制作 使用无序列表<ul>和<li>标签构建结构,CSS设置横向排列: <ul class="horizontal-menu"> <li&g…

css制作tab菜单

css制作tab菜单

CSS制作Tab菜单的方法 HTML结构 使用无序列表和div容器构建基础结构,列表项为标签页标题,div内放置对应内容块。 <ul class="tab-menu"> <li…

vue实现导航菜单

vue实现导航菜单

Vue 实现导航菜单的方法 使用 Vue Router 实现基本导航 在 Vue 项目中安装 vue-router,通过路由配置实现页面跳转。路由配置文件中定义路径和组件映射,导航菜单通过 <r…

css制作二级菜单

css制作二级菜单

CSS制作二级菜单的方法 通过纯CSS实现二级菜单主要依赖HTML结构嵌套和CSS的:hover伪类选择器。以下是具体实现方式: HTML结构 <ul class="main-menu"&g…

vue实现联动菜单

vue实现联动菜单

实现联动菜单的基本思路 在Vue中实现联动菜单的核心在于数据绑定和事件监听。通过v-model绑定下拉菜单的值,利用watch或computed监听变化,动态更新下一级菜单的选项。 基础实现方法 创…

react如何实现菜单

react如何实现菜单

使用 React 实现菜单的方法 使用状态管理控制菜单显示/隐藏 通过 useState 管理菜单的展开和收起状态,结合点击事件切换状态。 import { useState } from 'rea…