JQuery iframe宽高度自适应浏览器窗口大小的解决方法
iframe宽高度自适应浏览器窗口大小的解决方法
by:授客 QQ:1033553122
- 1. 测试环境
JQuery-3.2.1.min.js
下载地址:
https://gitee.com/ishouke/front_end_plugin/blob/master/jquery-3.2.1.min.js
Bootstrap-3.3.7-dist
下载地址:
https://gitee.com/ishouke/front_end_plugin/blob/master/bootstrap-3.3.7.zip
win7
- 2. 需求场景1
实现需求:如下图,点击左侧的导航,打开对应tab页面,其中tab页面的内容为 iframe,这里希望iframe的高度和宽度,根据浏览器窗口大小变化而变化,同时页面内容过多,或者过宽时,出现iframe滚动条,其所在父页面不出现滚动条。
- 3. HTML代码片段
iframe页面所在父页面代码片段
<!DOCTYPE html>
略...
<body style="overflow: hidden;">
略...
说明:
这里设置style="overflow: hidden;" 作用在于隐藏父页面的滚动条;
添加<!DOCTYPE html>文档类型声明,避免相关高度属性可能取不到值的情况
iframe代码片段1
<div id="tabContent" class="tab-content">
<!--通过js获取 tab对应的页面内容-->
<div id="tab-content-80" role="tabpanel" class="tab-pane">
<iframe name="tabIframe" id="ifm80" src="/platform/page/resourceSetting.html" width="100%" frameborder="no"
border="0"
marginwidth="0"
marginheight="0"
scrolling="yes"
allowtransparency="yes"
onload="changeFrameHeight()">
</iframe>
</div>
<div id="tab-content-117" role="tabpanel" class="tab-pane active">
<iframe name="tabIframe" id="ifm117" src="/platform/page/roleSetting.html" width="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="yes" allowtransparency="yes" onload="changeFrameHeight()">
</iframe>
</div>
</div>
说明:
scrolling="auto" 设置用于自动判断是否出现滚动条。
width="100%" 设置用于控制iframe页面宽度根据浏览器宽度变化而变化
iframe代码片段2
基本同“iframe代码片段1”,只是给changeFrameHeight函数增加iframeID参数
<iframe name="tabIframe" id="ifm117" src="/platform/page/roleSetting.html" width="100%" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="yes" allowtransparency="yes" onload="changeFrameHeight('ifm117')">
</iframe>
JS代码片段1(批量更改所有tab页的iframe高度)
/**
* 设置tab标签对应的iframe页面高度
*/
function changeFrameHeight(){
var iframes = document.getElementsByName('tabIframe');
var contentContainer = $('#' + tabContentID); // 获取tab标签对应的页面div容器对象 // 可能会出现获取不到的情况
if (contentContainer.offset()) {
offsetTop = contentContainer.offset().top; //容器距离document顶部的距离
}
$.each(iframes, function(index, iframe){
var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
iframe.height = h - offsetTop; // 这里 offsetTop可以替换成一个比较合理的常量值
});
}
说明:
window.innerHeight 获取浏览器窗口的高度-去掉浏览器地址栏,书签栏的可视区域的高度,包括横向滚动条的高度。
document.documentElement.clientHeight - 获取文档html根节点的高度,不包括横向滚动条的高度,其值等于window.innerHeight - 横向滚动条高度(如果有的话),否则等于window.innerHeight
document.body.clientHeight 获取body节点的的高度,不包括横向滚动条的高度。实践中发现document.body.clientHeight略大于document.documentElement.clientHeight和window.innerHeight 5px。
/**
* 浏览器窗口大小发生变化时,自动调整iframe页面高度
* 浏览器等因素导致改变浏览器窗口大小时,会发生多次resize事件,导致频繁调用changeFrameHeight()
*/
$(function(){
var resizeTimer = null;
window.onresize=function(){
if (resizeTimer) {
clearTimeout(resizeTimer); // 取消上次的延迟事件
}
resizeTimer = setTimeout('changeFrameHeight()', 500); // //延迟500毫秒执行 changeFrameHeight方法
}
});
说明:
window.onresize=“resize事件发生时执行的 JavaScript”,以上代码也可以使用JQuery的$(window).resize(function)等效实现。
当调整浏览器窗口的大小时,发生 resize 事件。 $(window).resize(function)指定了当发生 resize 事件时运行的函数function
$(window).resize(function(){
var resizeTimer = null;
if (resizeTimer) {
clearTimeout(resizeTimer); // 取消上次的延迟事件
}
resizeTimer = setTimeout('changeFrameHeight()', 500); // //延迟500毫秒执行 changeFrameHeight方法
});
js片段代码2(只更新当前tab页的iframe高度)
/**
* 设置tab标签对应的iframe页面高度
*/
function changeFrameHeight(ifmID){
var contentContainer = $('#' + tabContentID); // 获取tab标签对应的页面div容器对象 // 可能会出现获取不到的情况
var offsetTop = 0;
if (contentContainer.offset()) {
offsetTop = contentContainer.offset().top; //容器距离document顶部的距离
}
var ifm = document.getElementById(ifmID);
var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
ifm.height = h - offsetTop; // 这里 offsetTop可以替换成一个比较合理的常量值
}
$(function(){
window.onresize=function(){
var resizeTimer = null;
if (resizeTimer) {
clearTimeout(resizeTimer); // 取消上次的延迟事件
}
var li_active = $("#"+ tabFatherElementID + " > li.active");
if (li_active.text().length) {
var iframeID = 'ifm' + li_active.attr('id').replace('tab-li-', '');
resizeTimer = setTimeout('changeFrameHeight("'+iframeID+'")', 500); // //延迟500毫秒执行 changeFrameHeight方法
}
}
});
- 4. 参考链接
http://www.runoob.com/js/js-window.html
https://www.w3cplus.com/javascript/offset-scroll-client.html
https://www.imooc.com/qadetail/109244?t=103342
http://www.w3school.com.cn/jquery/event_resize.asp
http://www.w3school.com.cn/jsref/event_onresize.asp
JQuery iframe宽高度自适应浏览器窗口大小的解决方法的更多相关文章
- iframe的高度自适应
http://www.cnblogs.com/snandy/p/3902337.html http://www.cnblogs.com/snandy/p/3900016.html Snandy Sto ...
- 同域iframe的高度自适应
引子 父页面里控制子页面 子页面里控制父页面 一.引子 我们先看一个示例,有两个页面,1.html通过iframe嵌入2.html,两个页面都是同域的 1.html <!DOCTYPE html ...
- ExtJS6 自适应浏览器窗口大小
ExtJS6官方文档推荐使用Ext.on.做一个小例子,创建一个Panel显示在页面上,使它的大小随浏览器变化,自适应浏览器窗口大小. html:增加一个css样式给Panel加上红色border. ...
- 跨域iframe的高度自适应
If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ...
- div中宽高度自适应文字换行居中问题解决
<html> <head> <meta charset="UTF-8"/> <title>div中宽高度自适应文字换行居中demo& ...
- extjs folder is lost解决方法 和 FineUI主题切换时 iframe内的内容主题不变的解决方法
错误原因:extjs包和FineUI版本不一致 或者是 webconfig配置中 没有设置为任何人可访问 解放方法下载和FineUI版本相同的extjs包就ok了 解决方法:FineUI主题切换时 ...
- jquery报.live() is not a function的解决方法
jquery报.live() is not a function的解决方法: jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(. ...
- js获取iframe和父级之间元素,方法、属,获取iframe的高度自适应iframe高度
摘自:http://blog.csdn.net/kongjiea/article/details/38870399 1.在父页面 获取iframe子页面的元素 (在同域的情况下 且在http://下测 ...
- jQuery easyui layout布局自适应浏览器大小(转)
首先解释一下标题的含义,当我们用jQuery easyui layout 进行布局的时候,可能会遇到这样一个问题,那就是当手工调整浏览器大小,或者最大化.还原窗口的时候,layout的某个区域不能填充 ...
随机推荐
- mysql-magic 从dump中获取MySQL的明文密码
项目地址: https://github.com/hc0d3r/mysql-magic 安装: git clone --recurse-submodules https://github.com/hc ...
- 【iOS翻译】App启动时的响应过程
Responding to the Launch of Your App Initialize your app’s data structures, prepare your app to run, ...
- mysql的MHA高可用
一.MHA简介 作者简介 松信嘉範: MySQL/Linux专家 2001年索尼公司入职 2001年开始使用oracle 2004年开始使用MySQL 2006年9月-2010年8月MySQL从事顾问 ...
- java开发问题两三事(1)
1. 场景描述 最近在工作中碰到的几个问题,有点坑,记录下,遇到相同或类似问题的朋友可以参考下. 2. 解决方案 2.1 Disconnected from the target VM idea控制台 ...
- weed3-1.hello world
Weed3 一个微型ORM框架(只有0.1Mb哦) 源码:https://github.com/noear/weed3 源码:https://gitee.com/noear/weed3 05年的时候开 ...
- WPF应用中对WindowsFormHost内容进行裁剪
问题1: WPF中在使用WindowsFormsHost调用WinFrom控件时,若在WindowsFormsHost上层添加了WPF控件,该控件不会显示出来. <Grid> <W ...
- Exceptionless应用--自定义插件
遇到的问题/需求 这里会把一些敏感的参数记录下来,我们需要屏蔽掉,如图 我们希望日志里面有当前登录用户的信息,如图: 处理方法 tip:这里用的是.net非.net core 第一个问题(屏蔽敏感参数 ...
- Eclipse如何重置窗口
https://jingyan.baidu.com/article/915fc41459585f51394b20c3.html 在Eclipse进行开发的时候,我们经常会由于这个窗口或者那个窗口没有打 ...
- 高维数据Lasso思路
海量数据的特征工程中, 如果数据特征维度达到几千乃至上万 常规的lasso很容易失效 这里介绍几种泛义lasso,是在实际数据处理中常用的 迭代与分块思路/分组的使用(有兴趣的同学可自行实践一下) 1 ...
- Centos7下oracle配置(详细)
一.硬件配置 CentOS7@VMware® Workstation 15 Pro,分配资源:CPU:2颗,内存:4GB,硬盘空间:30GB 二.软件准备 linux.x64_11gR2_datab ...