关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())

摘要:
最初,show()和hide()方法用于控制页面的显示和隐藏。切换到上一页时,滚动条将自动转到顶部,而不是下拉到的位置。Display=none将导致页面重新呈现。当display=block时,页面也将被重新加载。我们知道jquery中的显示、可见性、z索引以及显示和隐藏方法可以控制隐藏和显示。

引子:

在项目开发过程中,使用iframe嵌套不同的页面,通过菜单来控制页面的切换展示。最开始使用的是show()和hide()方法来控制页面的展示与隐藏,但是遇到嵌套的页面高度不固定,

当嵌套页面过高会出现滚动条,如果拉下滚动条到某个位置,然后切换页面,再切换到上个页面时滚动条就自动到顶部而不是在之前下拉到的位置,所以这就存在问题。

这里,自己简单写了一个示例页面来更好的说明一下这个问题:

关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())第1张                          关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())第2张

                      图1    下拉页面一的滚动条的展示情况                                                                                 图2    由页面一切换到页面二的展示情况

关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())第3张

                           图3    再由页面二切换到页面一的展示情况

另外,这里展示一下代码(这里没展示CSS样式的部分):

关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())第4张

这里,使用的是show和hide方法。

原因解释:

当从iframe1切换到iframe2时,在iframe1中会自动触发一个滚动到顶部的事件,所以scrollTop会被置为0,这样就无法记录之前的滚动条位置了。

而show方法的结果就是display:block,hide方法的结果就是display:none,display=none就会造成页面的重新渲染,当display=block页面也会重新加载,所以scrollTop的值一直都是0.

所以切换页面就相当于又重新刷新页面,所以滚动条就一直置顶不能停留在原来滚动的位置。

所以这里想研究一下什么样的隐藏和显示方式不会导致这种问题呢?

首先,我们先研究一下几种控制隐藏显示的方法,我们知道display、visibility、z-index以及jquery中的show和hide方法都可以控制隐藏和显示,哪他们有啥不同呢?

上面已经说明了jquery中的方法show和hide和display的关系。

 1、display:none——它不占据页面空间,其内部元素的高度取到的值为0,visibility:hidden——它虽然隐藏但仍然占据原来的空间,只是视觉上看不到,但其内部元素的高度值都可以取得到。

 2display:none ——会引起页面的重绘和回流visibility:hidden——只引起页面的重绘

(简单说明一下:回流需要改变dom的结构,而重绘的dom结构不会发生变化只是需要重新渲染,这里可以自行了解:https://blog.csdn.net/u014541501/article/details/80166815)

 通过上面的对比就可以明确只要不让iframe页面发生回流就不会导致滚动条自动刷新了。

通过更改上面的代码:

关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())第5张

就可以得到相要的效果(更改页面滚动条的位置还是保留之前的位置!)。

此外,还有一种方式,z-index——控制层级顺序的属性

z-index属性用于指定元素的堆叠顺序,说明一下z-index并不是控制元素显示和隐藏的属性,这里使用它是利用控制层级顺序可以得到不同的展示页面,

所以z-index不会产生回流和重绘问题,所以使用z-index控制页面展示顺序也不会导致iframe页面的重新加载,所以滚动条位置也就不会自动更新了。

总结:使用visibility和z-index都可以解决滚动条自动重置的问题,但两者的实现原理不同。综合来看,visiblity的性能比display性能好些,可以优先使用visibility,但是具体情况还要根据需求具体分析!

欢迎大家批评指正和交流~~~~

免责声明:文章转载自《关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CAM350测量四叶草默认启动设置方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WordPress快速打造个人博客

前些天用wordpress搭建了现在这个博客,所以总结了一篇文章,讲讲怎么样简单的创建一个博客。开始前这里有篇我搭建时所遇到的问题可以作为参考《WordPress建站注意事项》,首先我们要下载WordPress压缩包(这个建议到官网上下最新的保险些:https://cn.wordpress.org/),下载下来是长这个样子的   ,   之后我们要通过 “...

javascript“数组”的常用方法---以及冒泡排序

首先,数组是数据的集合。 可以通过构造函数(var arr = new Array('0','1','hello'))和字面量(var arr = ['0','1'])的方式来创建, 需要注意的是,构造函数创建时,如果值只有一个,而且还是数字,那么他代表数组的长度(var arr = new Array(5),创建一个长度为5的数组)。 数组的索引是从0开...

[转]11个在线编码大赛,与全球程序员PK

From : http://news.cnblogs.com/n/187196/   英文原文:10 Online Coding Contests For Programmers!      如果你拥有出色的编码技能,或者虽然你只是名初学者,但你愿意去锻炼自己的编码能力,愿意去和顶尖的编码者进行 PK,那么这篇文章就是为你而准备的。本文提供了 11 个在线...

ViewState的用法

学习标签: ViewState 本文导读:在web窗体控件设置为runat = "server",这个控件会被附加一个隐藏的属性_ViewState,_ViewState存放了所有控件在ViewState中的状态值。ViewState是一个名称/值的对象集合。当请求某个页面时,ASP.NET会把所有控件的状态序列化成一个字符串,然后作为窗体的隐藏属性送到...

iOS 开发中常见的错误日志处理

Outline如何获得crash日志如何解析crash日志如何分析crash日志     1. iOS策略相关     2. 常见错误标识     3. 代码bug一、如何获得crash日志当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上。这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例...

解决css设置背景透明,文字不透明

设置元素的透明度:  -moz-opacity:0.8; /*在Firefox中设置元素透明度  filter: alpha(opacity=80); /*ie使用滤镜设置透明   但是当我们对一个标签设置背景的透明度时,往往我们并不希望该标签上的文字图片也变成半透明了。   例如:  <div><p>不透明</p>&l...