需求:这是我最近开发的低代码平台遇到的需求 ,要求将配置好的应用在弹框中预览(将预览网页内嵌入弹框中) 但是内嵌进入后 他会截取一部分(我源网站网页尺寸 是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>//datapreviewObj: {//标题title: '',//控制弹框显示隐藏previewVisible: false,//iframe地址urlValue: null,//内嵌地址的宽高widthValue: 0,heightValue: 0,}//方法
//1.点击预览方法 // 预览 拿到需要的值lookFn(item) {this.previewObj.previewVisible = truethis.previewObj.widthValue = item.widththis.previewObj.heightValue = item.heightthis.previewObj.title = item.namevar 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