Vue Element Plus 列表图片预览时,被表格覆盖问题解决方法
最近用Element Plus开发页面时,踩了个很典型的坑——列表里用el-image组件做图片预览,点击后预览弹窗居然被下方的el-table表格内容盖住了一半。
调试时发现是层级和定位的双重问题,记录分享下解决方法,希望能够帮助大家少走弯路。
vue element plus 列表表格组件使用图片组件预览时,被表格内容覆盖,无法正常展示,如下图
原因分析
Element Plus的el-image预览弹窗(默认是Viewer组件)和el-table表格,本质是两个独立的DOM元素,出现覆盖问题核心就三个原因,排查时按这个顺序找准没错:
- z-index层级不足:表格或其祖先容器的z-index值过高,超过了预览弹窗的默认层级(Element Plus预览弹窗默认z-index是2000左右);
- 定位上下文冲突:表格容器设置了position: relative/absolute/fixed,且未预留足够层级,导致预览弹窗被限制在表格容器内;
- overflow属性截断:表格所在容器或父容器设置了overflow: hidden,直接把超出容器的预览弹窗截断了。
下面的三种方法,分别对应不同成因,从简单到彻底逐步解决,建议先试方法一快速验证,再根据项目场景选最优方案。
解决方法
(一)方式一、提升预览弹窗层级
最直接的办法就是强制提高预览弹窗的z-index,比表格及其父容器的层级高即可。Element Plus的el-image预览弹窗有专门的自定义类名配置,不用改源码就能生效。
步骤及代码实现:
- 给el-image配置预览自定义类:通过preview-class属性指定类名,比如“custom-image-preview”;
- 编写全局样式提升层级:在全局样式文件(如index.css)中给自定义类设置足够高的z-index(建议3000以上,避开常见组件层级)。
(二)方式二、添加 preview-teleport 属性
在 preview-teleported="true" 即可
preview-teleport属性可以指定预览弹窗挂载的DOM节点,默认是挂载在当前组件内,我们把它改成挂载到body节点上,这样预览弹窗就和表格不在同一个定位上下文里,自然不会被覆盖
代码如下
<el-image
style="width: 100px; height: 100px"
:src="formatImgURL(scope.row.img_url)"
:preview-src-list="[formatImgURL(scope.row.img_url)]"
show-progress
preview-teleported="true"
fit="cover"
>
<template #error>
<div class="image-slot">
<el-icon><icon-picture /></el-icon>
</div>
</template>
</el-image>结果
(三)方式三、自定义预览组件
如果表格在嵌套很深的容器里,且容器有overflow: hidden(比如带滚动的卡片),即使挂载到body也可能被截断。这时候需要自定义预览组件,手动控制弹窗的位置和显示逻辑。
该方法使用复杂场景,我遇到的问题通过以上两种方式已经可以即可,并且方式三有些麻烦复杂,也不是很推荐,本文就不展开讲解,有能力的朋友可以自己实现
大家还有哪些方式可以解决吗,欢迎大家在评论区进行交流分享!!!
版权声明
未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!
本文原文链接: https://fiveyoboy.com/articles/vue-element-ui-img-err-1/
备用原文链接: https://blog.fiveyoboy.com/articles/vue-element-ui-img-err-1/