el-image大图预览显示在父组件,无法全屏显示的问题

       开发gis项目,通常会定制右侧容器组件,通过插槽插入子组件,各模块功能内容在右侧容器中展示。当通过el-image实现大图预览时,发现只能在容器组件中展示,查找原因,发现是:如果父元素的 transform, perspective 或 filter 属性不为 none 时,fixed 元素就会相对于父元素来进行定位 的原因导致。如下图:

 解决方案:

方法一:更改容器定位方式,不使用transform进行偏移。

方法二:若父容器不便于更改,只能考虑更改 el-image-viewer__wrapper 在dom中的位置。在全部dom渲染完毕后,获取大图预览的dom。如下图:

 若你使用的是vue2,只能通过以下方式,待验证。或者通过第三方插件portal-vue,同时要改写el-image。

<template>
<el-image
   ref="myImage"
   :src="pic"
   :preview-src-list="picArray"
>
</template>
<script>
export default{
//略
watch:{
 'this.$refs.myImage.showViewer'(newV){
  if(newV){
         this.$nextTick(() => {
		const body = document.querySelector('body');
        let imageViewer=document.getElementByClassName('.el-image-viewer__wrapper')
		body.append(imageViewer);
        imageViewer.remove();
	})
        }
     }
   }

}

</script>

 若你使用的是vue3,恭喜你,省去了很大麻烦。众所周知vue3的新特性中有一项 Teleport 标签,它可以将我们的模板移动到 DOM的其他位置。element基于vue3的plus版本中,新增了一项新属性:

 查看源码:

 可以发现这里使用了Teleport 标签,将image-viewer子组件直接移动到了body下,保证了定位方式为fixed的元素,是以浏览器窗口进行定位的。

所以,我们只需要在<el-image>标签中增加append-to-body='true'属性即可解决该问题。

 

 

 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
el-image是一个基于Element UI的组件,可以用于显示片并支持大。要实现el-image的大功能,可以按照以下步骤进行操作: 1.在页面中引入Element UI组件库和相关样式文件。 2.在el-image标签中设置属性v-preview-src-list,将其绑定到一个方法上,该方法返回一个包含所有片地址的数组。 3.在该方法中,将当前点击的片地址放在数组的最前面,以便在时首先显示片。 4.在el-image标签中设置属性v-preview-src-index,将其绑定到一个变量上,该变量表示当前点击的片在数组中的下标。 5.点击片时,会自动触发大功能,时会显示所有片,并以当前点击的片为起点进行。 以下是一个el-image的示例代码: ```html <template> <div> <el-image v-for="(item, index) in imgList" :key="index" :src="item" style="width: 100px; height: 100px; margin-right: 10px; margin-bottom: 10px;" :preview-src-list="getPreviewList(item, index)" :preview-src-index="previewIndex" ></el-image> </div> </template> <script> export default { data() { return { imgList: [ 'https://picsum.photos/200/300?random=1', 'https://picsum.photos/200/300?random=2', 'https://picsum.photos/200/300?random=3', 'https://picsum.photos/200/300?random=4', 'https://picsum.photos/200/300?random=5' ], previewIndex: 0 } }, methods: { getPreviewList(item, index) { let arr = [...this.imgList] arr.splice(index, 1) arr.unshift(item) return arr } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值