Vue element响应式布局导航栏递归生成.el-submenu .el-menu-item里面出现min-width:200px样式穿透问题.

在使用Vue和ElementUI构建的前端项目中,遇到递归生成的导航栏因ElementUI的.min-width:200px样式导致二级菜单宽度异常。分析原因是导航栏的响应式布局和递归组件。解决方法是利用Vue的<style>标签配合不同的样式穿透技巧(css使用>>>,less使用/deep/,scss使用::v-deep),避免样式穿透,成功调整下级导航栏的宽度。

问题发现处:可以看出二级导航栏多出有点宽度,样式里面有一个min-width:200px

 分析问题的原因:导航栏布局是采用element的响应式布局并且是封装成组件递归调用出来的下级导航栏,方便以后调用接口动态渲染导航栏。但是因为elementui导航样式默认最小宽度200px。所以后面递归生成的子组件的宽度就成了200px.

 

<template>
  <div>
    <el-row
      ><el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
        ><Logo class="logo"></Logo></el-col
    ></el-row>
    <el-row>
      <el-col :xs="8" :sm="6" :md="4" :lg="3" :xl="1"
        ><Sidebar :menus="menus"></Sidebar
      ></el-col>
      <el-col :xs="16" :sm="18" :md="20" :lg="21" :xl="23">
        <el-row><Breadcrumb></Breadcrumb></el-row>
        <el-row
          ><div class="app_main"><router-view></router-view></div
        ></el-row>
      </el-col>
    </el-row>
  </div>
</template>

<script>
import Sidebar from "@/layout/components/Sidebar";
import Logo from "@/layout/components/Logo.vue";
import Breadcrumb from "@/layout/components/Breadcrumb";

export default {
  components: { Sidebar, Logo, Breadcrumb },
  data() {
    return {
      menus: [
        {
          title: "首页",
          menuCode: "1",
          index: "/",
        },
        {
          title: "个人管理",
          menuCode: "2",
          index: "1",
          childre: [
            {
              title: "项目管理",
              menuCode: "1.1",
              index: "1.1",
              childre: [
                {
                  title: "竞赛项目",
                  menuCode: "1.1.1",
                  index: "1.1.1",
                },
              ],
            },
            {
              title: "期末设计",
              menuCode: "1.2",
              index: "1.3",
            },
          ],
        },
        {
          title: "课表",
          menuCode: "3",
          index: "/Timetable",
        },
        {
          title: "记事本(Notepad)",
          menuCode: "4",
          index: "/Notepad",
        },
        {
          title: "学习资料库",
          menuCode: "5",
          index: "/learningDatabase",
        },
        {
          title: "学习论坛",
          menuCode: "6",
          index: "/Forum",
        },
      ],
    };
  },
};
</script>

<style lang="scss" scoped>
.app_main {
  height: calc(100vh - 0px);
  padding: 10px 20px;
  overflow-y: scroll;
  overflow-x: hidden;
}
// 解决组件传透问题
::v-deep {
  .el-submenu .el-menu-item {
    min-width: 191px ;
  }
}
</style>

解决办法:由于是递归生成的下级导航栏会出现样式穿透的问题

vue中针对不同的样式类型(css,less,scss)有不用的样式穿透方法。

  • css 使用 >>>
  • less 使用 /deep/
  • scss 使用 ::v-deep
// 解决组件传透问题
::v-deep {
  .el-submenu .el-menu-item {
    min-width: 191px ;
  }
}

这样子后面的下级导航栏的宽度就可以改变了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值