[自定义 Vue 组件] 小尾巴顶部导航栏(2.0) TailTopNav

文章归档:https://www.yuque.com/u27599042/coding_star/oglrqteg8fzvvzn0

[自定义 Vue 组件] 响应式顶部导航栏(1.0) TopNav:https://www.yuque.com/u27599042/coding_star/hzltsltxgavwx8u2

组件效果示例

image.png
image.png

组件所依赖的子组件

  1. [自定义 Vue 组件] 小尾巴 Logo 组件(2.0) TailLogo:https://www.yuque.com/u27599042/coding_star/mluie83zdzaf40sy
  2. [自定义 Vue 组件] 小尾巴下拉菜单组件(2.0) TailDropDown:https://www.yuque.com/u27599042/coding_star/kcoem6dgyn8drglb

组件所依赖第三方库

@vueuse/core

pnpm i @vueuse/core

组件所依赖的 CSS 变量

在 src 目录下,创建 styles 目录,在其中创建 tailComponentsThemeStyles 目录,在 tailComponentsThemeStyles 目录中新建 light.css 与 dark.css 文件,在其中声明组件所依赖的和主题样式相关的 CSS 变量

/** 和小尾巴组件相关的亮色主题样式 CSS 变量*/
:root[class*='light'] {/** 小尾巴顶部导航栏组件样式变量*//* 小尾巴顶部导航栏组件背景颜色 */--tail-top-nav-bgc: #efefef99;/* 小尾巴顶部导航栏组件文字颜色 */--tail-top-nav-font-color: #333333;
}
/** 和小尾巴组件相关的暗色主题样式 CSS 变量*/
:root[class*='dark'] {/** 小尾巴顶部导航栏组件样式变量*//* 小尾巴顶部导航栏组件背景颜色 */--tail-top-nav-bgc: #454545;/* 小尾巴顶部导航栏组件文字颜色 */--tail-top-nav-font-color: #efefef;
}

在 index.html 文件中的 html 元素上添加 light 或 dark 类名

<html lang="zh-CN" class="light">

在 main.js 文件中引入组件所依赖的和主题样式相关的 CSS 变量

vue 项目中配置 src 目录别名:https://www.yuque.com/u27599042/coding_star/ogu2bhefy1fvahfv

import '@/styles/tailComponentsThemeStyles/light.css'
import '@/styles/tailComponentsThemeStyles/dark.css'

配置 sass 预处理

https://www.yuque.com/u27599042/coding_star/ua8sgyngldtaa2re

组件源码

在 src/components 目录下,创建 TailTopNav.vue 文件,在其中编写组件

<script setup>
import {useResizeObserver} from '@vueuse/core'
import {ref, onMounted} from 'vue'/*** 接收父组件传递的参数* @type {Prettify<Readonly<ExtractPropTypes<{}>>>}*/
const props = defineProps({// 小尾巴侧边导航栏组件展示按钮点击事件处理器函数sliderNavDisplayBtnClickHandler: {type: Function, default: () => {}},
})/*** 实现导航栏响应式* @type {null}*/
// logo 元素宽
let logoEleWidth = null
// 导航栏选项元素宽
let navItemsEleWidth = null
onMounted(() => {// 获取 logo 元素宽logoEleWidth = document.querySelector('.tail-top-nav .tail-top-nav-logo')?.clientWidth// 获取导航栏选项元素宽navItemsEleWidth = document.querySelector('.tail-top-nav .tail-top-nav-items')?.clientWidth
})
// 用于控制导航栏选项是否显示
const navItemsIsShow = ref(true)
// 顶部导航栏元素引用
const topNavRef = ref(null)
// 监听顶部导航栏元素内容和边框尺寸的变化
useResizeObserver(topNavRef, (entries) => {const entry = entries[0]// 获取顶部导航栏元素宽const {width} = entry.contentRect// 当顶部导航栏元素的宽度小于 logo + 导航栏选项元素宽度之和时,导航栏选项隐藏,否则导航栏选项显示if (width <= logoEleWidth + navItemsEleWidth) navItemsIsShow.value = falseelse navItemsIsShow.value = true
})
</script><template><!-- 小尾巴顶部导航组件 --><div class="tail-top-nav" ref="topNavRef"><!-- 小尾巴顶部导航组件 logo --><div class="tail-top-nav-logo"><slot name="topNavLogo"></slot></div><!-- 小尾巴顶部导航组件导航选项 --><divv-if="navItemsIsShow"class="tail-top-nav-items"><slot name="topNavItems"></slot></div><!-- 小尾巴侧边导航栏展示按钮 --><divv-elseclass="tail-top-nav-slider-nav-display-btn"@click="sliderNavDisplayBtnClickHandler"><slot name="sliderNavDisplayBtn"></slot></div></div>
</template><style scoped lang="scss">
/** 小尾巴顶部导航组件*/
.tail-top-nav {box-sizing: border-box;width: 100%;padding: 0.5rem 1rem;background-color: var(--tail-top-nav-bgc);display: flex;justify-content: space-between;align-items: center;/** 小尾巴顶部导航组件 logo*/.tail-top-nav-logo {}/** 小尾巴顶部导航组件导航选项*/.tail-top-nav-items {display: flex;justify-content: end;align-items: center;}/** 小尾巴侧边导航栏展示按钮*/.tail-top-nav-slider-nav-display-btn {height: 100%;padding: 0.5rem;cursor: pointer;transition: all 0.5s;display: flex;justify-content: center;align-items: center;color: var(--tail-top-nav-font-color);&:hover {transform: scale(1.15);}}
}
</style>

组件使用说明

props 组件属性

组件属性组件属性说明组件属性值类型组件属性默认值
sliderNavDisplayBtnClickHandler小尾巴侧边导航栏组件展示按钮点击事件处理器函数,侧边导航栏组件显示按钮在顶部导航栏导航项收缩后才会显示,与侧边导航栏组件 https://www.yuque.com/u27599042/coding_star/vory2h7cv59sho1c 配合实现响应式Function() => {}

slot 插槽

插槽名称插槽说明
topNavLogo小尾巴顶部导航组件 logo,该插槽用户放置导航栏左部的 Logo
sliderNavDisplayBtn小尾巴侧边导航栏展示按钮,该插槽用于放置侧边导航栏展示按钮

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F103C8T6第一天:认识STM32 标准库与HAL库 GPIO口 推挽输出与开漏输出

1. 课程概述&#xff08;297.1&#xff09; 课程要求&#xff1a;C语言熟练&#xff0c;提前学完 C51 2. 开发软件Keil5的安装&#xff08;298.2&#xff09; 开发环境的安装 编程语言&#xff1a;C语言需要安装的软件有两个&#xff1a;Keil5 和 STM32CubeMX Keil5 的安装…

读书笔记:彼得·德鲁克《认识管理》第3章 西尔斯公司

一、章节内容概述 与其他美国大型企业相比&#xff0c;西尔斯公司的成就更加令人瞩目、更加长盛不衰。然而&#xff0c;当没有任何邮购经验的芝加哥服装商人罗森沃尔德 1895年进行收购时&#xff0c;该公司已濒临破产。罗森沃尔德深入思考了公司的 业务&#xff0c;并询问下列…

android display 杂谈(三)WMS

用来记录学习wms&#xff0c;后续会一点一点更新。。。。。。 代码&#xff1a;android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中&#xff0c;调用run方法。 private void run() { // Initialize native services.初始化服务&#xff0c;加载andro…

[SSD综述 1.4] SSD固态硬盘的架构和功能导论

依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< ​ 前言 机械硬盘的存储系统由于内部结构, 其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,…

【持续更新】Mybatis常用代码汇总

目录 通用 #{} 和 ${} 返回类型 查询 sql处理 in数组处理 if语句 choose when association 一对一关联查询 日期格式 通用 #{} 和 ${} 在MyBatis 的xml映射配置文件中&#xff0c;动态传参有#{}和${}两种方式 1&#xff09;#{}&#xff1a;动态解析 -> 预编译…

什么是缓冲区溢出?

缓冲区溢出 1. 什么是缓冲区溢出2. 缓冲区溢出攻击的类型3. 攻击者如何利用缓冲区溢出4. 如何防止缓冲区溢出攻击 1. 什么是缓冲区溢出 &#xff08;1&#xff09;缓冲区 缓冲区是一块连续的计算机内存区域&#xff0c;用于在将数据从一个位置移到另一位置时临时存储数据。这…

【Spring Security】Spring Security 前后端分离认证

我们初步引入了Spring Security&#xff0c;并使用其默认生效的HTTP基本认证来保护URL资源&#xff0c;本章我们使用表单认证来保护URL资源。 前后端分离模式 表单登录配置模块提供了successHandler&#xff08;&#xff09;和failureHandler&#xff08;&#xff09;两个方法…

2023-2024 中国科学引文数据库来源期刊列表(CSCD)

文章目录 CSCD来源期刊遴选报告2023-2024 中国科学引文数据库来源期刊列表&#xff08;CSCD&#xff09; CSCD来源期刊遴选报告 2023-2024 中国科学引文数据库来源期刊列表&#xff08;CSCD&#xff09;

数据结构与算法(Java版) | 排序算法的介绍与分类

各位朋友&#xff0c;现在我们即将要进入数据结构与算法&#xff08;Java版&#xff09;这一系列教程中的排序算法这一章节内容的学习中了&#xff0c;所以还请大家系好安全带&#xff0c;跟随我准备出发吧&#xff01; 相信诸位应该都知道排序算法有很多种吧&#xff01;就算没…

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备?

电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备? 这里以win10系统为例进行说明: 如下图所示,打开右下角的“网络和Internet设置”, 如下图所示,点击进入“更改适配器选项”, 如下图所示…

Leetcode—110.平衡二叉树【简单】

2023每日刷题&#xff08;十九&#xff09; Leetcode—110.平衡二叉树 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int preFunc(struct TreeNode* root) {if(root…

leetcode-887-鸡蛋掉落(包含最大值最小化,最小值最大化的二分优化+滚动数组的原理)

这里写目录标题 题意解题KNN复杂度DP解法思想&#xff08;超时&#xff09;上述方法的优化 &#xff08;最大值最小化二分优化&#xff09;完整代码 逆向思维的DP&#xff08;ksqrt(n)复杂度&#xff09;代码空间优化&#xff08;滚动数组&#xff09;代码 题意 链接&#xff…

R语言中的函数27:polynom::polynomial(), deriv(),integral(),solve()多式处理函数

文章目录 介绍polynomial()用法参数实例多项式的加减乘除等运算实例 deriv()和integral()用法参数实例solve()参数实例 介绍 R语言中的polynom包可以实现对多项式的操作&#xff0c;例如&#xff1a;加、减、乘、除、微分、积分。使用的时候先用polynomial()函数定义一个多项式…

[100天算法】-根据字符出现频率排序(day 57)

题目描述 给定一个字符串&#xff0c;请将字符串里的字符按照出现的频率降序排列。示例 1:输入: "tree"输出: "eert"解释: e出现两次&#xff0c;r和t都只出现一次。 因此e必须出现在r和t之前。此外&#xff0c;"eetr"也是一个有效的答案。 示例…

【Redis】分布式锁

分布式锁 分布式锁是一种在分布式系统中实现同步机制的技术。它允许多个进程或节点在访问共享资源时进行同步&#xff0c;以确保它们按照预期的顺序执行。 这篇文章使用Redis来分布式锁&#xff0c;通俗的来说&#xff0c;分布式锁本质上要实现的目标就是在Redis里面占一个 “…

axios的使用与封装详细教程

目录 一、axios使用方式二、axios在main.js配置 一、axios使用方式 在 Spring Boot Vue 的项目中使用 Axios&#xff0c;你需要在 Vue 项目中安装 Axios 库&#xff0c;因为 Axios 是一个前端 JavaScript 库&#xff0c;用于发送 HTTP 请求和处理响应数据&#xff0c;而与 Sp…

全球首例无液氦脑磁图辅助下的胶质瘤切除手术顺利完成

近日&#xff0c;在国家重点研发计划“新型无液氦脑磁图系统研发”项目支持下&#xff0c;首都医科大学附属北京天坛医院季楠教授团队完成全球首例无液氦脑磁图运动功能区定位辅助下的胶质瘤切除手术。 手术对一例肿瘤累及运动功能区的年轻女性在术前分别利用无液氦脑磁图仪和功…

14 _ 排序优化:如何实现一个通用的、高性能的排序函数?

几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实现的吗?底层都利用了哪种排…

如何在苹果Mac系统设置中查看Wi-Fi密码?

在 Mac 上查找保存的 Wi-Fi 密码的最简单方法之一是从系统设置内的高级 Wi-Fi 首选项页面。您可以通过下面的方式访问此页面来查找您保存的 Wi-Fi 密码。 1.在 Mac 上&#xff0c;选取「苹果菜单」选择「系统设置」。 2.从侧边栏中选择「Wi-Fi」&#xff0c;单击「高级」。 3.…

【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成

文章目录 一、监控有哪些指标二、prometheus、grafana架构Prometheus 组件Grafana 组件架构优点 三、安装prometheus和node-exporter1. docker pull镜像2. 启动node-exporter3. 启动prometheus 四、promql基本语法五、grafana的安装和使用1. 新建空文件夹grafana-storage&#…