vue pc官网顶部导航栏组件

官网顶部导航分为一级导航和二级导航

导航的样子

文件的层级

router 文件层级

header 组件代码

<h1 class="logo-wrap">
          <router-link to="/">
            <img class="logo" :src="$config.company.logo" alt="" />
            <img class="sub-logo" :src="$config.company.subLogo" alt="" />
          </router-link>
        </h1>
        <!-- 导航 -->
        <div class="menu-wrap">
          <ul>
            <!-- 一级 -->
            <li
                v-for="(item, index) in menus"
                @click="handle(index)"
                :class="{ active: index == menuIndex }"
                class="menu-item"
                v-if="$isNull(item.meta.isMenuHide)">
              <a href="javascript:;" class="a" @click="menuClick(item.path)">{{
                item.meta.title
              }}</a>
              <!-- 二级 -->
              <span class="child-menu-group" v-if="!item.meta.isChildMenuHide">
                <span
                      class="chil-item"
                      v-for="(childItem, childIndex) in item.children"
                      v-if="$isNull(childItem.meta.isMenuHide)">
                  <a
                     href="javascript:;"
                     class="child-a"
                     @click="menuClick(childItem.path)">{{ childItem.meta.title }}</a>
                </span>
              </span>
            </li>
          </ul>
        </div>

js 、css

 .logo-wrap {
    float: left;

    .logo,
    .sub-logo {}

    .sub-logo {
      display: inline-block;
      margin-left: 5px;
      padding-left: 5px;
      border-left: 1px #ffffff40 solid;
    }
  }  

.menu-wrap {
    float: right;

    .menu-item.active {
      &:before {
        position: absolute;
        content: "";
        bottom: 0;
        left: 50%;
        width: 30px;
        transform: translate3d(-50%, 0, 0);
        border-bottom: 2px #ffffff solid;
      }
    }

    li {
      position: relative;
      display: inline-block;

      &.active {}

      .a {
        display: block;
        padding: 15px 20px;
        color: #fff;
        font-size: 16px;
      }

      .child-menu-group {
        display: none;
        position: absolute;
        left: -30px;
        min-width: 160px;
        padding: 5px 0;
        background-color: #ffffff;
        border-radius: 6px;
        text-align: center;
        box-shadow: 0 0 4px rgba(0, 0, 0, 0.2);

        &:before {
          position: absolute;
          content: "";
          top: -6px;
          left: 50%;
          margin-left: -6px;
          width: 0;
          height: 0;
          border-left: 4px solid transparent;
          border-right: 4px solid transparent;
          border-bottom: 8px solid #ffffff;
        }

        .chil-item {
          position: relative;
          display: block;

          &::after {
            position: absolute;
            z-index: 1;
            top: 0;
            left: 0;
            content: "";
            height: 100%;
            width: 0;
            background-image: @background-image;
          }

          @keyframes childItem {
            0% {
              width: 0;
            }

            100% {
              width: 100%;
            }
          }

          &:hover {
            &::after {
              animation: childItem 0.2s ease-out;
              width: 100%;
            }

            a {
              color: #ffffff;
            }
          }
        }

        .child-a {
          display: block;
          position: relative;
          z-index: 2;
          padding: 10px 0;
        }
      }

      &:hover {
        .child-menu-group {
          display: block;
        }
      }
    }
  }
 data() {
    return {
      menus: [],
      menuIndex: 0,
      isMenuDrawer: false,
      isMenuFixed: false
    };
  },
  created() {
    this.menus = this.$router.options.routes[1].children;
    console.log( this.menus)
    this.findRouter(this.$route.path);
    this.resetPath(this.$route.path);
  },
  mounted() {
    this.onScroll();
  },
  watch: {
    //监听路由变化
    $route(to, from) {
      this.isMenuFixed = false;
      this.resetPath(to.path);
      this.findRouter(to.path);
    }
  },
  methods: {
    findRouter(path) {
      var i = path.indexOf("/", 1);
      var pathTo = "";
      if(i == -1) {
        pathTo = path;
      } else {
        pathTo = path.substring(0, i);
      }
      var list = this.menus;
      var index = list.findIndex((item, index) => {
        return pathTo == item.path;
      });
      this.menuIndex = index;
      document.title = this.menus[this.menuIndex].meta.title
    },
   
    // 二级菜单移动端
    menuSwitch() {
      this.isMenuDrawer = true;
    },
    // 点击菜单
    menuClick(path) {
      this.isMenuDrawer = false;
      this.$router.push(path);
    },
    // 导航切换
    handle(index) {
      this.isMenuDrawer = false;
      this.menuIndex = index;
      document.title = this.menus[this.menuIndex].meta.title
    },
    //获取页面路由,导航添加active
    resetPath(path) {
      var _menus = this.menus;
      for(var i in _menus) {
        if(_menus[i].path == path) {
          this.menuIndex = i;
          // 设置标题
          document.title = _menus[i].meta.title;
        }
      }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/228875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

点滴生活记录2

我从小跟着我爷爷奶奶&#xff0c;小学六年级转到县城上小学&#xff0c;就没跟我奶奶他们住一起了。十一回家&#xff0c;把奶奶接到我这住&#xff0c;细想&#xff0c;自六年级之后&#xff0c;就很少跟奶奶住一起了。 奶奶&#xff08;间歇性&#xff09;耳聋&#xff0c;为…

Mysql 索引概念回顾

一、什么是索引 在关系数据库中&#xff0c;索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构&#xff0c;它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录&#xff0c;可以根据…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

应公司需求&#xff0c;在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况&#xff1a;重复声明 2、第二种情况&#xff1a; 应官方要求&#xff0c;需要跳转的 tabBar 页面的路径&#xff08;需在 pages.json 的 tabBar 字段定义的页面&#xff09;&#xff0…

【力扣】234.回文链表

嗯&#xff0c;今天这道题是我自己写的哦~&#xff0c;哒哒哒。今天还是很不错滴~ 234.回文链表 说一下我的解题思路&#xff0c;首先我的想法很简单就是将这个链表反转&#xff0c;然后将反转之后的链表与原链表进行对比。相等就返回true,不相等就返回false。所以我就想到了昨…

【Linux系统化学习】命令行参数 | 环境变量的再次理解

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 代码仓库&#xff1a;Gitee 目录 mian函数传参获取环境变量 手动添加环境变量 导出环境变量 environ获取环境变量 本地变量和环境变量的区别 Linux的命令分类 常规命令 内建命令 …

docker安装与详细配置redis

docker安装redis 连接虚拟机 vagrant up //启动虚拟机 vagrant ssh //连接虚拟机进入root用户 su root输入密码&#xff1a;和账户名一样 vagrant 下载redis 直接下载redis镜像,下载redis最新镜像 docker pull redis下载的都是DockerHub中默认的官方镜像 创建文件目…

数据可视化在电商中的威力:改变经营的新趋势

随着电商行业的迅速发展&#xff0c;数据可视化在电商经营中扮演着越来越重要的角色。我接手的许多可视化大屏设计工作都来自于各类电商店铺&#xff0c;今天让我们一起来看看数据可视化是如何改变电商经营的。 首先&#xff0c;通过数据可视化可以更好地洞察消费者行为。通过…

渗透测试流程详细讲解

一、渗透测试基本概念 1.什么是渗透测试 渗透测试是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析&#xff0c;这个分析是从一个攻击者可能存在的位置来进行的&#xff0c;并且从这…

【Docker二】docker网络模式、网络通信、数据管理、资源控制

目录 一、docker网络模式&#xff1a; 1、概述 2、docker网络实现原理&#xff1a; 3、docker的网络模式&#xff1a; 3.1、bridge模式&#xff1a; 3.2、host模式&#xff1a; 3.3、container模式&#xff1a; 3.4、none模式&#xff1a; 3.5、自定义网络模式&#xf…

JS如何实现竖屏轮播图

首先是HTML搭建结构 <div class"banner-box"><div class"bannerbox"><div class"banner"><a class"a-img-ban"> <img class"img-ban" src"./img/640 (4).jpg" alt"终于等到你还…

One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记

One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记 Abstract 一对一&#xff08;o2o&#xff09;标签分配对基于变换器的端到端检测起着关键作用&#xff0c;最近已经被引入到全卷积检测器中&#xff0c;用于端到端密集检测。然而&#xff0c;o2o可能因为…

微前端 -- wujie 预加载和原理 无界传参

目录 wujie 预加载和原理 原理解析 MessageChannel 无界传参 1.全局变量 2.Props 3.event bus wujie 预加载和原理 提前把无界实例创建好 runPreload 赋值给sandbox.preload 预先加载好 startApp 判断是否有preload 需要从wujie的实例导出preloadApp,参数跟startApp 一…

mybatis数据输出-单个简单类型和返回实体类型对象以及别名设置

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

Python开源项目月排行 2023年11月

#2023年11月2023年11月19日1TTS文本到语音的深度学习工具包&#xff0c;在研究和生产中经过了实战测试。TTS-Text To Speech的缩写&#xff0c;即“从文本到语音”。 它将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的汉语口语&#xff08;或者其他语言语…

内部文件上传以及渲染-接口API

文件上传 地址http://172.16.0.118:8090/api/pm/base/affix/upload请求类型POSTContent-Type:text/plain;charsetutf-8参数 prjData {"prjId":"", "jobId":"3031b2c8-c809-4110-8e88-22c80a9c1ec0721aca89-96a1-4346-9b6e-022331d221d1Nec…

Python中的range()函数详解:掌握迭代的利器

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python中的range()函数是一个强大的工具&#xff0c;用于生成一系列的数字&#xff0c;常用于循环操作。虽然看似简单&#xff0c;但其灵活性和功能却不容小觑。在本文中&#xff0c;将深入研究range()函数&…

有哪些值得分享的销售拓客技巧?

拓客对于销售的重要性 拓客&#xff08;Toker&#xff09;是一个商业上的名词&#xff0c;核心就是提高售前服务、市场推广的水平&#xff0c;从而挖掘出潜在客户的隐形需求&#xff08;或称软需求&#xff09;。 拓客的核心&#xff0c;其实就是提高售前服务、市场推广的水平…

SpringAOP专栏一《使用教程篇》

在b站跟着黑马程序员学习SpringAOP时记的笔记。 面向切面编程AOP是 Spring的两大核心之一。 AOP概述 AOP是什么 AOP英文全称&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白了&#xff0c;面向切面编程就是…

Meta Platforms推出Imagine:基于Emu的免费AI文本到图像生成器服务

优势主要体现在以下两个方面&#xff1a; 精细运动控制&#xff1a; 该项目在实现摄像机运动和物体运动方面表现出色&#xff0c;成功实现了对两者运动的高度独立控制。这一特性为运动控制提供了更为精细的调整空间&#xff0c;使得在视频生成过程中能够实现更灵活、多样的运动…

OpenCL学习笔记(三)手动编译开发库(win10+mingw64)

前言 有的小伙伴仍然在使用mingw编译器&#xff0c;这时只能重新编译opencl的sdk库。本文档简单记录下win10下&#xff0c;使用mingw11.20编译的过程&#xff0c;有需要的小伙伴可以参考下 一、安装所需软件 1.安装git&#xff0c;教程比较多&#xff0c;不再重复 2.安装cm…