創建頂部導航

導航組件,在layout文件夾下面新建

ResponsiveNavbar.vue

<template><nav class="navbar" :class="{ 'navbar--mobile': isMobile }"><div class="navbar-container"><!-- Logo --><div class="navbar-logo"><router-link to="/" class="logo-link"><span class="logo-text">YourLogo</span></router-link></div><!-- 桌面端導航菜單 --><div v-if="!isMobile" class="navbar-menu"><ul class="menu-list"><li v-for="(item, index) in menuItems" :key="index" class="menu-item"@click="activeMenu(index)"><router-link :to="item.path" class="menu-link":class="{ 'menu-link--active': activeItem === index || item.active }">{{ item.name }}</router-link></li></ul></div><!-- 移動端漢堡菜單按鈕 --><div v-else class="navbar-hamburger" @click="toggleMobileMenu"><span class="hamburger-line"></span><span class="hamburger-line"></span><span class="hamburger-line"></span></div></div><!-- 移動端下拉菜單 --><div v-if="isMobile && showMobileMenu" class="navbar-mobile-menu"><ul class="mobile-menu-list"><li v-for="(item, index) in menuItems" :key="index" class="mobile-menu-item"@click="closeMobileMenu"><router-link :to="item.path" class="mobile-menu-link">{{ item.name }}</router-link></li></ul></div></nav>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
//從路由配置里面獲取路由
import {routes} from '@/router';//根據layout過濾,得到需要展示的導航
const menuItems = [];
routes.filter(d=>{if(d.layout){let menu = {name: d.layout.name,path: d.path,active: false}if(window.location.pathname == d.path){menu.active = true}menuItems.push(menu)}
})// 響應式狀態
const isMobile = ref(false);
const showMobileMenu = ref(false);
const activeItem = ref(null);const activeMenu = (index) => {activeItem.value = indexmenuItems.filter(d => {d.active = false})
}// 檢測屏幕寬度變化
const checkScreenSize = () => {isMobile.value = window.innerWidth < 768;if (!isMobile.value) {showMobileMenu.value = false; // 如果從移動端切換到PC端,關閉移動菜單}
};// 切換移動端菜單顯示狀態
const toggleMobileMenu = () => {showMobileMenu.value = !showMobileMenu.value;
};// 關閉移動端菜單
const closeMobileMenu = () => {showMobileMenu.value = false;
};// 生命周期鉤子
onMounted(() => {checkScreenSize();window.addEventListener('resize', checkScreenSize);
});onUnmounted(() => {window.removeEventListener('resize', checkScreenSize);
});
</script><style scoped>
/* 基礎樣式 */
.navbar {background-color: #ffffff;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);position: fixed;top: 0;left: 0;width: 100%;z-index: 1000;transition: all 0.3s ease;
}.navbar-container {display: flex;justify-content: space-between;align-items: center;padding: 0 2rem;height: 70px;max-width: 1200px;margin: 0 auto;
}.logo-link {text-decoration: none;color: #333;font-weight: bold;font-size: 1.5rem;
}.logo-text {color: #4a6cf7;
}/* 桌面端菜單樣式 */
.menu-list {display: flex;list-style: none;margin: 0;padding: 0;
}.menu-item {margin: 0 1rem;position: relative;
}.menu-link {color: #333;text-decoration: none;font-weight: 500;padding: 0.5rem 0;transition: all 0.3s ease;position: relative;
}.menu-link:hover {color: #4a6cf7;
}/* 桌面端懸停效果 */
.menu-link::after {content: '';position: absolute;bottom: 0;left: 0;width: 0;height: 2px;background-color: #4a6cf7;transition: width 0.3s ease;
}.menu-link:hover::after {width: 100%;
}.menu-link--active {color: #4a6cf7;
}.menu-link--active::after {width: 100%;
}/* 移動端漢堡菜單 */
.navbar-hamburger {display: flex;flex-direction: column;justify-content: space-between;width: 30px;height: 20px;cursor: pointer;
}.hamburger-line {width: 100%;height: 2px;background-color: #333;transition: all 0.3s ease;
}/* 移動端菜單 */
.navbar-mobile-menu {position: absolute;top: 67px;left: 0;width: 100%;background-color: #ffffff;box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);z-index: 999;
}.mobile-menu-list {list-style: none;padding: 0;margin: 0;
}.mobile-menu-item {border-bottom: 1px solid #f0f0f0;
}.mobile-menu-link {display: block;padding: 1rem 2rem;color: #333;text-decoration: none;transition: background-color 0.3s ease;
}.mobile-menu-link:hover {background-color: #f5f5f5;
}/* 響應式調整 */
@media (max-width: 768px) {.navbar-container {padding: 0 1rem;}.logo-text {font-size: 1.2rem;}
}/* 移動端導航欄樣式 */
.navbar--mobile {height: auto;padding: 0;
}.navbar--mobile .navbar-container {height: auto;padding: 1rem;
}.navbar--mobile .menu-list {flex-direction: column;
}
</style>

修改App.vue

<template><ResponsiveNavbar /><main><!-- 你的頁面內容 --><router-view /></main>
</template><script lang="ts">
import { defineComponent } from "vue";
import ResponsiveNavbar from '@/layout/ResponsiveNavbar.vue';
export default defineComponent({name: "app",components: {ResponsiveNavbar}
});
</script>

在router/index.ts添加路由


export const routes = [{path: '/',name: 'Home',component:  () => import('@/views/home/HomeView.vue'),layout: {name: "首頁"}},{path: '/blog',name: 'Blog',component: () => import('@/views/blog/blog.vue'),meta: { requiresAuth: false },layout: {name: "文章"}},{path: '/friend',name: 'Friend',component:  () => import('@/views/friend/friend.vue'),layout: {name: "友鏈"}},{path: '/about',name: 'About',component: () => import('@/views/about/about.vue'),meta: { requiresAuth: false },layout: {name: "關于"}},{path: '/message',name: 'Message',component: () => import('@/views/message/message.vue'),meta: { requiresAuth: false },layout: {name: "留言板"}}
}]

?layout為導航選項,如果該路由是導航,那必須要寫,否則就不用寫

效果圖

?以上僅為展示效果,具體細節還需自己更改

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88378.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88378.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI對話導出工具 (AI Chat Exporter)——支持 ChatGPT, Grok 和 Gemini 平臺

&#x1f680; AI對話導出工具 (AI Chat Exporter) 輕松將AI對話導出為標準Markdown格式 支持 ChatGPT, Grok 和 Gemini 平臺 相關代碼已開源至 Github 歡迎Star ? 功能特點 &#x1f504; 多平臺支持&#xff1a;同時支持 ChatGPT, Grok 和 Gemini 三大AI平臺&#x1f4dd;…

【MATLAB代碼】基于MVC的EKF和經典EKF對三維非線性狀態的濾波,提供濾波值對比、誤差對比,應對跳變的觀測噪聲進行優化

本文所述的代碼實現了改進的擴展卡爾曼濾波算法&#xff08;MVC-EKF&#xff09;&#xff0c;針對三維運動估計場景&#xff0c;與經典EKF算法進行性能對比。代碼通過引入Versoria函數優化協方差更新過程&#xff0c;顯著提升了在測量異常值干擾下的狀態估計魯棒性。 文章目錄 …

【Linux】Linux系統的基礎操作

目錄 常用命令速遞 系統目錄結構及路徑 Linux 常用命令 做兩個小項目 據此操作 用戶配額 前言 當下&#xff0c;Linux 系統作為開源操作系統&#xff0c;意義和作用重大。技術上&#xff0c;其開源特性極大推動軟件開發進步&#xff0c;全球開發者可共同完善&#xff0c…

使用 C++/OpenCV 構建中文 OCR 系統:實現賬單、發票及 PDF 讀取

使用 C/OpenCV 構建中文 OCR 系統&#xff1a;實現賬單、發票及 PDF 讀取 在當今數字化浪潮中&#xff0c;自動從文檔中提取信息至關重要&#xff0c;尤其是在處理大量賬單、發票和 PDF 文件時。光學字符識別&#xff08;OCR&#xff09;技術是實現這一目標的核心。本文將詳細…

windows配置Jenkins自動化定時任務+測試報告發送

一、Jenkins的安裝步驟 JDK安裝 沒有JDK的先安裝JDKhttps://adoptium.net/zh-CN/temurin/releases/?osany&archany&version21 下載Jenkins 由于JDK 1.8僅適配Jenkins 2.357之前的版本&#xff08;如2.346.1及以下&#xff09;&#xff0c;需從舊版本渠道下載&#xf…

預訓練語言模型基礎知識概述

文章目錄 預處理語言模型的發展預訓練語言模型統計語言模型神經網絡語言模型 詞向量onehot編碼詞嵌入word embedding Word2Vec模型RNN和LSTMRNNLSTM ELMo模型預訓練下游任務 Attention自注意力Masked Self AttentionMulti-head Self Attention 位置編碼Transformer概念GPT概念B…

瀏覽器工作原理24 [#]分層和合成機制:為什么css動畫比JavaScript高效

引用 《瀏覽器工作原理與實踐》 本文主要講解渲染引擎的分層和合成機制&#xff0c;因為分層和合成機制代表了瀏覽器最為先進的合成技術&#xff0c;Chrome 團隊為了做到這一點&#xff0c;做了大量的優化工作。了解其工作原理&#xff0c;有助于拓寬你的視野&#xff0c;而且也…

【數字后端】-什么是RC corner? 每種Corner下有什么區別?

芯片的寄生參數可以在多個corner下提取&#xff0c;他們對應了不同情況的net delay Typical&#xff1a;R和C都是標準值Cmax(Cworst)&#xff1a;C最大的互連角&#xff0c;R小于TypicalCmin(Cbest)&#xff1a;C最小&#xff0c;R大于TypicalRCmax(RCworst)&#xff1a;互連線…

HarmonyOS開發基礎 --鴻蒙倉頡語言基礎語法入門

倉頡編程語言是華為自主研發的一種面向全場景應用開發的現代編程語言&#xff0c;具有高效編程、安全可靠、輕松并發和卓越性能等特點。本節將簡單介紹倉頡語言的部分語法和使用&#xff0c;幫助開發者快速上手。 1.3.1&#xff1a;數據類型 整數 倉頡把整數分為有符號和無符…

Excel文件比較器v1.3,html和js寫的

Excel文件比較器v1.3 版本說明&#xff1a;v1.3 1添加支持文件格式&#xff1a;CSV。 2&#xff0c;添加60條歷史記錄保存功能 - 用于保存比對結果。歷史記錄保存在瀏覽器的localStorage中&#xff0c;這是一個瀏覽器提供的本地存儲機制&#xff0c;數據會一直保留直到用戶…

Kimi“新PPT助手” ,Kimi全新自研的免費AI生成PPT助手

大家好&#xff0c;這里是K姐。 一個幫你用AI輕松生成精美PPT的女子。 前段時間給大家分享了一期用智能體做PPT的對比測評&#xff0c;很多友友都表示&#xff1a;那 Kimi 呢&#xff1f; 今天偶然發現 Kimi 新增了一個叫“新PPT助手”的功能&#xff0c;立馬上手體驗了一下…

MySQL DATETIME類型存儲空間詳解:從8字節到5字節的演變

在MySQL數據庫設計中&#xff0c;DATETIME類型用于存儲日期和時間信息&#xff0c;但其存儲空間大小并非固定不變&#xff0c;而是隨MySQL版本迭代和精度定義動態變化。本文將詳細說明其存儲規則&#xff0c;并提供清晰的對比表格。 一、核心結論 MySQL 5.6.4 是分水嶺&#…

Gartner發布中國企業應用生成式AI指南:避免12 個 GenAI 陷阱

GenAI 技術&#xff08;例如 AI 代理和 DeepSeek&#xff09;的快速迭代導致企業抱有不切實際的期望。本研究借鑒了我們與中國 AI 領導者就常見的 GenAI 陷阱進行的討論&#xff0c;并提供了最終有助于成功采用的建議。 主要發現 接受調查的首席信息官表示&#xff0c;生成式人…

Vue3中ref和reactive的區別與使用場景詳解

在 Vue 3 中&#xff0c;響應式系統進行了全新設計&#xff0c;ref 和 reactive 是其中的核心概念。 ### 一、ref 的使用 ref 適用于基本數據類型&#xff0c;也可以用于對象&#xff0c;但返回的是一個帶 .value 的包裝對象。 js import { ref } from vue const count ref(…

React性能優化:父組件如何導致子組件重新渲染及避免策略

目錄 React性能優化&#xff1a;父組件如何導致子組件重新渲染及避免策略什么是重新渲染&#xff1f;父組件如何"無辜"地讓子組件重新渲染&#xff1f;示例 1: 基礎父組件狀態變更示例 2: 傳遞未變化的原始類型Prop示例 3: 傳遞引用類型Prop&#xff08;對象&#xf…

圖的拓撲排序管理 Go 服務啟動時的組件初始化順序

在構建復雜的 Go 應用程序時&#xff0c;服務的啟動過程往往涉及多個組件的初始化&#xff0c;例如日志、配置、數據庫連接、緩存、服務管理器、適配器等等。這些組件之間通常存在著復雜的依賴關系&#xff1a;日志可能需要配置信息&#xff0c;數據庫連接可能依賴日志和追蹤&a…

【物理重建】SPLART:基于3D高斯潑濺的鉸鏈估計與部件級重建

標題&#xff1a;《SPLART: Articulation Estimation and Part-Level Reconstruction with 3D Gaussian Splatting》 項目&#xff1a;https://github.com/ripl/splart 文章目錄 摘要一、引言二、相關工作2.1 數據驅動的鉸鏈學習2.2 物體重建的表征方法2.3 鉸鏈物體重建 三、方…

vscode中vue自定義組件的標簽失去特殊顏色高亮

遇到的問題 最近接觸了一個歷史遺留項目時&#xff0c;我遭遇了堪稱"史詩級屎山"的代碼結構——各種命名混亂的自定義組件和原生HTML標簽混雜在一起&#xff0c;視覺上完全無法區分。這讓我突然想起&#xff0c;之前在使用vue或者其他框架開發的時候&#xff0c;只要…

【Dify精講】第19章:開源貢獻指南

今天&#xff0c;讓我們深入 Dify 的開源貢獻體系&#xff0c;看看這個項目是如何在短短時間內聚集起一個活躍的開發者社區的。作為想要參與 Dify 開發的你&#xff0c;這一章將是你的實戰指南。 一、代碼貢獻流程&#xff1a;從想法到合并的完整路徑 1.1 貢獻前的準備工作 …

Web攻防-CSRF跨站請求偽造Referer同源Token校驗復用刪除置空聯動上傳或XSS

知識點&#xff1a; 1、Web攻防-CSRF-原理&檢測&利用&防御 2、Web攻防-CSRF-防御-Referer策略隱患 3、Web攻防-CSRF-防御-Token校驗策略隱患 一、演示案例-WEB攻防-CSRF利用-原理&構造 CSRF 測試功能點 刪除帳戶 更改電子郵件 如果不需要舊密碼&#xff0c;請…