当前位置:首页 > VUE

vue实现扇形菜单

2026-01-17 13:20:27VUE

实现扇形菜单的思路

扇形菜单通常以圆形或扇形布局展示多个菜单项,可以通过CSS和Vue的动态渲染实现。关键在于计算每个菜单项的位置角度,并使用CSS的transform属性进行旋转定位。

基础HTML结构

在Vue组件中,使用v-for动态渲染菜单项,并为每个菜单项绑定旋转角度和位置样式。

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

CSS样式设计

通过CSS设置菜单项的初始位置和旋转效果。核心是利用transform-originrotate实现扇形布局。

.sector-menu-container {
  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;
  color: white;
  cursor: pointer;
  transform-origin: center center;
  left: 50%;
  top: 50%;
  margin-left: -30px;
  margin-top: -30px;
}

计算菜单项位置

在Vue的methods中定义计算每个菜单项旋转角度的函数,根据索引和总菜单项数均匀分配角度。

export default {
  data() {
    return {
      menuItems: [
        { label: 'Home', action: 'home' },
        { label: 'About', action: 'about' },
        { label: 'Contact', action: 'contact' },
        { label: 'Settings', action: 'settings' },
        { label: 'Help', action: 'help' }
      ],
      radius: 100 // 扇形半径
    };
  },
  methods: {
    getItemStyle(index) {
      const angle = (360 / this.menuItems.length) * index;
      const radian = (angle * Math.PI) / 180;
      const x = this.radius * Math.cos(radian);
      const y = this.radius * Math.sin(radian);
      return {
        transform: `rotate(${angle}deg) translate(${this.radius}px) rotate(-${angle}deg)`,
        'z-index': this.menuItems.length - index
      };
    },
    handleClick(item) {
      console.log(`Clicked: ${item.action}`);
      // 触发菜单项点击事件
    }
  }
};

动画效果增强

可以通过CSS过渡或Vue的过渡组件为菜单项添加悬停或点击动画效果。

.menu-item {
  transition: transform 0.3s ease, background 0.2s ease;
}

.menu-item:hover {
  background: #3aa876;
  transform: scale(1.1) rotate(var(--rotate-angle)) translate(var(--radius)) rotate(calc(-1 * var(--rotate-angle)));
}

动态调整参数

通过Vue的响应式数据动态调整扇形半径、菜单项数量或角度偏移量,实现灵活配置。

computed: {
  sectorOptions() {
    return {
      radius: this.radius,
      itemCount: this.menuItems.length
    };
  }
}

完整示例代码

整合以上部分,完整的Vue扇形菜单组件代码如下:

vue实现扇形菜单

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

<script>
export default {
  data() {
    return {
      menuItems: [
        { label: 'Home', action: 'home' },
        { label: 'About', action: 'about' },
        { label: 'Contact', action: 'contact' },
        { label: 'Settings', action: 'settings' },
        { label: 'Help', action: 'help' }
      ],
      radius: 100
    };
  },
  methods: {
    getItemStyle(index) {
      const angle = (360 / this.menuItems.length) * index;
      return {
        transform: `rotate(${angle}deg) translate(${this.radius}px) rotate(-${angle}deg)`,
        'z-index': this.menuItems.length - index
      };
    },
    handleClick(item) {
      alert(`Action: ${item.action}`);
    }
  }
};
</script>

<style>
.sector-menu-container {
  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;
  color: white;
  cursor: pointer;
  transform-origin: center center;
  left: 50%;
  top: 50%;
  margin-left: -30px;
  margin-top: -30px;
  transition: transform 0.3s ease, background 0.2s ease;
}

.menu-item:hover {
  background: #3aa876;
  transform: scale(1.1) rotate(var(--rotate-angle)) translate(var(--radius)) rotate(calc(-1 * var(--rotate-angle)));
}
</style>

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

相关文章

css制作tab菜单

css制作tab菜单

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

vue实现菜单定位

vue实现菜单定位

Vue实现菜单定位的方法 使用scrollIntoView方法 通过监听菜单点击事件,获取目标元素的DOM节点,调用scrollIntoView方法实现平滑滚动定位。需配合ref获取DOM节点。 m…

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单负责导航功能,右侧区域根据菜单选择动态展示对应内容。 创建基本组件结构 在Vue项目中创建…

css二级菜单制作

css二级菜单制作

使用纯CSS制作二级菜单 HTML结构采用嵌套的<ul>和<li>标签,主菜单项包含子菜单: <nav class="menu"> <ul>…

vue实现折叠菜单

vue实现折叠菜单

实现折叠菜单的基本思路 在Vue中实现折叠菜单通常涉及使用组件化开发,结合状态管理控制菜单的展开与折叠。核心是通过v-show或v-if动态切换子菜单的显示状态,并通过事件触发(如点击)改变状态。…

实现树形菜单vue

实现树形菜单vue

实现树形菜单的Vue方案 递归组件实现 创建递归组件TreeMenu.vue,通过组件自身调用自身实现无限层级渲染: <template> <ul> <li…