需求:这是我最近开发的低代码平台遇到的需求 ,要求将配置好的应用在弹框中预览(将预览网页内嵌入弹框中) 但是内嵌进入后 他会截取一部分(我源网站网页尺寸 是1980x1080 或者 3060X2160等等) 但是我这个dialog弹框只有我自定义的1000多px的宽高 他只会展示我iframe网页的一部分
需求描述清楚了 现在来说解决方法
我们可以使用 iframe 的 @load方法 来控制iframe内嵌网页的缩放 以达到我们想实现的效果
前提是必须要知道 1.内嵌网页的高宽!!!(一般都是一个展示列表 点击预览 写接口的时候可以将数据塞进数据列表中) 2.弹框的高宽(这个自己可以自定义)
//html
<el-dialog title="预览" id="preview-box" :visible.sync="previewObj.previewVisible" :close-on-click-modal=false
:before-close="preViewHandleClose">
<div class="title" slot="title" style="height: 20px;">
<span>{{ previewObj.title }}</span>
</div>
<div class="bottom-content">
<iframe :src="previewObj.urlValue" id="bi_iframe" frameborder="0" @load="adjustIframe"></iframe>
</div>
</el-dialog>
//data
previewObj: {
//标题
title: '',
//控制弹框显示隐藏
previewVisible: false,
//iframe地址
urlValue: null,
//内嵌地址的宽高
widthValue: 0,
heightValue: 0,
}
//方法
//1.点击预览方法
// 预览 拿到需要的值
lookFn(item) {
this.previewObj.previewVisible = true
this.previewObj.widthValue = item.width
this.previewObj.heightValue = item.height
this.previewObj.title = item.name
var url = "windowPreview.html";
var urlWithParams = url + "?appKey=" + encodeURIComponent(item.appkey) + "&appId=" + encodeURIComponent(item.id);
this.previewObj.urlValue = urlWithParams
}
//2.
//iframe load事件
adjustIframe() {
var iframe = document.getElementById('bi_iframe');
// 获取父级容器的宽高 //也就是弹框在样式中设置的高宽 最好给固定值 在这里可以直接拿到
var containerWidth = 1145;
var containerHeight = 600;
// 计算缩放比例
var scaleWidth = containerWidth / this.previewObj.widthValue;
var scaleHeight = containerHeight / this.previewObj.heightValue;
var scale = Math.min(scaleWidth, scaleHeight); // 选择较小的缩放比例以保持宽高比
// 应用缩放和定位
iframe.style.transformOrigin = 'top left';
iframe.style.transform = `scale(${scale}) translate(-50%, -50%)`;
// 如果需要,可以调整iframe的宽高以匹配容器
// 但由于我们使用了scale,所以通常不需要这样做
iframe.style.width = `${this.previewObj.widthValue}px`;
iframe.style.height = `${this.previewObj.heightValue}px`;
},
//样式
<style lang="scss">
#preview-box {
.el-dialog {
width: 1145px;
}
.el-dialog__body {
padding: 0px;
overflow: hidden;
/* 隐藏超出容器的内容 */
position: relative;
/* 用于定位iframe */
}
.el-dialog__header {
color: #fff;
}
}
.bottom-content {
width: 100%;
height: 600px;
position: relative;
iframe {
width: 100%;
/* 初始宽度设置为100% */
height: 100%;
/* 初始高度设置为100% */
border: none;
position: absolute;
top: 50%;
left: 50%;
/* 初始不应用缩放 */
transform: none;
transition: transform 0.3s ease;
/* 可选的过渡效果 */
}
}
</style>
最后实现效果就是
3840
1920