iframe子页面position的fixed
前言:
首先说一说我昨天天的苦逼经历。中午吃饭时一同事跟我说,他做的项目嵌套iframe后,子页面的position设置fixed失效了。
经过反复询问,得知他用了两层iframe,再加上最外的父页面,一共就是三层。
下午就其iframe子页面固定定位问题进行处理,上网找了各种解决方案:插件、js模拟等效果均不理想。页面不是代码过多就是效果卡顿、跳动(附:博主的同事架构的页面是用于手机微信端,部分PC端的优秀代码并不适用,非代码不行)。无奈之下只得另想出路,最终功能完美实现,现拿出来与大家共享。
BUG:
现有父页面A,子页面B,B页面制作了一个底部菜单,设置position:fixed;bottion:0;单独打开子页面B,底部菜单始终定位底部,不随页面滚动条滚动。在父页面A中,采用iframe映入页面B,google浏览器打开父页面A,菜单可以定位底部
;google浏览器手机调试模式打开父页面A,菜单可以定位底部
;Android手机微信打开父页面A,菜单可以定位底部
;iPhone手机微信打开父页面A,菜单未定位在页面底部
,而是始终位于B页面内容的末尾
。
看到这,博主心都碎了,平时比垃圾还垃圾的Android,今天这么给力,倒是平时牛皮哄哄的iPhone,今天使出了这么大一个绊子。没办法,应下来的事,还要想办法改呀……
iframe原理:
我们首先准备一枝笔及一张A4白纸,这只笔就好比我们的父页面,白纸好比子页面。固定住笔并将白纸放于笔下,来回拖动白纸。无论我们怎么拖动,白纸的高度始终都是A4纸张的高度。所以,相对底部的菜单,就永远在子页面的底部。
那么,,,如果我们把A4白纸卷起来呢?这时子页面的高度就不再是A4白纸的高度了,由于底部菜单是定位在子页面的相对底部,这时底部菜单就位于了A4白纸折叠后高度的最底。
那么,所谓的卷起A4纸,其实就等于给子页面B一个新的高度,超出部分,用滚动条滚动显示。
解决方案:
知道了导致问题的原因,接下来就是解决了。
博主的小demo父页面很简单,就是最基本的iframe加载页面
- <style>
- html,body,iframe{margin:0px;padding:0px;border:0px;width:100%;height:100%;}
- #navbar{background:url(http://www.yxccc.com/logo.png) no-repeat left center;}
- </style>
- <iframe src="demo.html" scrolling="No"></iframe>
子页面被撑起的是一个class为bottom的div
- <style>
- .content{
- <span style="white-space:pre"> </span>overflow:auto;//滚动条就靠它了
- <span style="white-space:pre"> </span>width: 100%;
- <span style="white-space:pre"> </span>position: absolute;
- }
- .bottom{
- <span style="white-space:pre"> </span>position: fixed;
- <span style="white-space:pre"> </span>bottom: 0px;
- <span style="white-space:pre"> </span>width: 100%;
- <span style="white-space:pre"> </span>height: 40px;
- <span style="white-space:pre"> </span>line-height: 40px;
- <span style="white-space:pre"> </span>text-align: center;
- <span style="white-space:pre"> </span>background-color:#eee;
- <span style="white-space:pre"> </span>color: #fff;
- <span style="white-space:pre"> </span>font-size: 14px;
- <span style="white-space:pre"> </span>z-index: 99;
- }
- </style>
- <pre name="code" class="html"><body>
- <div class="content">
- <div>撑起高度的div</div>
- <div class="bottom">菜单</div>
- </div>
- </body>
撑起页面的代码,读者可自行添加
接下来就是两段很关键的js方法了
- /**滚动条高**/
- function getWindowScrollTop(win){
- var scrollTop=0;
- if(win.document.documentElement&&win.document.documentElement.scrollTop){
- scrollTop=win.document.documentElement.scrollTop;
- }else if(win.document.body){
- scrollTop=win.document.body.scrollTop;}return scrollTop;
- }
- return scrollTop;
- }
- /**获取**/
- function getWindowHeight(win){
- var clientHeight=0;
- if(win.document.body.clientHeight&&win.document.documentElement.clientHeight){
- clientHeight = (win.document.body.clientHeight<win.document.documentElement.clientHeight)?win.document.body.clientHeight:win.document.documentElement.clientHeight;
- }else{
- clientHeight = (win.document.body.clientHeight>win.document.documentElement.clientHeight)?win.document.body.clientHeight:win.document.documentElement.clientHeight;
- }
- return clientHeight;
- }
最后为子页面附上高度,,使其滚动条显露出来
- $(function(){
- var H = parseInt(getWindowHeight(top))+parseInt(getWindowScrollTop(top)) - 40;//此处的40是class为bottom的div元素高
- $(".content").css("height",H + "px");
- });
倒入jq插件,至此页面无论在iphone或android,底部的菜单定位问题都得到了完美解决。代码简单好用,博主表示很开心
iframe子页面position的fixed的更多相关文章
- 获取iframe子页面内容高度给iframe动态设置高度
<!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <meta nam ...
- 父子页面之间元素相互操作(iframe子页面)
js/jquery获取iframe子页面中元素的方法: 一.使用window.frames["iframe的ID"]获取元素 window.onload = function() ...
- js之iframe子页面与父页面通信
iframe子页面与父页面通信根据iframe中src属性是同域链接还是跨域链接,通信方式也不同. 一.同域下父子页面的通信 父页面parent.html <html> <head& ...
- Js动态获取iframe子页面的高度////////////////////////zzzz
Js动态获取iframe子页面的高度 Js动态获取iframe子页面的高度总结 问题的缘由 产品有个评论列表引用的是个iframe,高度不固定于是引发这个总结. 方法1:父级页面获取子级页面的高度 ...
- jquery读取iframe子页面和父页面的处理
1. jquery 在iframe子页面获取父页面元素代码如下: $("#objid", parent.document) 2. jquery在父页面 获取iframe子页面的元素 ...
- iframe子页面调用父页面javascript函数的方法
1.iframe子页面调用 父页面js函数 子页面调用父页面函数只需要写上window.parent就可以了.比如调用a()函数,就写成: window.parent.a(); 2.iframe父页面 ...
- js 在iframe子页面获取父页面元素,或在父页面 获取iframe子页面的元素的几种方式
用JS或jquery访问页面内的iframe,兼容IE/FF 注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.html 文件内含有一个iframe: XML/HTML代码 ...
- CRM 2016 IFrame 子页面执行 父页面函数
CRM 中定义以下函数: windows.parent.functionname(){ //do somethion } IFrame 子页面调用 JS: windows.parent.functio ...
- iframe父页面获取iframe子页面的元素 与 iframe子页面获取父页面元素
一.在iframe子页面获取父页面元素代码如下:$('#objld', parent.document); 二.在父页面获取iframe子页面的元素代码如下:$("#objid", ...
随机推荐
- vux UI 项目国际化
第一步必须装 vux vux-loader vuex 和vuex-i18n npm i vux-loader -D npm i vuex vux vuex-i18n -S 安装完成需要配置webpac ...
- Node.js框架之Egg.js
Node.js是我前段时间接触的一个JavaScript的服务端语言,感觉还是挺有意思的. 也许有人说,你学这么多,学的过来吗?或者说学的太多,专而不精,有必要这样吗? 其实,我个人认为,自从我进入I ...
- smtp outlook邮件发送非授权码模式
1.起因:send fail SMTP AUTH extension not supported by server. 使用端口25 和587均失效出现此问题 首先前往outlook修改设置pop和I ...
- P1004 方格取数
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
- apue2e unp安装
最近在读 Richard Stevens 的大作<UNIX环境高级编程>,相信很多初读此书的人都会与我一样遇到这个问题,编译书中的程序实例时会出现问题,提示 “错误:apue.h:没有那个 ...
- 设计一个分布式RPC框架
0 前言 提前先祝大家春节快乐!好了,先简单聊聊. 我从事的是大数据开发相关的工作,主要负责的是大数据计算这块的内容.最近Hive集群跑任务总是会出现Thrift连接HS2相关问题,研究了解了下内部原 ...
- plsql developer连接oracle 12.2报错 ora-28040 No matching authentication protocol
使用plsql连接时,发现报ora-28040 No matching authentication protocol 赶紧查了查MOS,原来在默认情况下Oracle12.2对客户端版本有限制, 解决 ...
- 根据location地址,在导航栏高亮显示当前页面
获取当前页面的地址栏.与导航栏中所有<a> 标签的href属性 进行比较.如果相等则高亮显示 此<a>标签. 注意点:a 标签的href 属性在浏览器解析时 是绝对路径. a ...
- Dataguard学习笔记
主库和备库之间的redo log传递,可以通过如下方式实现: 在主库端: log_archive_dest_1='主库本地路径' log_archive_dest_2='备库的net service名 ...
- PPAS可以安装分区表
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackg ...