移动端设置fixed布局的问题解决

时间:2024-05-22 23:33:20

最近写移动端,遇到一个问题就是用fixed属性布局的时候由于手机的原因会出现很多问题,比如说手机端底部固定一块,然后里面有输入框,(类似于手机QQ或者微信底部的输入框一样的布局)这个时候在调用软键盘的时候会出现软键盘遮挡输入框的情况,如图

移动端设置fixed布局的问题解决这是正常的情况下,下面是唤起软键盘的图片

移动端设置fixed布局的问题解决很明显挡住了一半的输入框,这个时候可以用以下方式解决(在这里要感谢叶小钗的博客,是从他那里学来的)

虚拟键盘导致fixed元素错位

fixed元素一定会伴随虚拟键盘的出现,但是虚拟键盘只是“贴”在了viewport上,表面上不会对dom产生“任何”影响,但是这个时候fixed元素表现却变得怪异起来,会错位。

应用层面解决问题方案是,虚拟键盘弹出时将fixed元素设置为static,虚拟键盘消失时候设置回来。

由于虚拟键盘出现并未抛出事件,而检测scroll或者resize事件,皆会有一定延迟,会出现闪烁现象,所以现有最好的方案是setinterval定时器监控当前获取焦点元素是否为文本元素,若是是的话便需要处理,如此便可解决fixed元素错误问题。

fixed元素滑动惯性平滑度

我们常常遇到这种产品需求,tab标签栏开始固定,当滚动向下超过该标签栏后便会变成fixed元素,一直出现在头部,这样的需求在电脑上没有问题,但是在iPhone5s以下的手机常常会出现小范围错位或者快速移动大范围错位的问题。

这个时候我们可以引起reflow迫使浏览器重绘以解决这个问题,这里推荐一个奇怪的hack写法:同时设置三个image元素的src属性,便可以全范围解决该难题,  该方案被团队证实并得到应用。

//三图片src,引发reflow,处理fixed方案惯性问题

var el = this.els.ctlc.find('img');

$(el[0]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

$(el[1]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

$(el[2]).attr("src", 'http://res.m.ctrip.com/html5/Content/images/144.png');

另外,上图中的tab标签下面的蓝线具有动画,但是在小米或者三星手机上可能不会移动,这个时候也可以动态引起reflow解决这个BUG。

其它

l  CSS选择器尽量使用id与class,避免过度层叠

l  避免使用数值,比如:border: none不会引起渲染,而boder: 0会

l  动画时候让元素脱离文档流,以免导致大量reflow

l  避免逐条修改DOM样式,改以className实现同样功能

l  操作DOM时将display设置为none,因为这种元素不会影响渲染,或者操作fragment对象取代操作显示在页面上的DOM

l  避免将获取DOM样式属性的操作写在循环中,可能引起重复reflow

以上解决了使用fixed后产生的遮挡和平滑滑动的问题。亲测有效!