基于vue-popperjs的二次封装弹窗

ops/2024/12/26 15:57:32/

前言:

基于vue-popperjs的二次封装

代码

<template><!-- 1. :appendToBody="true"是否把位置加到body外层标签上饿了么UI和antD是true,iview和vuetifyjs是false2. trigger属性触发方式,常用hover悬浮触发、clickToOpen鼠标点击触发3. :visibleArrow="true"默认显示三角形小箭头,但是可以修改也可以使用伪元素自定义其对应样式,这样更加自由灵活一些4. :options="{ ... } 其实就是popper.js的配置项,可看对应官方文档5. placement: placement 即为tooltip出现的位置,有12个位置,即:placementArr6. modifiers: { ... } 此修饰符配置对象主要是控制定位的相关参数7. offset即偏移量在原有位置上进行移动微调,这里暂时不设置了,直接使用给.popper加上外边距即可margin: 12px !important;8. computeStyle.gpuAcceleration = false 关闭css3的transform定位,因为要自定义9. preventOverflow.boundariesElement = 'window' 防止popper元素定位到边界外如:当左侧距离不够用的时候,即使设置placement='left'但是tooltip依旧会在右侧10. <div class="popper" /> 此标签是tooltip的容器,所以我们可以设置对应想要的样式11. rootClass="selfSetRootClass"搭配transition="fade"实现淡入淡出过渡效果12. slot="reference"命名插槽是触发tooltip打开/关闭的dom元素13. disabled是否关闭这个tooltip--><popper :appendToBody="true" :trigger="trigger" :visibleArrow="false" :options="{placement: placement,modifiers: {offset: {offset: 0,},computeStyle: {gpuAcceleration: false,},preventOverflow: {boundariesElement: 'window',},},}" rootClass="selfSetRootClass" transition="fade" :disabled="disabled"><!-- 内容过多的时候,建议使用content插槽,便于自定义样式 --><div v-if="$slots.content" :class="{ isLightPopper: light }" ref="popperRef" class="popper" :style="tooltipStyle"><slot name="content"></slot></div><!-- 内容少的话,直接content属性 --><div v-else :class="{ isLightPopper: light }" ref="popperRef" class="popper" :style="tooltipStyle">{{ content }}</div><!-- 把外界传递的普通插槽当做具名插槽传递给子组件使用 --><slot slot="reference"></slot></popper>
</template><script>
// 基于vue-popperjs的二次封装
import popper from "vue-popperjs"; // vue-popperjs基于popper.js二次封装
import "vue-popperjs/dist/vue-popper.css";
// 总共12个位置
const placementArr = ["top","top-start","top-end","left","left-start","left-end","right","right-start","right-end","bottom","bottom-start","bottom-end",
];
export default {name: "myTooltip",components: { popper }, // 注册并使用vue-popperjs插件组件props: {// 12个tooltip位置placement: {type: String,default: "top", // 默认validator(val) {return placementArr.includes(val); // 位置校验函数},},trigger: {type: String,default: "hover",},// 内容(同内容插槽,不过内容插槽的权重高一些)content: {type: String,default: "",},// 是否是亮色模式,默认是暗色模式light: {type: Boolean,default: false,},// 是否禁用即关掉tooltipdisabled: {type: Boolean,default: false,},tooltipStyle: {type: Object,default: () => {return {}}},},
};
</script><style lang="less">
// 覆盖部分默认的样式(不用加/deep/ )
.popper {box-sizing: border-box;padding: 6px 6px;border-radius: 3px;color: #fff;background-color: #333;
}// 设置一个tootip的外边距(也可以使用offset)
.popper[x-placement^="top"] {margin-bottom: 12px !important;
}.popper[x-placement^="bottom"] {margin-top: 12px !important;
}.popper[x-placement^="left"] {margin-right: 12px !important;
}.popper[x-placement^="right"] {margin-left: 12px !important;
}// 加上过渡效果(搭配transition="fade")
.selfSetRootClass {transition: all 0.6s;
}.fade-enter,
.fade-leave-to {opacity: 0;
}.fade-enter-active,
.fade-leave-active {transition: opacity 0.6s;
}// 亮色模式样式
.isLightPopper {color: #333;background-color: #fff;filter: drop-shadow(0, 2px, 12px, 0, rgba(0, 0, 0, 0.24));box-shadow: 0, 2px, 12px, 0, rgba(0, 0, 0, 0.24);
}</style>

使用

<toolTip :disabled="visible" v-if="item" :tooltipStyle="tooltipStyle" :content="`${item[element.option.cardBottom.keyStatus.count]}`"><span data-value="alarms" class="bottomvalueClass">{{item[count]}}</span>
</toolTip>tooltipStyle () {return {width: `${tooltip.width}px!important`,backgroundImage: `url(${tooltip.imageUrl})!important`,background: '',border: `${tooltip.borderWidth}px solid ${tooltip.borderColor}!important`,fontFamily: `${tooltip.fontFamily}!important`,fontSize: `${tooltip.fontSize}px!important`,color: `${tooltip.fontColor}!important`,textAlign: `${tooltip.textDecoration}!important`}},

效果
在这里插入图片描述


http://www.ppmy.cn/ops/145155.html

相关文章

《机器学习》数据预处理简介

目录 1. 数据清洗&#xff08;Data Cleaning&#xff09; &#xff08;1&#xff09;处理缺失值 &#xff08;2&#xff09;处理异常值 &#xff08;3&#xff09;处理重复数据 2. 数据转换&#xff08;Data Transformation&#xff09; &#xff08;1&#xff09;特征缩…

Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总

问题1&#xff1a;打包的过程中不断提示 &#xff1a;codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决&#xff1a;打开钥匙串&#xff0c;点击证书---显示简介---信任----改为始终信任 &#xff08;记住 &#xff1a;不能只修改钥匙的显示简介的…

《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失如何修复?

《战神&#xff1a;诸神黄昏》游戏运行时提示找不到emp.dll怎么办&#xff1f;emp.dll丢失的修复方法 在畅游《战神&#xff1a;诸神黄昏》这款史诗级游戏的过程中&#xff0c;如果突然遭遇“找不到emp.dll”的错误提示&#xff0c;无疑会打断你的冒险之旅。作为一名深耕软件开…

Java面试题,数据结构,图的最短路径算法应用于社交网络分析

图的最短路径算法应用于社交网络分析 在一个大型社交网络中&#xff0c;用户想要找到连接两个特定用户的最短路径。假设你已经有了这个社交网络的数据模型&#xff0c;其中节点代表用户&#xff0c;边代表用户之间的关系。请设计一个解决方案&#xff0c;以找出两个用户之间的…

Django models中的增删改查与MySQL SQL的对应关系

在 Django 中&#xff0c;models 提供了一种高层次的抽象来与数据库进行交互&#xff0c;使得开发者可以使用 Python 代码而非直接编写 SQL 来执行增删改查&#xff08;CRUD&#xff09;操作。下面将详细介绍 Django 的 ORM&#xff08;对象关系映射&#xff09;操作如何对应到…

【ChatGPT】OpenAI 如何使用流模式进行回答

当你向 OpenAI 请求完成时&#xff0c;默认情况下&#xff0c;整个回复会在一次性响应中全部生成并返回给你。如果你正在生成的回复内容较长&#xff0c;等待完整回复的时间可能会让人觉得有点漫长——好几秒钟呢&#xff01;为了能更快地获取到部分回复&#xff0c;你可以选择…

7种server的服务器处理结构模型

两种高效的事件处理模式 服务器程序通常需要处理三类事件&#xff1a;I/O 事件、信号及定时事件。有两种高效的事件处理模式&#xff1a;Reactor和 Proactor&#xff0c;同步 I/O 模型通常用于实现Reactor 模式&#xff0c;异步 I/O 模型通常用于实现 Proactor 模式。 无论是 …

驱动与用户空间的交互函数

ssize_t read(int fd, void *buf, size_t count, loff_t *offt) fd&#xff1a;要打开的设备文件(文件描述符)&#xff1b; buf&#xff1a;返回给用户空间的数据缓冲区&#xff1b; count&#xff1a;要读取的数据长度&#xff1b; offt&#xff1a;相对于文件首地址的偏移…