首页 > 其他分享 >自适应iframe高度

自适应iframe高度

时间:2024-02-26 09:44:41浏览次数:27  
标签:body 高度 height 适应 html iframe 页面

使用iframe嵌入页面很方便,但必须在父页面指定iframe的高度。如果iframe页面内容的高度超过了指定高度,会出现滚动条,很难看。

如何让iframe自适应自身高度,让整个页面看起来像一个整体?

在HTML5之前,有很多使用JavaScript的Hack技巧,代码量大,而且很难通用。随着现代浏览器引入了新的ResizeObserver API,解决iframe高度问题就变得简单了。

我们假设父页面是index.html,要嵌入到iframe的子页面是target.html,在父页面中,先向页面添加一个iframe

const iframe1 = document.createElement('iframe');
iframe1.src = 'target.html';
iframe1.onload = autoResize;
document.getElementById('sameDomain').appendChild(iframe1);

iframe载入完成后,触发onload事件,然后自动调用autoResize()函数:

function autoResize(event) {
    // 获取iframe元素:
    const iframeEle = event.target;
    // 创建一个ResizeObserver:
    const resizeRo = new ResizeObserver((entries) => {
        let entry = entries[0];
        let height = entry.contentRect.height;
        iframeEle.style.height = height + 'px';
    });
    // 开始监控iframe的body元素:
    resizeRo.observe(iframeEle.contentWindow.document.body);
}

通过创建ResizeObserver,我们就可以在iframebody元素大小更改时获得回调,在回调函数中对iframe设置一个新的高度,就完成了iframe的自适应高度。

跨域问题

ResizeObserver很好地解决了iframe的监控,但是,当我们引入跨域的iframe时,上述代码就失效了,原因是浏览器阻止了跨域获取iframebody元素。

要解决跨域的iframe自适应高度问题,我们需要使用postMessage机制,让iframe页面向父页面主动报告自身高度。

假定父页面仍然是index.html,要嵌入到iframe的子页面是http://xyz/cross.html,在父页面中,先向页面添加一个跨域的iframe

const iframe2 = document.createElement('iframe');
iframe2.src = 'http://xyz/cross.html';
iframe2.onload = autoResize;
document.getElementById('crossDomain').appendChild(iframe2);

cross.html页面中,如何获取自身高度?

我们需要现代浏览器引入的一个新的MutationObserver API,它允许监控任意DOM树的修改。

cross.html页面中,使用以下代码监控body元素的修改(包括子元素):

// 创建MutationObserver:
const domMo = new MutationObserver(() => {
    // 获取body的高度:
    let currentHeight = body.scrollHeight;
    // 向父页面发消息:
    parent.postMessage({
        type: 'resize',
        height: currentHeight
    }, '*');
});
// 开始监控body元素的修改:
domMo.observe(body, {
    attributes: true,
    childList: true,
    subtree: true
});

iframe页面的body有变化时,回调函数通过postMessage向父页面发送消息,消息内容是自定义的。在父页面中,我们给window添加一个message事件监听器,即可收取来自iframe页面的消息,然后自动更新iframe高度:

window.addEventListener('message', function (event) {
    let eventData = event.data;
    if (eventData && eventData.type === 'resize') {
        iframeEle.style.height = eventData.height + 'px';
    }
}, false);

使用现代浏览器提供的ResizeObserverMutationObserver API,我们就能轻松实现iframe的自适应高度。

转载自:https://mp.weixin.qq.com/s/8NmYRzPlTTihJVUybkqqOQ;廖雪峰

 

标签:body,高度,height,适应,html,iframe,页面
From: https://www.cnblogs.com/shangguancn/p/18033665

相关文章

  • VMware Workstation 安装Ubuntu虚拟机 屏幕窗口分辨率 自动调整大小 自动适应客户机
    Ubuntu18.04.5LTSVMwareWorkstation16Pro 首先排查了vmwaretools的安装问题首先尝试通过这样安装 点击安装后,好像是有个cd挂载上,复制这个文件到桌面解压这个压缩包,在文件夹打开终端sudo./vmware-install.pl全按回车应该就可以其间Theinstallerhasdetect......
  • 业界唯一单芯片自适应射频平台:XCZU42DR-L2FSVE1156I、XCZU42DR-1FFVE1156I、XCZU65DR-
    ZynqUltraScale+RFSoC是业界唯一单芯片自适应射频平台。ZynqUltraScale+RFSoC是一种异构计算架构,包括完整的Arm处理子系统、FPGA架构,以及RF信号链中的完整模数可编程性,其不仅可为不同的应用提供一个完整的单片软件定义无线电平台,而且还有助于随着市场动态的发展,生产无线......
  • iframe 使用 postMessage 传递信息,addEventListener监听返回信息,并使用removeEventLis
    BUTTON发送消息selectButton.addEventListener('click',()=>{      iframe.contentWindow.postMessage({        event_id:"select_media",        return_type:'media'      },'*');   ......
  • echarts自适应问题,echarts中怎么改变字体单位实现自适应
    参考文档:https://blog.csdn.net/MFWSCQ/article/details/102522944最初想着怎么给echarts设置vw单位或者rem,echart中怎么把legend的单位设置为vw或者rem来使表格自适应,后面发现行不通。项目中使用px-to-vw包,将所有px转为对应的vw,所有可以根据相同比例进行缩放,做到自适应效果。但......
  • 使用 Perlin 噪声来生成曲率线,然后根据曲率线生成高度图
      使用Perlin噪声生成曲率线,然后根据曲率线生成高度图的方法如下:生成Perlin噪声:首先,使用Perlin噪声算法生成一个二维的噪声图像。Perlin噪声是一种用于生成随机连续函数的算法,常用于生成自然风格的纹理和地形。通过调整Perlin噪声的参数,可以控制生成的噪声图像的特征和细......
  • 自适应辛普森法从入门到进门
    前言学数学学的。simpson背景我们要计算这样一个式子:\[\int_l^rf(x)\textdx\]显然计算机是很难把柿子推出来的。函数的拟合对于一个奇怪的函数,为了对其求导,我们可以用一个图像近似且容易求导的函数来替代,这个过程叫做拟合。这里我们用二次函数来替代,那么有:\[\beg......
  • qt 代码添加QScrollArea滚动区域控件,设置滚动区域窗口widget后,滚动区域和滚动条之间有
    QScrollArea#MyqtWidgetStyle_m_scrollArea{background-color:rgb(189,97,99);max-width:190px;/*最大宽度*/min-width:190px;/*最大宽度*/}QWidget#MyqtWidgetStyle_m_scorllWidget{max-width:160px;/*最大宽度*/min-width:160px;......
  • 十九、Ajax和iFrame
    AjaxAjax向后台发请求1、下载引入jQuery2、语法格式#get$.ajax({Url:‘http://www.*****.com’,Type:‘GET’,Data:{‘k1’:’v1’},Success:function(arg){//arg是字符串类型//varobj=JSON.parse(arg)}})$.ajax({Url:‘http://ww......
  • Leetcode 1691. 堆叠长方体的最大高度
    https://leetcode.cn/problems/maximum-height-by-stacking-cuboids/description/给你n个长方体cuboids,其中第i个长方体的长宽高表示为cuboids[i]=[widthi,lengthi,heighti](下标从0开始)。请你从cuboids选出一个子集,并将它们堆叠起来。如果widthi<=widthj......
  • 【Vue】使用iframe解决多应用整合问题(微前端)
    一、需求背景有老系统需要重构,新做的系统需要做一个大一统的整合,类似一个分类栏目在菜单位置罗列出有什么子系统应用,点击对应的应用菜单,展示区跳转到相应的子系统应用中我用Excel简单描述了下系统的页面效果: 二、技术方案第一种,使用iframe实现,html提供了iframe标签实现页......