uniapp实现中间平滑凸起tabbar

news2024/11/26 16:55:38

uniapp实现中间平滑凸起tabbar

  • 背景
  • 实现思路
  • 代码实现
  • 尾巴

背景

在移动端开发中,tabar是一个使用频率很高的组件,几乎是每个APP都会用到。今天给大家分享一个中间平滑凸起的tabbar组件,有需要的可以做下参考。先上图镇楼:
在这里插入图片描述

实现思路

看上面图片就知道这个难点只有一个,就是中间那个平滑的凸起tab怎么来实现。好了,我也不卖关子了,直接说下实现的思路:
1、先布局一个普通的tabbar
2、再利用clip-path来裁剪出一个平滑凸起的圆弧,通过设置position来盖在步骤1的普通tabbar上面。

代码实现

我们先布局出一个普通的tabbar并放置在屏幕底部。

/*省略部分代码*/
<view class="tabbar">
			<block v-for="(item, index) in tabbarList" :key="index">
				<view class="tabbar-item" @click="toIndex(index)">
					<image :src="current == index ? item.activeIcon : item.inactiveIcon"></image>
					<text :class="'font-title' + (current == index ? '-active' : '')">{{item.title}}</text>
				</view>
			</block>
		</view>
/*省略部分代码*/

tabbarList就是你存放的tabbar配置项为奇数个,格式如下:

/*省略部分代码*/
tabbarList: [{
					inactiveIcon: '../../static/tabbar/main_tab_home_normal.png',
					activeIcon: '../../static/tabbar/main_tab_home_select.png',
					title: '首页'
			}]
/*省略部分代码*/

这是效果如下:
在这里插入图片描述
接下来我们利用clip-path来裁剪出一个弧形的path,然后在tabbar中间盖一个你需要的图片,我这里是加号图。为了看的更直观,我将这个裁剪的弧形先不盖在tabbar上面,先偏移底部较大一段距离,看效果:
在这里插入图片描述
然后调整下偏移量到一个合适位置,就看到了文章中开始那个效果了。这个path的裁剪形状你可以直接参考我的。

/*省略部分代码*/
.mid-btn-arc {
        position: fixed;
        bottom: 250rpx;
        left: calc(50% - 100rpx);
        background-color: #fff;
        z-index: 98;
        height: 100rpx;
        width: 200rpx;
        clip-path: path('M 50,0 Q 35,0 25,7.5 Q 20.5, 11.5 0, 15 V 50 H 100 V15 Q 79.5,11.5 75,7.5 Q 65,0 50,0 z');
    }
/*省略部分代码*/

到这里基本就完工了。接下来贴出来全部的代码:

<template>
	<view>
		<view>{{content}}</view>
		<view class="tabbar">
			<block v-for="(item, index) in tabbarList" :key="index">
				<view class="tabbar-item" @click="toIndex(index)">
					<image :src="current == index ? item.activeIcon : item.inactiveIcon"></image>
					<text :class="'font-title' + (current == index ? '-active' : '')">{{item.title}}</text>
				</view>
			</block>
			<view class="mid-btn-arc"></view>
			<view class="mid-btn" @click="toIndex(tabbarList.length % 2)">
				<image class="mid-img" src="../../static/tabbar/add.png"></image>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				current: 0,
				content: '首页',
				tabbarList: [{
					inactiveIcon: '../../static/tabbar/main_tab_home_normal.png',
					activeIcon: '../../static/tabbar/main_tab_home_select.png',
					title: '首页'
				},
				{
					inactiveIcon: '../../static/tabbar/main_tab_home_normal.png',
					activeIcon: '../../static/tabbar/main_tab_home_select.png',
					title: '首页1'
				},
				{
					inactiveIcon: '../../static/tabbar/main_tab_home_normal.png',
					activeIcon: '../../static/tabbar/main_tab_home_select.png',
					title: '首页2'
				},
				{
					inactiveIcon: '../../static/tabbar/main_tab_home_normal.png',
					activeIcon: '../../static/tabbar/main_tab_home_select.png',
					title: '首页3'
				},
				{
					inactiveIcon: '../../static/tabbar/main_tab_home_normal.png',
					activeIcon: '../../static/tabbar/main_tab_home_select.png',
					title: '首页4'
				}]
			}
		},
		methods: {
			toIndex(index){
				this.current = index
				this.content = this.tabbarList[index].title
			}
		}
	}
</script>

<style lang="scss">
	page {
		background-color: #dfdfdf;
	}
    .tabbar {
        position: fixed;
        left: 0;
        bottom: 0;
        height: 120rpx;
        width: 100vw;
        background-color: #f9f9f9;
        z-index: 99;
        display: flex;
        justify-content: space-between;
        align-items: center;
    }
 
    .tabbar-item {
        flex: 1;
        height: 120rpx;
        background-color: #fff;
        z-index: 100;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        transition: transform 0.3s;
    }
 
    .font-title {
        font-size: 22rpx;
        margin: 5rpx 0;
        color: #dfdfdf;
        z-index: 100;
    }
 
    .font-title-active {
        font-size: 22rpx;
        margin: 5rpx 0;
        color: #000000;
        z-index: 100;
    }
 
    .mid-btn-arc {
        position: fixed;
        bottom: 50rpx;
        left: calc(50% - 100rpx);
        background-color: #fff;
        z-index: 98;
        height: 100rpx;
        width: 200rpx;
        clip-path: path('M 50,0 Q 35,0 25,7.5 Q 20.5, 11.5 0, 15 V 50 H 100 V15 Q 79.5,11.5 75,7.5 Q 65,0 50,0 z');
    }
 
    .mid-btn {
        position: fixed;
        height: 100rpx;
        width: 100rpx;
        left: 50%;
        bottom: 45rpx;
        transform: translateX(-50rpx);
        background-color: #fff;
        border-radius: 50rpx;
        display: flex;
        justify-content: center;
        align-items: center;
        z-index: 100;
 
        .mid-img {
            width: 80rpx;
            height: 80rpx;
        }
    }
 
    image {
        width: 50rpx;
        height: 50rpx;
        transition: transform 0.3s, width 0.3s, height 0.3s;
    }
</style>

我知道你只想直接ctrl+c在这里插入图片描述

啊什么,你还想要图片?给你,通通给你:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

尾巴

毫无保留啥都给你们了,有啥问题可以给我留言,如果喜欢我的文章,欢迎给我点赞,评论,关注,谢谢大家!

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

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

相关文章

java版询价采购系统 招投标询价竞标投标系统 招投标公告系统源码

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

YOLOV8目标检测C++推理问题总结

背景 数据集有限&#xff0c;使用paddleOCR直接识别准确率无法达到99%&#xff0c;这里尝试用目标检测对识别得分比较低的图片进行二次处理&#xff1b; 类别数目&#xff1a;数字&#xff08;10&#xff09;字母&#xff08;26&#xff09;字符&#xff08;2&#xff09; 38 …

Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 房屋信息详情 个人中心 管理员登录界面 管理员功能界面 用户管理界面 房屋信…

CSRF与SSRF

csrf(跨站请求伪造)的原理: csrf全称是跨站请求伪造(cross-site request forgery)&#xff0c;也被称为one-click attack 或者 session riding scrf攻击利用网站对于用户网页浏览器的信任&#xff0c;劫持用户当前已登录的web应用程序&#xff0c;去执行分用户本意的操作。 利…

Rust 力扣 - 1984. 学生分数的最小差值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 原数组 nums 排序&#xff0c;遍历nums中下标为[0, nums.len() - k]的学生分数 假设当前遍历的下标为i则&#xff0c;以 i 下标为最小值的学生分数的最小差值为nums[i k - 1] - nums[i] 取最小差值的最小值即…

前端笔试新问题总结

记录总结下最近遇到的前端笔试新问题 目录 一、操作数组方法 1.Array.isArray(arr) 2.Object.prototype.toString.call(arr) "[object Array]" 3.arr instanceof Array 1&#xff09;跨帧问题 2&#xff09;修改Array.prototype 3&#xff09;模拟数组的对象…

HTML 基础标签——结构化标签<html>、<head>、<body>

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

跳表原理笔记

课程地址 跳表是一种基于随机化的有序数据结构&#xff0c;它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点&#xff0c;然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中&#xff0c;L…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

3674矢量网络分析仪-003噪声系数测量选件

3674X-003 噪声系数测量选件 3674系列矢量网络分析仪 综述 3674X-003噪声系数测量一次连接&#xff0c;可同时测试S参数、噪声系数、噪声参数、增益压缩和变频增益等多种参数。基于冷源噪声系数测试方法&#xff0c;可进行精确的噪声系数和噪声参数测试。 •特点 • 3674X…

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程&#xff0c;包括设计环境的建立&#xff0c;布图规划包括模块尺寸的确定&#xff0c;IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要&#xff0c; 影响芯片的布线资…

如何将MySQL彻底卸载干净

目录 背景&#xff1a; MySQL的卸载 步骤1&#xff1a;停止MySQL服务 步骤2&#xff1a;软件的卸载 步骤3&#xff1a;残余文件的清理 步骤4&#xff1a;清理注册表 步骤五:删除环境变量配置 总结&#xff1a; 背景&#xff1a; MySQL卸载不彻底往往会导致重新安装失败…

Vue生成名片二维码带logo并支持下载

一、需求 生成一张名片&#xff0c;名片上有用户信息以及二维码&#xff0c;名片支持下载功能&#xff08;背景样式可更换&#xff0c;忽略本文章样图样式&#xff09;。 二、参考文章 这不是我自己找官网自己摸索出来的&#xff0c;是借鉴各位前辈的&#xff0c;学以致用&am…

【AIGC】深入探索『后退一步』提示技巧:激发ChatGPT的智慧潜力

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;“后退一步”技巧介绍技巧目的 &#x1f4af;“后退一步”原理“后退一步”提示技巧与COT和TOT的对比实验验证 &#x1f4af;如何应用“后退一步”策略强调抽象思考引导提…

Python | Leetcode Python题解之第520题检测大写字母

题目&#xff1a; 题解&#xff1a; class Solution:def detectCapitalUse(self, word: str) -> bool:# 若第 1 个字母为小写&#xff0c;则需额外判断第 2 个字母是否为小写if len(word) > 2 and word[0].islower() and word[1].isupper():return False# 无论第 1 个字…

【python ASR】win11-从0到1使用funasr实现本地离线音频转文本

文章目录 前言一、前提条件安装环境Python 安装安装依赖,使用工业预训练模型最后安装 - torch1. 安装前查看显卡支持的最高CUDA的版本&#xff0c;以便下载torch 对应的版本的安装包。torch 中的CUDA版本要低于显卡最高的CUDA版本。2. 前往网站下载[Pytorch](https://pytorch.o…

Java日志脱敏——基于logback MessageConverter实现

背景简介 日志脱敏 是常见的安全需求&#xff0c;最近公司也需要将这一块内容进行推进。看了一圈网上的案例&#xff0c;很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的&#xff0c;而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

Java面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

Prometheus套装部署到K8S+Dashboard部署详解

1、添加helm源并更新 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update2、创建namespace kubectl create namespace monitoring 3、安装Prometheus监控套装 helm install prometheus prometheus-community/prome…

如何选择到印尼的海运代理

如何选择到印尼的海运代理 选择合适的海运代理的重要性 海运代理负责安排货物从发货地到目的地的整个运输过程&#xff0c;包括装运、清关、仓储等服务。一个可靠的海运代理能确保货物安全准时到达&#xff0c;并帮助企业节省时间和成本。 选择海运代理需考虑的主要因素 公司…