需求背景

本来是使用的element-plus的UI框架,横向菜单模式,但菜单项比较多,希望能点击菜单能向后面滑动,看到网上有类似案例,所以我借鉴一些案例实现了这个功能,也是做个记录了

效果图

具体实现

html部分
      <!-- 水平一级菜单 -->
      <div class="menu" ref="menuRef" >    
        <!-- 实际宽度大于可视宽度时才显示左右箭头 -->
        <el-icon v-if="menuRealWidth>menuViewWidth" class="left-arrow" @click="navPrev"><ArrowLeft /></el-icon>         
        <el-menu 
          :style="{transform:'translateX(-'+move+'px)'}"
          class="el-menu"
          mode="horizontal"
          text-color="#000000"
          active-text-color="#3989fa"
          :default-active="toIndex" 
          @select="handleSelect">
         
          <el-menu-item v-for="(item, index) in menuList" :index="item.path" :key="index">
            <span slot="title">{{ item.meta.title }}</span>
          </el-menu-item>
        </el-menu>  
        <el-icon v-if="menuRealWidth>menuViewWidth" class="right-arrow" @click="navNext" ><ArrowRight /></el-icon>
      </div>
css部分
.header .menu {
  position: relative;
  flex: 1;
  overflow-x: hidden; 
  white-space: nowrap; /* 设置为一行显示,超出部分自动隐藏 */
  display: flex;
  align-items: center;
}
.menu .left-arrow,.menu .right-arrow {
  position: absolute;
  top: 0;
  z-index: 9;
  height: 60px;
  line-height: 60px;
  width: 30px;
  background-color: #fff;
}
.menu .left-arrow {
  left: 0;
}
.menu .right-arrow {
  right: 0;
}
.el-menu.el-menu--horizontal {
  border-bottom: none !important;
  background: transparent;
  transition:all .2s;
}
js部分
import {ref,reactive, computed, onMounted,watch} from 'vue'
const menuRealWidth=ref(0) // 菜单实际宽度
const menuViewWidth=ref(0) // 菜单可视宽度
const move=ref(0) // 可移动的范围
onMounted(()=>{
  menuRealWidth.value=menuRef.value.scrollWidth
  menuViewWidth.value=menuRef.value.offsetWidth
  window.onresize = () => {
        return (() => {
          menuViewWidth.value = menuRef.value.offsetWidth;
            if(move.value>menuRealWidth.value-menuViewWidth.value-88){
                move.value=menuRealWidth.value-menuViewWidth.value;
            }
        })()}
})
const navPrev=()=>{
  // 当菜单项向右的可移动距离大于单个菜单项的宽度时,move减去一个菜单项的宽度(即右移移动一个菜单项的宽度),
	// 当菜单项向右的可移动距离小于单个菜单项的宽度时,move等于0(即回到最开始没有移动的状态)
  if(move.value>88){
        move.value=move.value-88;
    }else{
        move.value=0
    }
}
const navNext=()=>{
  // 当菜单项向左的可移动距离大于单个菜单项的宽度时,move减去一个菜单项的宽度(即左移移动一个菜单项的宽度),
	// 当菜单项向左的可移动距离小于单个菜单项的宽度时,move等于可以向左移动的最大值(即到最末尾)
  if(move.value<menuRealWidth.value-menuViewWidth.value-88){
        move.value=move.value+88
    }
    else{
        move.value=menuRealWidth.value-menuViewWidth.value
    }
}

我在网上看的一些案例基本上都是手写的结构,没有使用UI组件,照着套用的时候,样式那块一直出问题,反正就改来改去,勉强能用

借鉴的案例链接:https://blog.csdn.net/Watanaki/article/details/111060410

GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐