惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Blog — PlanetScale
Blog — PlanetScale
Jina AI
Jina AI
MyScale Blog
MyScale Blog
N
Netflix TechBlog - Medium
月光博客
月光博客
云风的 BLOG
云风的 BLOG
T
The Blog of Author Tim Ferriss
博客园_首页
GbyAI
GbyAI
The Cloudflare Blog
博客园 - 叶小钗
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
量子位
博客园 - Franky
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
J
Java Code Geeks
腾讯CDC
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
S
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
Lohrmann on Cybersecurity
S
Securelist
F
Full Disclosure
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
The GitHub Blog
The GitHub Blog

北门清燕

🎙️ 科技热文播报 - 2026-03-14 【vscode扩展】apis-tester Notion工具人bot VPS橱窗 - 一个简单的哪吒面板主题 ios17.0可以安装Trollstore了 windows服务器安装mysql踩坑指北 为哪吒面板增加视频背景 继续折腾astro serv00部署FreshRSS 【原创】油猴脚本:哪吒VPS橱窗后台脚本 哪吒面板终极进化之VPS橱窗 哪吒面板default主题小鸡底部增加购买同款按钮 Typecho二开魔改简单指北 【原创】油猴脚本:论坛快捷回帖 简单米表:Typecho-Simple-Mibiao Windows 11 23H2更新遇到下载错误解决方法 Microsoft 365 E5开发者订阅管理员双重认证丢失解决方法 Virtualbox安装Ubuntu不完全指北 一剑开天门 将chrome谷歌浏览器轻松打造成rss阅读器 地震云 罗刹海市 关于笑果我觉得还是罗翔老师说的好 推荐正在玩的游戏:SimpleMMO,附游戏助手SMMOHelper 集成Elog使用notion数据库 【原创】ios捷径:法定工作日打卡提醒 测试AI 再次折腾hexo docker部署freshrss apifox自动导入apidoc接口数据 node项目部署到ftp vite项目使用tinymce插件axupimgs实现多图片上传 tomcat服务器上utf8编码的文件乱码解决方法 快捷指令:图床 七牛上传视频获取视频封面和缩略图 注销网站得慎重 【原创】ios捷径:捷径库 【原创】ios捷径:自动壁纸 【原创】ios捷径:倒班闹钟 idea找回执行git pull操作后,被覆盖的本地未提交的代码 altserver跳坑指北 吐一吐三丰云免费服务器 Microsoft Store中的应用软件如何备份数据 卖盘 利用frp实现微软远程桌面管理内网电脑之不完全指北 apicloud用tortoisesvn管理代码,实现按不同分支编译打包app vscode插件提示:command 'extension.updateSettings' not found解决方法 apicloud使用alipayplus支付宝支付模块注意事项 【原创】越狱插件安装注意事项 api.closeFrameGroup的一些注意事项 【原创】ios捷径:我的心愿单 【原创】ios捷径:一键获取urlscheme 【原创】ios捷径:一键签到 【原创】ios捷径:qq群一键签到 【原创】ios捷径:百度搜索风云榜2.1.0 【原创】ios捷径:一键天气预报 【原创】ios捷径:微博热搜榜2.0强势更新 ios捷径:bmqy捷径库 自定义IntelliJ IDEA配置和插件的存放目录,以方便同步idea配置 wordpress平台next主题 vscode本地调试asp ajaxFileUpload上传成功也执行error方法 更换回wordpress。。。 一键收取熊猫守护者威力值 vscode软件窗口标题栏显示文件完整路径 微信小程序“支付签名验证失败”问题的解决参考 “idea已连接上ftp但看不到文件”的解决办法 js格式化时间显示 js实现中文转换成拼音 生命不息,折腾不止之“hexo” echarts中tooltips自定义数据结构与样式 淘米辅助工具 聚名网辅助工具 仿站制作6 wordpress新添加页面显示评论 华为mate8(b584)root过程简要记录 asp解析json的方法 为子主题增加主题选项功能 自制chrome扩展:百度云分享链接一键登录 清燕的云集小店 Google play下载app状态栏进度显示异常的应对方法 吐槽百度翻译之离线翻译包 现在只有人民才是真正的为人民 吐槽腾讯大王卡 wordpress添加twentysixteen子主题 idea配置less自动编译 使用chrome浏览器调试移动端web页面 idea编译less并使用autoprefixer sublime自动编译less2css插件,保存时提示系统找不到指定文件 吐一吐中信的升白金 Android手机下输入框获取焦点时, 输入法挡住输入框bug的解决方法 wordpress头像不显示解决方法 用子主题functions.php添加自定义功能后访问网站报错解决方法 ueditor百度编辑器添加自定义模板并设为默认 仿站制作5 读老树画画随感 VMware-workstation 12 安装 Mac OS X 10.10 做梦想 再咏咳 webstorm10配置less编译环境
h5移动端ios输入法软键盘导致fixed布局bug的解决方案
bmqy · 2017-07-28 · via 北门清燕

移动端业务开发,iOS 下经常会有 fixed 元素和输入框(input 元素)同时存在的情况。 但是 fixed 元素在有软键盘唤起的情况下,会出现许多莫名其妙的问题。 这篇文章里就提供一个简单的有输入框情况下的 fixed 布局方案。


header>

text

    <main>            main>  
  
    <footer>        <input type="text" placeholder="Footer..."/>        <button class="submit">提交button>  
footer>  

body>` | | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

对应的样式如下:

| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | `header, footer, main {
display: block;
}

header {
position: fixed;
height: 50px;
left: 0;
right: 0;
top: 0;
}

footer {
position: fixed;
height: 34px;
left: 0;
right: 0;
bottom: 0;
}

main {
margin-top: 50px;
margin-bottom: 34px;
height: 2000px}` | | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

然后看起来就是下面这个样子。拖动页面时 header 和 footer 已经定位在了对应的位置,目测没问题了。

fixed.png

但接下来问题就来了!如果底部输入框软键盘被唤起以后,再次滑动页面,就会看到如下图所示:

fixed_bug_0.png
fixed_bug_1.png

我们看到 fixed 定位好的元素跟随页面滚动了起来… fixed 属性失效了!

这是为什么呢?简单解释下: > 软键盘唤起后,页面的 fixed 元素将失效(即无法浮动,也可以理解为变成了 absolute 定位),所以当页面超过一屏且滚动时,失效的 fixed 元素就会跟随滚动了。

这便是 iOS 上 fixed 元素和输入框的 bug 。其中不仅限于 type=text 的输入框,凡是软键盘(比如时间日期选择、select 选择等等)被唤起,都会遇到同样地问题。


虽然 isScroll.js 可以很好的解决 fixed 定位滚动的问题,但是不在万不得已的情况下,我们尽量尝试一下不依赖第三方库的布局方案,以简化实现方式。这里抛砖引玉作为参考。

解决思路:

既然在 iOS 下由于软键盘唤出后,页面 fixed 元素会失效,导致跟随页面一起滚动,那么 假如–页面不会过长出现滚动,那么即便 fixed 元素失效,也无法跟随页面滚动,也就不会出现上面的问题了

那么按照这个思路,如果使 fixed 元素的父级不出现滚动,而将原 body 滚动的区域域移到 main 内部,而 header 和 footer 的样式不变,代码如下:

| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | `


header>

text

    <main>        <div class="content">                div>  
main>  
  
    <footer>        <input type="text" placeholder="Footer..."/>        <button class="submit">提交button>  
footer>  

body>` | | ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | `header, footer, main {
display: block;
}

header {
position: fixed;
height: 50px;
left: 0;
right: 0;
top: 0;
}

footer {
position: fixed;
height: 34px;
left: 0;
right: 0;
bottom: 0;
}

main {
/* main绝对定位,进行内部滚动 / position: absolute;
top: 50px;
bottom: 34px;
/
使之可以滚动 */ overflow-y: scroll;
}

main .content {
height: 2000px;
}` | | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

这样再来看一下:

fixed_scroll_0.png

fixed定位

在原始输入法下, fixed 元素可以定位在页面的正确位置。滚动页面时,由于滚动的是 main 内部的 div,因此 footer 没有跟随页面滚动。

上面貌似解决了问题,但是如果在手机上实际测试一下,会发现 main 元素内的滚动非常不流畅,滑动的手指松开后,滚动立刻停止,失去了原本的流畅滚动特性。百度一下弹性滚动的问题,发现在 webkit 中,下面的属性可以恢复弹性滚动。 > -webkit-overflow-scrolling: touch;

在 main 元素上加上该属性,嗯,丝般顺滑的感觉又回来了!

| 1 2 3 4 5 6 7 8 9 10 | main { /* main绝对定位,进行内部滚动 */ position: absolute; top: 50px; bottom: 34px; /* 使之可以滚动 */ overflow-y: scroll; /* 增加该属性,可以增加弹性 */ -webkit-overflow-scrolling: touch; } | | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

另外,这里的 header 和 footer 使用的是 fixed 定位,如果考虑到更老一些的 iOS 系统不支持 fixed 元素,完全可以把 fixed 替换成 absolute 。测试后效果是一样的。

至此一个不依赖第三方库的 fixed 布局就完成了。


Android 下布局

谈到了 iOS ,也来简单说一下 Android 下的布局吧。

在 Android2.3+ 中,因为不支持 overflow-scrolling ,因此部分浏览器内滚动会有不流畅的卡顿。但是目前发现在 body 上的滚动还是很流畅的,因此使用第一种在 iOS 出现问题的 fixed 定位的布局就可以了。

如果需要考虑 Android2.3 以下系统,因为不支持 fixed 元素,所以依然要需要考虑使用 isScroll.js 来实现内部滚动。

其实在 fixed 和输入框的问题上,基本思路就是: > 由于 fixed 在软键盘唤起后会失效,导致在页面可以滚动时,会跟随页面一起滚动。因此如果页面无法滚动,那么 fixed 元素即使失效,也不会滚动,也就不会出现 bug 了。

所以可以在这个方面去考虑解决问题。


其他的一些细节处理

在细节处理上,其实还有很多要注意的,挑几个实际遇到比较大的问题来说一下:

  1. 有时候输入框 focus 以后,会出现软键盘遮挡输入框的情况,这时候可以尝试 input 元素的 scrollIntoView 进行修复。

  2. 在 iOS 下使用第三方输入法时,输入法在唤起经常会盖住输入框,只有在输入了一条文字后,输入框才会浮出。目前也不知道有什么好的办法能让唤起输入框时正确显示。这暂时算是 iOS 下的一个坑吧。

  3. 有些第三方浏览器底部的工具栏是浮在页面之上的,因此底部 fixed 定位会被工具栏遮挡。解决办法也比较简单粗暴–适配不同的浏览器,调整 fixed 元素距离底部的距离。

  4. 最好将 header 和 footer 元素的 touchmove 事件禁止,以防止滚动在上面触发了部分浏览器全屏模式切换,而导致顶部地址栏和底部工具栏遮挡住 header 和 footer 元素。

  5. 在页面滚动到上下边缘的时候,如果继续拖拽会将整个 View 一起拖拽走,导致页面的“露底”。

    fixed_pull_over.png

为了防止页面露底,可以在页面拖拽到边缘的时候,通过判断拖拽方向以及是否为边缘来阻止 touchmove 事件,防止页面继续拖拽。

以上面内滚动 layout-scroll-fixed 布局为例,给出一段代码作为参考:

| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | `// 防止内容区域滚到底后引起页面整体的滚动var content = document.querySelector('main');
var startY;

content.addEventListener('touchstart', function (e) {
startY = e.touches[0].clientY;
});

content.addEventListener('touchmove', function (e) {
// 高位表示向上滚动 // 底位表示向下滚动 // 1容许 0禁止 var status = '11';
var ele = this;

text

var currentY = e.touches[0].clientY;  

if (ele.scrollTop === 0) {  
    // 如果内容小于容器则同时禁止上下滚动        status = ele.offsetHeight >= ele.scrollHeight ? '00' : '01';  
} else if (ele.scrollTop + ele.offsetHeight >= ele.scrollHeight) {  
    // 已经滚到底部了只能向上滚动        status = '10';  
}  

if (status != '11') {  
    // 判断当前的滚动方向        var direction = currentY - startY > 0 ? '10' : '01';  
    // 操作方向和当前允许状态求与运算,运算结果为0,就说明不允许该方向滚动,则禁止默认事件,阻止滚动        if (!(parseInt(status, 2) & parseInt(direction, 2))) {  
        stopEvent(e);  
    }  
}  

});` | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

转载自: http://efe.baidu.com/blog/mobile-fixed-layout/