iframe内嵌网页自适应缩放 以展示源网页的比例尺寸

需求:这是我最近开发的低代码平台遇到的需求 ,要求将配置好的应用在弹框中预览(将预览网页内嵌入弹框中) 但是内嵌进入后 他会截取一部分(我源网站网页尺寸 是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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值