el-tooltip根据条件控制显示,超出父级宽度展示提示词(多层循环情况)

文章讲述了如何在Vue.js应用中,利用el-tooltip组件并结合v-for指令在多层循环中实现内容的条件显示。通过调整isShowTooltip状态和动态绑定popper-class,以及在鼠标悬停事件中计算元素宽度来决定tooltip是否隐藏,同时使用CSS类隐藏超出父元素宽度的内容。

一、el-tooltip根据条件控制显示(多层循环情况)

<div class="box" v-for="(item, index) in detailList" :key="index">
	<div class="title">
		<i class="el-icon-document"></i>
		<p>{{ item.elementName }}</p>
	</div>
	<el-row class="item" v-for="(cItem, cIndex) in item.children" :key="cIndex">
		<el-col :span="12">
			<div class="name">
				<el-tooltip effect="dark" :content="cItem.elementName" placement="bottom" :popper-class="isShowTooltip ? 'hide-tooltip' : ''">
					<span :class="`showMenuClass_${cItem.elementId}`" @mouseenter.stop.prevent="onMouseOver(cItem.elementId, 'name')" @mouseleave.stop.prevent="isShowTooltip = true">{{ cItem.elementName }}</span>
				</el-tooltip>
			</div>
		</el-col>
		<el-col :span="8">
			<span>
				{{ cItem.fundCount }}
			</span>
		</el-col>
		<el-col class="option" :span="4">
			<el-button>编辑</el-button>
		</el-col>
	</el-row>
</div>
setup() {
	const state = reactive({
		isShowTooltip: true,
		showMenuClass: '',
	})
	function onMouseOver(id: string) {
		state.isShowTooltip = true;
		let data = null;
		state.showMenuClass = `showMenuClass_${id}`; // 重点!!!
		data = $(`.${state.showMenuClass}`)[0];
		let parentWidth = (data.parentNode as any).offsetWidth;
		let contentWidth = data.offsetWidth;
		clearTimeout(timer);
		timer = setTimeout(() => {
			if (contentWidth > parentWidth) {
				state.isShowTooltip = false;
			}
		}, 300);
	}
}
.hide-tooltip {
	visibility: hidden !important;
}
### 动态控制 el-tooltip 显示逻辑 为了实现基于元素宽度动态调整 `el-tooltip` 组件的显示行为,可以结合 Vue.jsElement UI 的功能来完成。以下是具体的解决方案: #### 1. 判断元素宽度并更新状态 通过监听鼠标事件(如 `mouseover`),获取目标元素及其容器的宽度,并判断是否需要显示 Tooltip。 ```javascript export default { data() { return { showTooltip: false, // 控制 Tooltip 是否显示 }; }, methods: { onMouseOver(refName) { this.showTooltip = false; const node = this.$refs[refName]; // 获取当前 DOM 节点 if (!node || !node.parentNode) return; const parentWidth = node.parentNode.offsetWidth; // 节点宽度 const contentWidth = node.offsetWidth; // 当前节点宽度 this.showTooltip = contentWidth > parentWidth; // 如果内容超出,则显示 Tooltip } } }; ``` 此部分代码实现了对目标元素宽度的检测,并决定是否启用 Tooltip[^1]。 --- #### 2. 使用 `disabled` 属性动态控制 Tooltip 显隐 Element UI 提供了 `disabled` 属性用于禁用或启用 Tooltip。可以通过绑定该属性到计算后的布尔值上来实现动态控制。 ```html <template> <div> <!-- ref="exampleRef" 是用来获取 DOM 节点 --> <span ref="exampleRef" @mouseover="onMouseOver('exampleRef')"> 这是一个可能超出的内容示例 </span> <!-- disabled 属性绑定至 showTooltip 反向逻辑 --> <el-tooltip :disabled="!showTooltip" content="这是 Tooltip 的提示内容" placement="top"> <span>Hover me</span> </el-tooltip> </div> </template> ``` 上述模板中,当 `this.showTooltip` 设置为 `true` 时,Tooltip 将被激活;反之则会被禁用[^3]。 --- #### 3. 解决 Tooltip 错位问题 如果遇到 Tooltip 定位不准确的情况,建议开启 `popper-append-to-body` 属性。这会将 Tooltip 的 Popper 元素附加到文档根部,从而避免因嵌套结构引起的定位偏差。 ```html <el-tooltip :disabled="!showTooltip" content="这是 Tooltip 的提示内容" placement="top" popper-append-to-body > <span>Hover me</span> </el-tooltip> ``` 这一配置能够有效减少 Tooltip 显示位置偏移的可能性[^2]。 --- #### 4. 自定义样式以适配不同宽度需求 有时默认的 Tooltip 样式无法满足特定场景下的布局要求。此时可通过自定义 CSS 类名覆盖原有样式。例如,强制指定 Tooltip 的最大宽度: ```css /* 添加 custom-class 并重写其内部样式 */ .custom-tooltip .el-tooltip__popper { max-width: 200px; /* 设定最大宽度 */ } ``` 随后,在组件中应用这个类名: ```html <el-tooltip class="custom-tooltip" :disabled="!showTooltip" content="这是一个很长的提示内容..." placement="top" popper-append-to-body > <span>Hover me</span> </el-tooltip> ``` 这种方式解决了某些情况下设置宽度无效的问题[^4]。 --- ### 总结 以上方法综合运用了 JavaScript 对 DOM 的操作能力以及 Element UI 的特性,既保证了 Tooltip 的动态显示效果,又兼顾了性能优化和用户体验改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值