uniapp封装文字提示气泡框toolTip组件

uniapp封装文字提示气泡框toolTip组件

文字提示气泡框:toolTip
因为uniapp 中小程序中没有window对象,需手动调用 关闭
第一种办法关闭:this.$refs.tooltip.close()
第二种办法关闭:visible.sync = false

移动端没有现成的toolTip组件,所以封装了

效果:

在这里插入图片描述
在这里插入图片描述

<!-- 文字提示气泡框:toolTip -->
<!-- 因为uniapp 中小程序中没有window对象,需手动调用 关闭
 第一种办法关闭:this.$refs.tooltip.close()
 第二种办法关闭:visible.sync = false -->
<template>
	<view class="zb-tooltip" :style="{
		'--theme-bg-color':color
	}">
		<view class="zb_tooltip_content" @click.stop="handleClick">
			<slot></slot>
			<view class="zb_tooltip__popper" @click.stop="()=>{}" :style="[style,{
				visibility:isShow?'visible':'hidden',
				color:color==='white'?'':'#fff',
				boxShadow: color==='white'?'0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d':''
			}]">
				<slot name="content">{{content}}</slot>
				<view class="zb_popper__icon" :style="[arrowStyle]" :class="[{
					'zb_popper__up':placement.indexOf('bottom')===0,
					'zb_popper__arrow':placement.indexOf('top')===0,
					'zb_popper__right':placement.indexOf('right')===0,
					'zb_popper__left':placement.indexOf('left')===0,
				}]">
				</view>
			</view>
		</view>

	</view>
</template>

<script>
	export default {
		props: {
			visible: Boolean,
			color: {
				type: String,
				default: '#FFF',
			},
			placement: {
				type: String,
				default: 'top',
			},
			content: {
				type: String,
				default: ''
			},
			show: {
				type: Boolean,
				default: false,
			}
		},

		data() {
			return {
				isShow: this.visible,
				title: 'Hello',
				arrowLeft: 0,
				query: null,
				style: {

				},
				arrowStyle: {}
			}
		},
		onLoad() {

		},
		watch: {
			isShow: {
				handler(val) {
					this.$emit('update:visible', val)
				},
				immediate: true,
			},
			visible: {
				handler(val) {
					if (val) {
						this.$nextTick(() => {
							this.getPosition()
						})
					}
					this.isShow = val
				},
				immediate: true,
			}
		},
		mounted() {
			// #ifdef H5
			window.addEventListener('click', () => {
				this.isShow = false
			})
			// #endif
			this.getPosition()
		},
		methods: {
			close() {
				this.isShow = false
			},
			fixedWrap() {
				this.isShow = false
			},
			async handleClick() {
				if (this.isShow) {
					return this.isShow = false
				}
				await this.getPosition()
				this.isShow = true
			},
			getPosition() {
				return new Promise((resolve) => {
					uni.createSelectorQuery().in(this).selectAll('.zb_tooltip_content,.zb_tooltip__popper')
						.boundingClientRect(async (data) => {
							let {
								left,
								bottom,
								right,
								top,
								width,
								height
							} = data[0]
							let obj1 = data[1]
							let objStyle = {}
							let objStyle1 = {}
							switch (this.placement) {
								case 'top':
									if (obj1.width > width) {
										objStyle.left = `-${(obj1.width - width)/2}px`
									} else {
										objStyle.left = `${Math.abs(obj1.width - width)/2}px`
									}

									objStyle.bottom = `${height+8}px`
									objStyle1.left = (obj1.width / 2 - 6) + 'px'
									break;
								case 'top-start':
									objStyle.left = `0px`
									objStyle.bottom = `${height+8}px`
									break;
								case 'top-end':
									objStyle.right = `0px`
									objStyle.bottom = `${height+8}px`
									objStyle1.right = `8px`
									break;
								case 'bottom':
									if (obj1.width > width) {
										objStyle.left = `-${(obj1.width - width)/2}px`
									} else {
										objStyle.left = `${Math.abs(obj1.width - width)/2}px`
									}
									objStyle.top = `${height+8}px`
									objStyle1.left = (obj1.width / 2 - 6) + 'px'
									break;
								case 'bottom-start':
									objStyle.left = `0px`
									objStyle.top = `${height+8}px`
									objStyle1.left = `8px`
									break;

								case 'bottom-end':
									objStyle.right = `0px`
									objStyle.top = `${height+8}px`
									objStyle1.right = `8px`
									break;

								case 'right':
									objStyle.left = `${width+8}px`
									if (obj1.height > height) {
										objStyle.top = `-${(obj1.height - height)/2}px`
									} else {
										objStyle.top = `${Math.abs((obj1.height - height)/2)}px`
									}

									objStyle1.top = `${obj1.height/2-6}px`
									break;
								case 'right-start':
									objStyle.left = `${width+8}px`
									objStyle.top = `0px`
									objStyle1.top = `8px`
									break;

								case 'right-end':
									objStyle.left = `${width+8}px`
									objStyle.bottom = `0px`
									objStyle1.bottom = `8px`
									break;

								case 'left':
									objStyle.right = `${width+8}px`

									if (obj1.height > height) {
										objStyle.top = `-${(obj1.height - height)/2}px`
									} else {
										objStyle.top = `${Math.abs((obj1.height - height)/2)}px`
									}

									objStyle1.top = `${obj1.height/2-6}px`
									break;

								case 'left-start':
									objStyle.right = `${width+8}px`
									objStyle.top = `0px`
									objStyle1.top = `8px`
									break;

								case 'left-end':
									objStyle.right = `${width+8}px`
									objStyle.bottom = `0px`
									objStyle1.bottom = `8px`
									break;
							}
							this.style = objStyle
							// 三角形箭头
							this.arrowStyle = objStyle1
							resolve()
						}).exec()
				})

			}
		}
	}
</script>

<style lang="scss" scoped>
	$theme-bg-color: var(--theme-bg-color);

	.zb-tooltip {
		position: relative;
	}

	.zb_tooltip_content {
		height: 100%;
		position: relative;
		display: inline-block;
	}

	.zb_tooltip__popper {
		background: $theme-bg-color;

		visibility: hidden;
		// color:'#fff';
		position: absolute;
		margin-top: 3.91rpx;
		border-radius: 2.56rpx;
		font-size: 8.59rpx;
		padding: 0 3.91rpx;
		min-width: 5.91rpx;
		word-wrap: break-word;
		display: inline-block;
		white-space: nowrap;
		z-index: 9;
	}

	.zb_popper__icon {
		width: 0;
		height: 0;
		z-index: 9;
		position: absolute;
	}

	.zb_popper__arrow {
		bottom: -5px;
		/* transform-origin: center top; */
		border-left: 6px solid transparent;
		border-right: 6px solid transparent;
		border-top: 6px solid $theme-bg-color;

	}

	.zb_popper__right {
		border-top: 6px solid transparent;
		border-bottom: 6px solid transparent;
		border-right: 6px solid $theme-bg-color;
		left: -5px;
	}

	.zb_popper__left {
		border-top: 6px solid transparent;
		border-bottom: 6px solid transparent;
		border-left: 6px solid $theme-bg-color;
		right: -5px;
	}

	.zb_popper__up {
		border-left: 6px solid transparent;
		border-right: 6px solid transparent;
		border-bottom: 6px solid $theme-bg-color;
		top: -5px;
	}

	.fixed {
		position: absolute;
		width: 100vw;
		height: 100vh;
		position: fixed;
		left: 0;
		top: 0;
		pointer-events: auto;
		background: red;
		z-index: -1;
	}
</style>

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

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

相关文章

pytorch项目代码记录

目录 1.超过二维的张量写进csv 2.翻转矩阵与绘制热力图 3.切片 4.np按块复制 1.超过二维的张量写进csv #(20,204,273) -> (4080,273) ycsv []for i in range(20):ycsv.append(y[i, 8, :, :].reshape(204,273))with open(y.csv,w,encodingutf-8) as y_obj:writer csv.…

SpringCloud 服务的注册与发现

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第二篇&#xff0c;即使用服务注册和发现的组件&#xff0c;此篇文章会介绍 Eureka、Zookeeper 和 Consu…

C++初阶 类(上)

目录 1. 什么是类 2. 如何定义出一个类 3. 类的访问限定符 4. 类的作用域 5. 类的实例化 6. 类的大小 7. this指针 1.this指针的引出 2. this指针的特性 8. 面试题 1. 什么是类 在C语言中&#xff0c;不同类型的数据集合体是结构体。为了方便管理结构体&#xff0c;我…

CVHub | 万字长文带你全面解读视觉大模型(建议收藏!)

本文来源公众号“CVHub”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;万字长文带你全面解读视觉大模型 0 导读 众所周知&#xff0c;视觉系统对于理解和推理视觉场景的组成特性至关重要。这个领域的挑战在于对象之间的复杂关系…

centos7 python3.12.1 报错 No module named _ssl

https://blog.csdn.net/Amio_/article/details/126716818 安装python cd /usr/local/src wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz tar -zxvf Python-3.12.1.tgz cd Python-3.12.1/ ./configure -C --enable-shared --with-openssl/usr/local/opens…

Docker镜像及Dockerfile详解

1 Docker镜像用途 统一应用发布的标准格式支撑一个Docker容器的运行 2 Docker镜像的创建方法 基于已有镜像创建基于本地模板创建基于Dockerfile创建 &#xff08;实际环境中用的最多&#xff09; 2.1 基于已有镜像的创建 将容器里面运行的程序及运行环境打包生成新的镜像 …

网络工程师笔记10 ( RIP / OSPF协议 )

RIP 学习路由信息的时候需要配认证 RIP规定超过15跳认定网络不可达 链路状态路由协议-OSPF 1. 产生lsa 2. 生成LSDB数据库 3. 进行spf算法&#xff0c;生成最有最短路径 4. 得出路由表

IOS开发0基础入门UIkit-1cocoapod安装、更新和使用 , 安装中出现的错误及解决方案 M1或者M2安装cocoapods

cocoapod是ios开发时常用的包管理工具 1.M1或者是M2系统安装cocoapods先操作一下两个设置 1、打开访达->应用->实用工具->终端->右键点击终端->显示简介->勾选使用 Rosetta 打开&#xff0c;关闭终端&#xff0c;重新打开。 2、打开访达->应用->Xcod…

如何制作一个分销商城小程序_揭秘分销商城小程序的制作秘籍

打造赚钱神器&#xff01;揭秘分销商城小程序的制作秘籍 在这个数字化高速发展的时代&#xff0c;拥有一个属于自己的分销商城小程序&#xff0c;已成为众多商家和创业者的必备利器。它不仅能够快速搭建起自己的在线销售渠道&#xff0c;还能够利用分销模式&#xff0c;迅速裂…

处理error: remote origin already exists.及其Gitee文件上传保姆级教程

解决error: remote origin already exists.&#xff1a; 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin &#xff08;HTTPS&#xff09; 比如这样&#xff1a; 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…

spm用于颅骨去除和配准

1. 颅骨去除 出现这个界面就一直等待即可&#xff1a; segment的结果文件中会出现四个文件夹label、mri、report、surf 在mri文件中&#xff0c;mwp1是分割出来的灰质图像&#xff0c;mwp2是分割出来的白质图像&#xff0c;这两图像均是bias correction和空间配准后的。p0**…

log4j2 远程代码执行漏洞复现(CVE-2021-44228)

写在前面 log4j 对应的是 CVE-2017-5645&#xff0c;即 Apache Log4j Server 反序列化命令执行漏洞&#xff1b; log4j2 对应的是 CVE-2021-44228&#xff0c;即 log4j2 远程代码执行漏洞&#xff0c;通过 JNDI 注入实现&#xff1b; CVE-2017-5645 比较久远因此我们这里不做…

mysql的语法学习总结3(一些常见的问题)

执行后&#xff0c;MySQL 会重新加载授权表并更新权限。 FLUSH PRIVILEGES; 怎么检查自己的电脑端口3306有没有被占用&#xff1f; ESTABLISHED表示被占用&#xff0c;LISTENING表示端口正在被监听&#xff0c;22696是占用该端口的进程的PID&#xff08;进程标识符&#xff0…

羊大师揭秘,女性喝羊奶有什么好处

羊大师揭秘&#xff0c;女性喝羊奶有什么好处 女性喝羊奶有多种好处。首先&#xff0c;羊奶富含钙元素&#xff0c;有助于预防女性体内缺钙和老年女性骨质疏松&#xff0c;从而增强骨骼密度。其次&#xff0c;羊奶中的色氨酸和烟酸等成分有助于促进睡眠&#xff0c;改善睡眠质…

BUUCTF-MISC-[HDCTF2019]信号分析1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件是一个WAV的文件&#xff0c;题目又叫做信号分析&#xff0c;用Adobe Audition 打开分析了 发现有很多长短不一样的信号&#xff0c;只需要分析一段 猜测长的是一短的为0 最后得到0101010101010101000000110 百度得知…

TMS智慧园区物流车辆管理系统:精确监控与高效运营的完美结合

在当今高速发展的物流行业中&#xff0c;效率和精确性是成功的关键。随着科技的不断进步&#xff0c;智慧园区物流车辆管理系统应运而生&#xff0c;为物流行业带来了革命性的变革。这些系统不仅提高了物流运作的效率&#xff0c;还为企业提供了更精确的监控和管理手段。接下来…

【OpenGL实现 03】纹理贴图原理和实现

目录 一、说明二、纹理贴图原理2.1 纹理融合原理2.2 UV坐标原理 三、生成纹理对象3.1 需要在VAO上绑定纹理坐标3.2 纹理传递3.3 纹理buffer生成 四、代码实现&#xff1a;五、着色器4.1 片段4.2 顶点 五、后记 一、说明 本篇叙述在画出图元的时候&#xff0c;如何贴图纹理图片…

NLP_文本张量表示方法_2(代码示例)

目标 了解什么是文本张量表示及其作用.文本张量表示的几种方法及其实现. 1 文本张量表示 将一段文本使用张量进行表示&#xff0c;其中一般将词汇为表示成向量&#xff0c;称作词向量&#xff0c;再由各个词向量按顺序组成矩阵形成文本表示. ["人生", "该&q…

【深度学习笔记】稠密连接网络(DenseNet)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.12 稠密连接网络&#xff08;DenseNet&#xff09; ResNet中的跨层连接设计引申出了数个后续工作。本节我们介绍其中的一个&#xf…

LInux-多线程基础概念

文章目录 前言预备页表详解缺页中断页表的映射 一、多线程是什么&#xff1f;轻量级进程 二、Pthread库pthread_create 前言 从本章的多线程开始&#xff0c;我们开始进入Linux系统的尾声&#xff0c;所以&#xff0c;在学习多线程的过程中&#xff0c;我们也会逐步对之前的内…