uniapp和vue3+ts实现自定义头部导航栏左侧胶囊内容

由于某些原因,可能需要我们自己定义头部导航栏的内容,实现各种设计师画的设计稿,所以就需要这个自定义的组件,实现的内容:自定义标题和左侧胶囊图标内容,也可以自定义搜索内容到里面,实现的效果图:

实现步骤

1.先在pages中将这个页面的导航设置为自定义

 "navigationStyle": "custom"

2.在app.vue中获取头部高度

源代码:

<script setup lang="ts">
import { onLaunch, onShow, onHide } from "@dcloudio/uni-app";
onLaunch(() => {
  console.log("App Launch");
  uni.hideTabBar()
});
onShow(() => {
  console.log("App Show");
  // 隐藏默认导航栏
  uni.hideTabBar()
  // 获取顶部状态栏高度
  uni.getSystemInfo({
    success: (result) => {
      // 获取手机系统的状态栏高度(不同手机的状态栏高度不同)  ( 不要使用uni-app官方文档的var(--status-bar-height) 官方这个是固定的20px  不对的 )
      console.log('当前手机的状态栏高度',result.statusBarHeight)
      let statusBarHeight = result.statusBarHeight + 'px'

      // 获取右侧胶囊的信息 单位px
      const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
      //bottom: 胶囊底部距离屏幕顶部的距离
      //height: 胶囊高度
      //left:   胶囊左侧距离屏幕左侧的距离
      //right:  胶囊右侧距离屏幕左侧的距离
      //top:    胶囊顶部距离屏幕顶部的距离
      //width:  胶囊宽度
      // console.log(menuButtonInfo.width, menuButtonInfo.height, menuButtonInfo.top)
      // console.log('计算胶囊右侧距离屏幕右边距离', result.screenWidth - menuButtonInfo.right)
      let menuWidth = menuButtonInfo.width + 'px'
      let menuHeight = menuButtonInfo.height + 'px'
      let menuBorderRadius = menuButtonInfo.height / 2 + 'px'
      let menuRight = result.screenWidth - menuButtonInfo.right + 'px'
      let menuTop = menuButtonInfo.top + 'px'
      let contentTop = result.statusBarHeight + 44 + 'px'

      let menuInfo = {
        statusBarHeight: statusBarHeight,//状态栏高度----用来给自定义导航条页面的顶部导航条设计padding-top使用:目的留出系统的状态栏区域
        menuWidth: menuWidth,//右侧的胶囊宽度--用来给自定义导航条页面的左侧胶囊设置使用
        menuHeight: menuHeight,//右侧的胶囊高度--用来给自定义导航条页面的左侧胶囊设置使用
        menuBorderRadius: menuBorderRadius,//一半的圆角--用来给自定义导航条页面的左侧胶囊设置使用
        menuRight: menuRight,//右侧的胶囊距离右侧屏幕距离--用来给自定义导航条页面的左侧胶囊设置使用
        menuTop: menuTop,//右侧的胶囊顶部距离屏幕顶部的距离--用来给自定义导航条页面的左侧胶囊设置使用
        contentTop: contentTop,//内容区距离页面最上方的高度--用来给自定义导航条页面的内容区定位距离使用
      }
      uni.setStorageSync('menuInfo', menuInfo)
    },
    fail: (error) => {
      console.log(error)
    }
  })
});
onHide(() => {
  console.log("App Hide");
});
</script>
<style lang="scss">
@import "uview-plus/index.scss";
@import "./uni.scss";
</style>

3.实现自定义头部组件

源代码: 

<template>
  <view class="page_box">
    <!-- 行内式直接变量小程序不支持,故需要写成动态的变量 -->
    <view class="my_tab_title" :style="{ paddingTop: statusBarHeight }">
      <!-- 左侧自定义胶囊 -->
      <view class="menu_btn"
        :style="{ position: 'fixed', top: menuTop, left: menuRight, width: menuWidth, height: menuHeight, border: '1rpx solid #ddd', borderRadius: menuBorderRadius, }">
        <u-icon @click="goToBack" class="arrowleft" name="arrow-left" color='#fff' size="20"></u-icon>
        <text class="text_box"></text>
        <u-icon @click="goToHome" class="home" name="home" color='#fff' size="20"></u-icon>
      </view>
      <!-- 自定义标题 -->
      <text class="title">今日战绩</text>
    </view>
  </view>
</template>


<script setup lang="ts">

const statusBarHeight = uni.getStorageSync('menuInfo').statusBarHeight
//状态栏的高度(可以设置为顶部导航条的padding-top)
const menuWidth = uni.getStorageSync('menuInfo').menuWidth
const menuHeight = uni.getStorageSync('menuInfo').menuHeight
const menuBorderRadius = uni.getStorageSync('menuInfo').menuBorderRadius
const menuRight = uni.getStorageSync('menuInfo').menuRight
const menuTop = uni.getStorageSync('menuInfo').menuTop
// 距离顶部的距离,可以设置为内容区域的顶部外边距
const contentTop = uni.getStorageSync('menuInfo').contentTop

const goToBack = () => {
  console.log("返回按钮");
  uni.navigateBack({
    delta: 1
  })
}

const goToHome = () => {
  console.log("返回主页");
  uni.switchTab({
    url: '/pages/home/index'
  })
}

</script>

<style lang="scss" scope>
.page_box {
  .my_tab_title {
    width: 100%;
    height: 44px; //这个是固定的44px(所有小程序顶部高度都是 = 44px + 手机系统状态栏高度)
    line-height: 44px;
    text-align: center;
    position: fixed;
    top: 0;
    z-index: inherit;
    font-family: Monospaced Number, Chinese Quote, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, PingFang SC, Hiragino Sans GB, Microsoft YaHei,
      Helvetica Neue, Helvetica, Arial, sans-serif !important;
    font-size: 32rpx;
    color: #000;
    font-weight: 500;

    .menu_btn {
      // background-color: #ffffff; //这个是小程序默认的标题栏背景色
      overflow: hidden;
      background: rgba(158, 151, 164, 0.5);


      // position: fixed;//行内式写了固定定位--目的是去掉下划页面一起滚动问题
      .arrowleft {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-160%, -50%) !important;
        -webkit-transform: translate(-160%, -50%) !important;
      }

      .text_box {
        width: 1rpx;
        height: 20px;
        background-color: #fff;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%) !important;
        -webkit-transform: translate(-50%, -50%) !important;
      }

      .home {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(60%, -50%) !important;
        -webkit-transform: translate(60%, -50%) !important;
      }
    }

    .title {
      color: white;
      font-weight: 700;
    }
  }
}
</style>

4.在组件中使用

最终的效果: 

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

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

相关文章

软件测试jmeter基本使用

1安装与配置 1.jdk下载 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#jdk18-windows&#xff08;压缩包中会给&#xff09; 2.jmeter下载 Apache JMeter - Download Apache JMeter&#xff08;压缩包中有&#xff09; 3.操作教学 打开软件后新…

学生用台灯哪个品牌比较好?2023考研护眼台灯推荐

随着科技时代的到来&#xff0c;人们的生活水平不断提高&#xff0c;也面临着许多问题&#xff0c;近期随着央视报道的全国中小学学生的近视率&#xff0c;护眼台灯再次被众人推上热潮&#xff0c;护眼台灯能够提供柔和自然的光感非常舒适&#xff0c;而且使用起来非常便捷。不…

JavaScript值和引用

前端面试大全JavaScript值和引用 &#x1f31f;经典真题 &#x1f31f;值和引用相关内容 1. 简单值&#xff08;原始值&#xff09; 2. 复杂值&#xff08;引用值&#xff09; 3. 访问方式 4. 比较方式 5. 动态属性 6. 变量赋值 &#x1f31f;真题解答 &#x1f31f;…

v-for和v-if同时使用时的问题:

当在同一个标签上同时使用 v-for 和 v-if 时&#xff0c;可能会导致意外的结果或错误。这是因为Vue的编译规则中&#xff0c;v-for 比 v-if 优先级更高&#xff0c;意味着 v-for 会先执行&#xff0c;然后 v-if 根据条件进行渲染或移除子元素。 在某些情况下&#xff0c;使用 …

ardupilot开发 --- 机载计算机 篇

0. 前言 关于机载计算机&#xff1b; 1. APSync 说到机载计算机Companion computer就不得不提另一个关键词APSync&#xff1b;APSync简化了机载计算机的设置&#xff0c;以便它可以为ArduPilot提供额外的功能&#xff0c;并简化与互联网服务的集成&#xff1b;提供日志下载和…

Linux:docker镜像的创建(5)

1.基于已有镜像创建 步骤&#xff1a; 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置&#xff0c;我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…

基于matlab的图像去噪算法设计与实现

摘 要 随着我们生活水平的提高&#xff0c;科技产品飞速更新换代&#xff0c;在信息传输中&#xff0c;图像传输所占的比重越来越大。但自然噪声会在图像传输时干扰其传输过程&#xff0c;甚至会使图片不能表达其原来的意义。去噪处理就是为了去除图像中的噪声&#xff0c;从而…

[英语学习][4][Word Power Made Easy]的精读与翻译优化

[序言] 今日继续阅读两段原版翻译, 有一点点生硬, 还是耐不住寂寞, 去优化了. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨论与交流英语相关的内容. [原著英文与翻译版对照][第18页] "And suerl…

【端到端可微1】端到端的训练,使用反向传播,要求过程可微分

文章目录 背景想法&#xff1a; Weighted least-squares fitting方法&#xff1a; Backpropagating through the fitting procedure.温习之前的基础前向传播反向传播 总结 背景 想做一个端到端训练的模型&#xff0c;将最小二乘嵌入其中。因此有了这系列文章。 想法&#xff…

fiddler抓包安卓

一、打断点 1、安卓手机和电脑在同一局域网下&#xff0c;手机连接的网络开启手动代理&#xff0c;ip填写电脑ip&#xff0c;端口填写fiddler中配置的端口。 ip查看&#xff1a; 端口配置&#xff1a;tools-options-connections 2、安装证书&#xff0c;手机浏览器输入电脑ip…

Java-MyBatis

1.基础 1.1 pom <dependencies><!--MyBatis核心--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!--MySql驱动--><dependency&…

11.29 C++ 作业

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <io…

linux拨号服务器如何创建爬虫ip池

作为一个爬虫技术员&#xff0c;除了要熟练掌握至少一种编程语言外&#xff0c;还应该创建属于自己的爬虫ip池。我们都知道&#xff0c;在进行爬虫采集时&#xff0c;经常会遇到网站各种发爬机制&#xff0c;如果有自己的ip池&#xff0c;将会让爬虫这项枯燥无味的工作变得非常…

从物理机到K8S:应用系统部署方式的演进及其影响

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 概述 随着科技的进步&#xff0c;软件系统的部署架构也在不断演进&#xff0c;从以前传统的物理机到虚拟机、Docker和Kubernetes&#xff0c;我们经历了一系列变化。 这些技术的引入…

手机笔记工具怎么加密?

选择用手机笔记工具记事&#xff0c;大家可以记录很多学习笔记、读书笔记、私密日记等&#xff0c;手机作为随身携带的设备&#xff0c;记录相关的笔记比较快捷且方便&#xff0c;当手机笔记中记录的内容比较私密时&#xff0c;大家担心手机笔记会被别人误看&#xff0c;这时候…

对话特斯拉北美车主:FSD什么水平?深度用户解密V11

作者 |Amy 编辑 |德新 近期中国四部委联合印发通知&#xff0c;部署开展智能网联汽车准入和上路通行试点工作&#xff0c;要求具备量产条件L3、L4 级别智能网联车在限定区域内开展上路试点&#xff0c;并且首次明确事故责任判定。 通知下发后&#xff0c;市场传闻&#xff1a…

Nginx反向代理和负载均衡详细教程

1、Nginx反向代理概述 关于正向代理和反向代理&#xff0c;我们在前面的章节已经通过一张图给大家详细的介绍过了&#xff0c;简而言之就是正向代理代理的对象是客户端&#xff0c;反向代理代理的是服务端&#xff0c;这是两者之间最大的区别。 Nginx即可以实现正向代理&#x…

用纯 CSS 实现网格背景

是不是在日常开发中经常遇到实现网格的需求&#xff0c;网格通常对网页中展示的元素能起到很好的定位和对齐作用。 这里介绍如何只通过 CSS 来实现这个需求&#xff1f; 使用背景图 这里我们的背景图使用 SVG 来创建&#xff0c;首先&#xff0c;创建绘出一个正方形&#xff0c…

Talk | UCSB博士生许闻达:细粒度可解释评估初探

本期为TechBeat人工智能社区第551期线上Talk。 北京时间11月29日(周三)20:00&#xff0c;UC Santa Barbara博士生—许闻达的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “细粒度可解释评估初探”&#xff0c;分享了他们团队在具备解释性的细粒度…

Synchronized底层机制:偏向锁、轻量级锁与重量级锁及其锁升级过程

前言&#xff1a; 在Java并发编程中&#xff0c;synchronized关键字是用于实现线程同步的重要工具。在JVM中&#xff0c;synchronized的底层实现涉及到了偏向锁、轻量级锁和重量级锁这三种锁状态&#xff0c;以及锁升级过程。在之前的文章中介绍到过&#xff0c;这篇文章详细对…