- 设置组件元素的基本结构、ref名和基本样式
<template>
<div ref="tooltipRef" class="text_pooper">
<el-tooltip
:popper-class="props.popperClass"
:content="props.popperContent"
placement="top"
:hide-after="200"
:disabled="!isOverflow"
>
<slot name="text"></slot>
</el-tooltip>
</div>
</template>
.text_pooper {
width: fit-content;
height: fit-content;
}
- 在js中声明ref,props和必要的一些参数
<script setup>
import { nextTick, onMounted, ref } from 'vue'
const props = defineProps({
popperContent: String,
popperClass: {
type: String,
default: 'tooltip_defalut_css'
}
})
const tooltipRef = ref(null)
const isOverflow = ref(false)
</script>
- 进行文字是否溢出的计算
onMounted(() => {
nextTick(() => {
if (props.popperContent && typeof props.popperContent === 'string' && tooltipRef.value) {
let childrenDom = tooltipRef.value.children[0]
if (childrenDom && childrenDom.clientWidth < childrenDom.scrollWidth) {
isOverflow.value = true
} else {
isOverflow.value = false
}
}
})
})
- 最后是悬浮弹出的样式:重点1:悬浮弹窗样式不能放在scoped中 ;重点2:要在自定义的悬浮弹窗类名前加上.el-popper 。如果发现样式不生效,可以通过设置element的el-tooltip组件的消失时间,从而检查悬浮弹窗的类名是否正确。
<!-- 下方是自定义tooltip的样式,如果嫌麻烦,自定义的悬浮弹窗的样式可以放在父组件中,根据使用场景设置好唯一类名,避免全局污染 -->
<!-- 要记得开头加上.el-popper -->
<style>
.el-popper.tooltip_defalut_css {
border: 1px solid #999;
border: 10px;
padding: 10px;
max-width: 200px;
font-size: 16px;
text-align: center;
color: pink !important;
}
.el-popper.tooltip_defalut_css .el-popper__arrow::before {
border-bottom-color: #999;
border-right-color: #999;
}
</style>