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

news/2024/7/7 22:23:21

文章归档: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 = false
  else navItemsIsShow.value = true
})
</script>

<template>
  <!-- 小尾巴顶部导航组件 -->
  <div class="tail-top-nav" ref="topNavRef">
    <!-- 小尾巴顶部导航组件 logo -->
    <div class="tail-top-nav-logo">
      <slot name="topNavLogo"></slot>
    </div>
    <!-- 小尾巴顶部导航组件导航选项 -->
    <div
        v-if="navItemsIsShow"
        class="tail-top-nav-items"
    >
      <slot name="topNavItems"></slot>
    </div>
    <!-- 小尾巴侧边导航栏展示按钮 -->
    <div
        v-else
        class="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://lihuaxi.xjx100.cn/news/1752998.html

相关文章

降级python

起因&#xff1a; python版本过高不能下载一个包&#xff0c;需要降级 首先使用 python --version 查看python版本 然后conda install python3.10 python3.10会下载到这个目录下&#xff08;这个千万别找错&#xff09; 然后更换路径 alias python/home/zky/.conda/envs/c…

01 向量基本概念

向量基本概念 向量是什么物理专业学生视角计算机专业学生视角数学家视角 不同视角之间的关系 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 向量是什么 物理专业学生视角 向量是空间中的箭头。向量的长度和方向确定一个向量。只要长度和方向相同&#xff0c…

社群团购,1个人1个月如何卖掉1家实体店1年的销量?

社群团购&#xff0c;1个人1个月如何卖掉1家实体店1年的销量&#xff1f; 有一些老板问我他的产品是否适合做社群团购。 我看了下他的朋友圈&#xff0c;问了产品价格后说&#xff1a;应该还不错&#xff0c;但要做2件事&#xff0c;1个是在百度做下铺垫&#xff0c;1个是把笔…

asp.net docker-compose添加volume配置

打开docker-compose.override.yml下面添加 volumes:killsb-one-sqldata:external: false 服务下面添加volume配置 volumes:- "./dapr/config/social-client.json:/app/OidcSettings.json" 添加volume配置成功

【马蹄集】—— 百度之星 2023

百度之星 2023 目录 BD202301 公园⭐BD202302 蛋糕划分⭐⭐⭐BD202303 第五维度⭐⭐ BD202301 公园⭐ 难度&#xff1a;钻石    时间限制&#xff1a;1秒    占用内存&#xff1a;64M 题目描述 今天是六一节&#xff0c;小度去公园玩&#xff0c;公园一共 N N N 个景点&am…

怎么测量直线模组的精度?

直线模组是一款比较多变的一种产品&#xff0c;适合多种行业&#xff0c;同时它也适合比较多的环境&#xff0c;是一种比较全面的直线运动的装置。直线模组是非常精密的自动化机械设备&#xff0c;在实践中&#xff0c;应该要严格把握具体精度&#xff0c;并且在必要的时候&…

07.Diffusion Model概述

文章目录 Diffusion Model原理Reverse ProcessDenoise模块Forward Process(Diffusion Process) 文字生成图片by Diffusion Model文字生成图像的常见套路Text EncoderFrchet Inception DistanceContrastive Language-Image Pre-Training(CLIP) DecoderGeneration Model 部分截图…

原地封神!一个只用套模板即可制作电子相册的网站

对于忙碌的年轻人来说&#xff0c;一键操作的模板意味着无需复杂的操作步骤&#xff0c;就能轻松制作出精美的电子相册。 但是一个好的工具也是事关重要&#xff0c;最近发现了一款非常适合年轻人的模板---FLBOOK在线制作电子杂志平台&#xff0c;只需要找到合适的模板即可制作…