Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

移动Web开发实践——解决position:fixed自适应BUG #11

Closed
maxzhang opened this issue Dec 17, 2013 · 31 comments
Closed

移动Web开发实践——解决position:fixed自适应BUG #11

maxzhang opened this issue Dec 17, 2013 · 31 comments

Comments

@maxzhang
Copy link
Owner

移动Web开发实践——解决position:fixed自适应BUG

在移动web中使用position:fixed,会踩到很多坑,在我之前的一篇文章《移动端web页面使用position:fixed问题总结》中已经总结了很多bug,但是在后续的开发中有关fixed的未知bug越来越多,我也在尽量的寻找解决方案。

这篇文章就来先解决一个坑,fixed元素的宽度自适应。

当横屏时,fixed元素不能自适应横屏的宽度,bug表现如下:

fixed-bug-1

fixed-bug-2

这个bug主要在android自带浏览器下出现,与手机型号和系统版本无关,几乎所有android都无法幸免,在不同的手机下可能表现会有一点点差异,但都是同样的bug。

导致bug的原因我不清楚,如有高人请指点。

下面这个解决方案在12款主流手机上测试通过(三星、小米、魅族、华为、中心等),如果还未完全解决可以回复这篇文章。

解决问题的关键就是:fixed元素内部必须嵌套一个position:absolute元素,用来装载内容,目的就是为了让内容脱离fixed文档流,屏蔽一些fixed的坑

别问我为什么,我也不知道为什么,但是这样写竟然神奇的好使了,如有高人请指点迷津。

我在下面的例子中声明了两种最常用的fixed元素:header和footer

position fixed header

header中我使用了float来定位左右两边的icon。右侧icon一定不能使用position:absolute定位,如果使用了absolute,在一些android自带浏览器下横屏时,右侧icon无法自适应到右侧,会出现与上面第二幅图中差不多的bug。

<header>
    <div class="fixed">
        <div class="wrap float">
            <div class="left-icon">
                <span class="glyphicon glyphicon-chevron-left"></span>
            </div>
            <h1>HEADER</h1>
            <div class="right-icon">
                <span class="glyphicon glyphicon-calendar"></span><span class="glyphicon glyphicon-list"></span>
            </div>
        </div>
    </div>
</header>

position fixed footer

footer中是一个flex的布局,'display:flex'容器一定不要直接声明到fixed元素下,必须使用'position:absolute'容器包装一层。

<footer>
    <div class="fixed">
        <div class="wrap flex">
            <a href="#"><span class="glyphicon glyphicon-picture"></span></a>
            <a href="#"><span class="glyphicon glyphicon-film"></span></a>
            <a href="#"><span class="glyphicon glyphicon-qrcode"></span></a>
        </div>
    </div>
</footer>

解决方案DEMO:http://jsbin.com/omaCOSir/latest

题外话

一个placeholder自适应bug,页面中使用<input>标签并且有属性placeholder,在页面横屏再转回竖屏时,会导致页面无法自适应,无论是android还是ios都会中招。

解决方法是,在<input>外层容器中加overflow:hidden,这个bug我没有截图,大家可以自测。

@hkongm
Copy link

hkongm commented Dec 20, 2013

也用fixed,没遇到这样,坐标问题倒是经常遇到,QQ浏览器

@maxzhang
Copy link
Owner Author

@hkongm 大概是什么样的坐标问题呢?

@junjunhuahua
Copy link

使用-webkit-transform也会影响到fixed的定位,我是在做侧边栏滑出效果的时候发现这个bug的,-webkit-transform动过以后,fixed就不再fixed了。

@maxzhang
Copy link
Owner Author

maxzhang commented Jan 6, 2014

@junjunhuahua 可以大致形容下,看看我能不能帮你解决。

@junjunhuahua
Copy link

@maxzhang 就比如我的header是fixed在顶上的,我做了一个抽屉式的滑出效果,是用-webkit-transform实现的,等抽屉展开再收回的时候,header就不再固定了,没有fixed的效果了,然后我改用left去实现这个效果,就没有这个问题,这个估计也是ios下的bug。

@maxzhang
Copy link
Owner Author

maxzhang commented Jan 6, 2014

@junjunhuahua iOS下fixed的问题异常明显,从iOS5一直到7都没有任何改善。基本表现就是,client width or height 改变时,比如软键盘收起时,fixed元素定位就会异常。

@junjunhuahua
Copy link

@maxzhang 嗯,键盘的问题我也遇到过。移动web现在坑太多了,遇到了很多比IE6还坑爹的bug。

@rentj1
Copy link

rentj1 commented Jan 15, 2014

使用position fixed header 时在移动浏览器下scrollbar会盖到header上,想把它隐藏也隐藏不掉,楼主有什么方法解决吗

@maxzhang
Copy link
Owner Author

@rentj1 无解。scrollbar在没有滚动动作时,会自动隐藏吧

@rentj1
Copy link

rentj1 commented Jan 16, 2014

@maxzhang 嗯,看来只有让客户端去隐藏webview的滚动条了

@hkongm
Copy link

hkongm commented Jan 18, 2014

呃,坐标就是maxzhang另一篇文章提到的,貌似真的没什么好办法。
IOS SAFARI极少让人失望的点。。。
请教软键盘的出现和收起,不知道有没有事件?focus和blur不够通用,而且也不是很准啊

@rentj1
Copy link

rentj1 commented Feb 7, 2014

@hkongm 软键盘的出现和收起可以监听 window.onresize事件

@maxzhang
Copy link
Owner Author

maxzhang commented Feb 8, 2014

@hkongm Android上onresize也不靠谱啊

@hkongm
Copy link

hkongm commented Feb 8, 2014

resize。。。也算hack了。。。如果里面有DOM重绘的话,性能又是问题,唉

@deiphi
Copy link

deiphi commented Mar 12, 2014

请问博主,DEMO:http://jsbin.com/omaCOSir/latest 是否解决了IOS5-7下fixed的问题?

@maxzhang
Copy link
Owner Author

@deiphi iOS是的fixed是个无法调和的问题,暂时无法解决。如果你有好的解决方案,可以跟我分享,谢谢!

@wjhcc2018
Copy link

请问博主 有遇到这种情况吗?就是有个遮罩层 position:fixed,z-index:2;有个div position:relative;z-index:5;在QQ浏览器下,一开始还正常,但是操作几次 遮罩层 就把div给覆盖了

@maxzhang
Copy link
Owner Author

@say-hello 有遇到过,在某些特定的 浏览器 和Andorid2.2-2.3环境下,比如note1,position:fixed会将 position:absolute 覆盖掉,z-index会失效。

@kpbiao
Copy link

kpbiao commented Jul 31, 2014

这个到没有遇到,兼容性问题有没有好的方案解决?

@lzxb
Copy link

lzxb commented Aug 12, 2014

这是神马社区是中国人的网站?

@song7788q
Copy link

@deiphi 你把fixed里面放个input或者textarea试试看,应该就出问题了!

@Megasu
Copy link

Megasu commented Mar 11, 2015

@maxzhang 请问一下楼主采用了新旧flex语法混合,是移动端flex兼容最佳的解决方案吗?

flex一共有3次修订,楼主在使用flex的时候移动端的兼容如何?
(PS:公司没有太多机器做测试,前辈项目PV大,踩过的坑希望能分享下,把demo写写备注更好。)

    display: -webkit-box;      /* OLD - iOS 6-, Safari 3.1-6 */
    display: -moz-box;         /* OLD - Firefox 19- (buggy but mostly works) */
    display: -ms-flexbox;      /* TWEENER - IE 10 */
    display: -webkit-flex;     /* NEW - Chrome */
    display: flex;             /* NEW, Spec - Opera 12.1, Firefox 20+ */

@tarymee
Copy link

tarymee commented Feb 23, 2016

mark

@small-carbon
Copy link

DEMO:http://jsbin.com/omaCOSir/latest 如果嵌套在iframe里面,底部发fixed不会不失效

@bytemofan
Copy link

m

@cyh41
Copy link

cyh41 commented Oct 18, 2016

这个解决方案,加个input就炸了。

@keer3
Copy link

keer3 commented Sep 18, 2017

safari 浏览器 ios10 手机版本

遇到带输入框fixed,输入框focus时,弹起软键盘,页面滚动到底部,fixed失效随页面滚动。
有什么解决办法吗?

@zigufeiyu
Copy link

求解: fixed吸底按钮在页面快速滑动时闪烁的原因

1 similar comment
@wangmiaoduan
Copy link

求解: fixed吸底按钮在页面快速滑动时闪烁的原因

@MapleShaw
Copy link

@maqing01 给需要 fixed 定位的元素加上样式:transform: translate3d(0, 0, 0); 或者 transform: translateZ(0);

@haiting
Copy link

haiting commented Apr 10, 2019

我是头部的设置一个div,让这个div:postion:fiexd,这个自适应到手机端就失效了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests