当前位置:首页 > VUE

vue实现环形菜单

2026-02-20 02:50:31VUE

实现环形菜单的基本思路

环形菜单通常指围绕中心点呈环形排列的菜单项,点击后可能展开或触发动作。Vue 结合 CSS 可以实现这种效果,核心在于计算每个菜单项的位置角度。

基础实现步骤

HTML 结构

<template>
  <div class="circle-menu">
    <div class="menu-item" v-for="(item, index) in items" :key="index" 
         :style="getItemStyle(index)">
      {{ item.label }}
    </div>
  </div>
</template>

CSS 样式

vue实现环形菜单

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

.menu-item {
  position: absolute;
  width: 60px;
  height: 60px;
  background: #42b983;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transform-origin: center;
}

Vue 计算位置

<script>
export default {
  data() {
    return {
      items: [
        { label: 'A' },
        { label: 'B' },
        { label: 'C' },
        { label: 'D' }
      ],
      radius: 100 // 环形半径
    }
  },
  methods: {
    getItemStyle(index) {
      const angle = (index * 2 * Math.PI) / this.items.length;
      const x = this.radius * Math.cos(angle);
      const y = this.radius * Math.sin(angle);
      return {
        left: `calc(50% + ${x}px - 30px)`,
        top: `calc(50% + ${y}px - 30px)`
      };
    }
  }
}
</script>

动态展开效果

通过添加状态控制环形展开/收缩:

vue实现环形菜单

data() {
  return {
    isExpanded: false,
    expandedRadius: 150,
    collapsedRadius: 0
  }
},
methods: {
  toggleMenu() {
    this.isExpanded = !this.isExpanded;
  },
  getCurrentRadius() {
    return this.isExpanded ? this.expandedRadius : this.collapsedRadius;
  }
}

动画优化

添加 CSS 过渡效果:

.menu-item {
  transition: all 0.3s ease;
}

交互事件处理

为菜单项添加点击事件:

<div class="menu-item" @click="handleClick(item)">
  {{ item.label }}
</div>
methods: {
  handleClick(item) {
    alert(`Selected: ${item.label}`);
  }
}

完整组件示例

<template>
  <div>
    <button @click="toggleMenu">Toggle Menu</button>
    <div class="circle-menu">
      <div 
        v-for="(item, index) in items" 
        :key="index"
        class="menu-item"
        :style="getItemStyle(index)"
        @click="handleClick(item)"
      >
        {{ item.label }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { label: 'Home' },
        { label: 'About' },
        { label: 'Services' },
        { label: 'Contact' }
      ],
      isExpanded: false,
      radius: 120
    }
  },
  methods: {
    toggleMenu() {
      this.isExpanded = !this.isExpanded;
    },
    getItemStyle(index) {
      const currentRadius = this.isExpanded ? this.radius : 0;
      const angle = (index * 2 * Math.PI) / this.items.length;
      const x = currentRadius * Math.cos(angle);
      const y = currentRadius * Math.sin(angle);
      return {
        left: `calc(50% + ${x}px - 30px)`,
        top: `calc(50% + ${y}px - 30px)`
      };
    },
    handleClick(item) {
      console.log('Selected:', item.label);
    }
  }
}
</script>

注意事项

  • 调整 radius 值控制环形大小
  • 菜单项数量变化时需要重新计算角度
  • 移动端可能需要增加触摸事件支持
  • 考虑添加遮罩层提升用户体验

通过以上方法可以实现基础的环形菜单,更复杂的效果可以结合 SVG 或第三方动画库实现。

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

相关文章

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单调用的方法 使用路由配置生成菜单 在 Vue 项目中,可以通过路由配置自动生成菜单结构。路由配置通常包含 path、name、meta 等信息,这些信息可用于构建菜单项。 //…

css制作横向菜单

css制作横向菜单

使用 Flexbox 制作横向菜单 Flexbox 是制作横向菜单的现代方法,代码简洁且兼容性好。以下是一个基本实现: <nav class="horizontal-menu"> &…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

vue实现环形进度

vue实现环形进度

Vue 实现环形进度条的方法 使用 SVG 和 CSS 实现 在 Vue 中创建一个环形进度条可以通过 SVG 和 CSS 结合实现。以下是一个简单的实现方式: <template>…

vue树形菜单实现

vue树形菜单实现

Vue 树形菜单实现方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形菜单的常见方式。通过组件自身调用自身,可以轻松处理嵌套的树形数据。 <template> <u…

vue实现垂直菜单

vue实现垂直菜单

实现垂直菜单的基本结构 在Vue中实现垂直菜单,通常需要使用<ul>和li>标签构建菜单项,结合Vue的v-for指令动态渲染菜单数据。以下是一个基础模板: <templat…