js,css三种方法解决IE6下position:fixed的Bug以及闪动问题
2013-04-23 11:41
1041 查看
IE6下position:fixed的Bug应该是个老问题。不过,今天在搞瀑布流插件写返回顶部按钮时(老是闪动)却花了我不少时间,之前也写过一篇文章解决过,但是是用到css表达式解决,而现在的需求是要在js中动态定位,所以之前的办法不是很合适。今天再来总结一下:
方法一:纯css
原理:你拖动的滚动条并不是拖动的整个页面,而仅是body的滚动条
优点:视觉效果完美,代码量少,不耗性能
缺点:不会触发onscroll事件(因为html没有滚动),可能会影响一些js组件; fixed定位层必须是基于body层定位的。
方法二:css + expression
完美解决IE6下position:fixed的Bug;以及闪动问题
原理:ie6使用绝对定位,利用css表达式计算相应的值
优点:视觉效果完美,兼容性强
缺点:相对比较耗性能,不够灵活,而且你可能会遇到这样的Bug(点击查看)
方法三:js
View Code
原理:原理同上,动态设置expression,如果直接在onscroll事件里设置定位层的top,left,bottom,right,定位层会出现闪动;
优点:动态控制定位层的位置
缺点:还是使用了css表达式
方法四:舍弃IE6
原理:Bug之来源,应该淘汰
优点:彻底根除Bug
缺点:暂无
扩展:离奇解决
http://bbs.blueidea.com/thread-2938030-1-1.html
原理:没搞懂,推测跟浏览器的重绘[repaints]与重排[reflows]有关
如果读者还有其他更好的方法,希望能够分享一下,欢迎加入web前端交流群(75701468) 分享您我的经验.
方法一:纯css
*html{height:100%;overflow:hidden;} *html body{height:100%;overflow:auto;}
原理:你拖动的滚动条并不是拖动的整个页面,而仅是body的滚动条
优点:视觉效果完美,代码量少,不耗性能
缺点:不会触发onscroll事件(因为html没有滚动),可能会影响一些js组件; fixed定位层必须是基于body层定位的。
方法二:css + expression
完美解决IE6下position:fixed的Bug;以及闪动问题
原理:ie6使用绝对定位,利用css表达式计算相应的值
优点:视觉效果完美,兼容性强
缺点:相对比较耗性能,不够灵活,而且你可能会遇到这样的Bug(点击查看)
方法三:js
View Code
// usage: // fixedPosition(elem, {top:0, left:0}); // fixedPosition(elem, {bottom:0, right:0}); var fixedPosition = function(){ var html = document.getElementsByTagName('html')[0], dd = document.documentElement, db = document.body, doc = dd || db; // 给IE6 fixed 提供一个"不抖动的环境" // 只需要 html 与 body 标签其一使用背景静止定位即可让IE6下滚动条拖动元素也不会抖动 // 注意:IE6如果 body 已经设置了背景图像静止定位后还给 html 标签设置会让 body 设置的背景静止(fixed)失效 if (isIE6 && db.currentStyle.backgroundAttachment !== 'fixed') { html.style.backgroundImage = 'url(about:blank)'; html.style.backgroundAttachment = 'fixed'; }; // pos = {top:0, right:0, bottom:0, left:0} return isIE6 ? function(elem, pos){ var style = elem.style, dom = '(document.documentElement || document.body)'; if(typeof pos.left !== 'number'){ pos.left = doc.clientWidth - pos.right - elem.offsetWidth; } if(typeof pos.top !== 'number'){ pos.top = doc.clientHeight - pos.bottom - elem.offsetHeight; } elem.style.position = 'absolute'; style.removeExpression('left'); style.removeExpression('top'); style.setExpression('left', 'eval(' + dom + '.scrollLeft + ' + pos.left + ') + "px"'); style.setExpression('top', 'eval(' + dom + '.scrollTop + ' + pos.top + ') + "px"'); } : function(elem, pos){ var style = elem.style; style.position = 'fixed'; if(typeof pos.left === 'number'){ style.left = pos.left + 'px'; }else{ style.left = 'auto'; style.right = pos.right + 'px'; } if(typeof pos.top === 'number'){ style.top = pos.top + 'px'; }else{ style.top = 'auto'; style.bottom = pos.bottom + 'px'; } }; }();
原理:原理同上,动态设置expression,如果直接在onscroll事件里设置定位层的top,left,bottom,right,定位层会出现闪动;
优点:动态控制定位层的位置
缺点:还是使用了css表达式
方法四:舍弃IE6
原理:Bug之来源,应该淘汰
优点:彻底根除Bug
缺点:暂无
扩展:离奇解决
http://bbs.blueidea.com/thread-2938030-1-1.html
原理:没搞懂,推测跟浏览器的重绘[repaints]与重排[reflows]有关
如果读者还有其他更好的方法,希望能够分享一下,欢迎加入web前端交流群(75701468) 分享您我的经验.
相关文章推荐
- 完美解决IE6下position:fixed的Bug;以及闪动问题
- css解决IE6、Chrome、ff 浏览器position:fixed;和闪动问题
- 五行代码终极完美解决从IE6到Chrome所有浏览器的position:fixed;以及闪动问题
- ie6 fixed bug的解决方法 (css+js)
- 五行代码终极完美解决从IE6到Chrome所有浏览器的position:fixed;以及闪动问题
- 五行代码终极完美解决从IE6到Chrome所有浏览器的position:fixed;以及闪动问题
- 【技术】ie6,ie7,ie8 css bug汇总以及兼容解决方法
- 解决 ie6 fixed bug (css+js)
- IE6,IE7,IE8 css bug汇总以及兼容解决方法
- ie6,ie7,ie8 css bug汇总以及兼容解决方法
- CSS表达式(expression)解决IE6 position:fixed无效问题
- IE6,IE7,IE8 css bug搜集及浏览器兼容性问题解决方法汇总
- js完美解决IE6不支持position:fixed的bug
- IE6,IE7,IE8 css bug搜集及浏览器兼容性问题解决方法汇总
- 实现 IE6 下支持 position-fixed 的 CSS 属性并解决“振动”的问题
- ie6,ie7,ie8 css bug汇总以及兼容解决方法
- csshover.htc 以及简单使用方法(解决IE6下 :hover 在其他标签下无效问题)
- 解决IE6下PNG图片背景不透明的三种方法(CSS/JS/JQuery)
- ie6,ie7,ie8 css bug汇总以及兼容解决方法 - xhuangtao
- 解决 IE6 不支持绝对定位 fixed 以及IE6下被绝对定位的元素在滚动的时候会闪动的问题