一、IOS自带safari浏览器
1、safari不支持fixed、input输入框
iOS下的 Fixed + Input 调用键盘的时候fixed无效问题
拖动页面时 header 和 footer 已经定位在了对应的位置,目测没问题了
但接下来问题就来了!如果底部输入框软键盘被唤起以后,再次滑动页面,就会看到如下图所示:
我们看到 fixed 定位好的元素跟随页面滚动了起来… fixed 属性失效了!
这是为什么呢?简单解释下: > 软键盘唤起后,页面的 fixed 元素将失效(即无法浮动,也可以理解为变成了 absolute 定位),所以当页面超过一屏且滚动时,失效的 fixed 元素就会跟随滚动了。
这便是 iOS 上 fixed 元素和输入框的 bug 。其中不仅限于 type=text 的输入框,凡是软键盘(比如时间日期选择、select 选择等等)被唤起,都会遇到同样地问题。
虽然 isScroll.js 可以很好的解决 fixed 定位滚动的问题,但是不在万不得已的情况下,我们尽量尝试一下不依赖第三方库的布局方案,以简化实现方式。这里抛砖引玉作为参考。
解决思路
既然在 iOS 下由于软键盘唤出后,页面 fixed 元素会失效,导致跟随页面一起滚动,那么假如——页面不会过长出现滚动,那么即便 fixed 元素失效,也无法跟随页面滚动,也就不会出现上面的问题了。
那么按照这个思路,如果使 fixed 元素的父级不出现滚动,而将原 body 滚动的区域域移到 main 内部,而 header 和 footer 的样式不变,代码如下:
1 <body class="layout-scroll-fixed"> 2 <!-- fixed定位的头部 (absolute绝对定位也可以)--> 3 <header> 4 5 </header> 6 7 <!-- 可以滚动的区域 --> 8 <main> 9 <div class="content"> 10 <!-- 内容在这里... --> 11 </div> 12 </main> 13 14 <!-- fixed定位的底部 (absolute绝对定位也可以)--> 15 <footer> 16 <input type="text" placeholder="Footer..."/> 17 <button class="submit">提交</button> 18 </footer> 19 </body> 20 header, footer, main { 21 display: block; 22 } 23 24 header { 25 position: fixed;//或者absolute 26 height: 50px; 27 left: 0; 28 right: 0; 29 top: 0; 30 } 31 32 footer { 33 position: fixed;//或者写成absolute 34 height: 34px; 35 left: 0; 36 right: 0; 37 bottom: 0; 38 } 39 40 main { 41 /* main绝对定位,进行内部滚动 */ 42 position: absolute; 43 top: 50px; 44 bottom: 34px; 45 /* 使之可以滚动 */ 46 overflow-y: scroll; 47 /* 增加该属性,可以增加弹性,是滑动更加顺畅 */ 48 -webkit-overflow-scrolling: touch; 49 } 50 51 main .content { 52 height: 2000px; 53 }