fixed在微信下的BUG
2019独角兽企业重金招聘Python工程师标准>>>
最近在一个项目中,碰到了一个问题,是属于微信内部的问题,或者说,是属于APP
内部的问题,它的根源来自于fixed
定位以及-webkit-overflow-scrolling
的组合使用,虽然现在还无法理解问题的根源,但这里可以简单的说一下,问题的情况,以及解决方案。
1:状况描述
解决方案说的再清楚,都不及一个示例来看,看到的明显,所以这里,我们就直接来看示例吧:
如果您在PC
端,可以使用微信扫码:
也可以直接去查看,直接扫码:
也可以直接去查看源码:出现问题的DEMO;http://www.zhangyunling.com/study/2016/20161204/index-1.html
在微信中看看,然后在浏览器中在看看哦,是否发现哪里有差距呢?
2:反向排查
是什么问题导致这种情况的出现呢?
看看我们的代码,结构异常简单,比如,其HTML
代码(关键代码),就是如下的样式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class="wrapper"> <p class="fixed">固定定位的元素</p> <p>固定定位在IOS的微信APP内部的问题</p> <p>该问题,在一些其他的APP内部,也会出现</p> <p style="height:2000px;"> 控制中间区域的部分 </p> <p>到底了</p> </div>
而CSS代码,也是很简单的使用:
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
.fixed{ position:fixed; top:40%; left:0px; width:2em; background-color:#000; color:#fff; padding:5px; line-height:1.5em; } .wrapper{ position:absolute; top:0px; left:0px; right:0px; bottom:0px; overflow:auto; -webkit-overflow-scrolling : touch; padding:10px; }
都是很常见的代码,而且基本可以保证,在移动端,没有什么兼容性问题,那么前面的问题,又是哪里来的呢?
如果说,这个真的是有兼容性导致的,那么这里,唯一有兼容性问题的一个东西,也只剩下:-webkit-overflow-scrolling
了。它用来在IOS
系统下,处理滑动惯性的。
既然发现了问题,那么就去尝试解决一下,既然是这个属性的问题,那么就再来换一个DEMO
,然后所有的代码不变,只去掉这一个属性试试呗。
也可以直接去查看:
也可以直接去查看源码:去掉-webkit-overflow-scrolling的DEMO;
去掉了这个属性之后,确实好了,前面的问题也不在出现了,如果只是在Android
的手机上,那么这样做,完全没有问题,但是在IOS
下,就变得体验非常不好了,感觉就像是卡顿的样子,再也没有之前滚动的流畅性了,这样的体验,还不被批的体无完肤,完全没法交工的么。
那么只能继续看其他的影响了。
3:继续排查
抛开特殊属性的问题,那么这里只剩下两个基本的属性了,对于固定定位来说,.fixed
的样式,已经是属于最简的了,无法再做更多的简化了,那么只能从.wrapper
元素来看了。
这里的wrapper
的元素,也算很简单的,但是唯一的疑惑就是,为何这里要使用绝对定位呢?
如果我不使绝对定位,而是直接使用普通流呢?
那么,就去除掉这个绝对定位试试:
直接扫二维码查看DEMO:
也可以直接去查看源码:去掉absolute的DEMO;
果然OK了,原来是绝对定位的影响啊,去掉之后,果然变得很流畅了,而且也fixed
元素,位置固定,表现正常了。
那么问题就这样解决了吗?当然没有。
4:为什么之前使用绝对定位
回想一下,最前面的代码,为什么这里要使用绝对定位呢?如果没有其他的限制,使用普通文档流布局,不是最佳的选择吗?
但是在最初的示例中,却使用一个绝对定位呢?
其实,因为在真正的项目中,需求并不是这么简单的,在这个页面上,顶部其实是要固定一个输入框的,而顶部固定输入框的情况,如果直接使用普通流布局的话,就会有兼容性问题,这个问题就不止是在微信内部了,算是在整个IOS
系统的浏览器下,都会出现这个问题,那这更不可取了,为了解决一个在某些APP
中出现的问题,导致在IOS
系统下的所有的浏览器,都会出现另外的问题。
关于输入框的问题,可以查看之前的一篇文章:IOS输入框固定
所以,这里我们还必须使用绝对定位来做这个处理。
那么,这个问题又要如何解决呢?
通过CSS
的解决方案,是无法解决这个问题了,而这个问题的出现,又跟JS
毫无关系,并且,在前面的文章中,也说过一个问题,就代表了,我们根本不可能通过JS
,来解决IOS
系统下的这个问题。
因为在IOS
的系统滚动时,是不会进行渲染的,这也是这里问题的原因。
为什么无法通过JS
来解决这个问题,可以参考之前的一篇文章:
不能通过CSS
和JS
来解决,那么现在只能去考虑一下HTML
的代码了,是不是HTML
的代码,布局出现了问题,所以才导致了该问题的出现呢?
5:看看HTML的布局
看一下关键的两个元素的布局:
1
2
3
4
5
6
7
8
9
10
11
<div class="wrapper"> <p class="fixed">固定定位的元素</p> </div>
如果这里再变动,那就只能说,把这两个元素由父子关系,变为兄弟关系了。
所以,接下来就这么试一试吧。
直接扫二维码查看DEMO:
也可以直接去查看源码:改结构为兄弟关系的DEMO;
哇…竟然很完美的解决了
6:这是为什么呢?
太官方的解释,我并没有找到,但是这里的问题的来源,从前面的示例中,可以有一些简单的总结。
首先,IOS
想要页面的滚动变得流畅,所以才有的这个元素:-webkit-overflow-scrolling
,那么这个属性的存在,就可能会引起一些其他的问题,这个解释不了更多了…
还有,语义化标签是个很重要的概念,这里也更进一步的说明了这个问题,其实,在最初之所以把fixed元素,放在其他的元素内部,主要是为了之后的操作更方便,当然在没有使用-webkit-overflow-scrolling
的属性的时候,也确实没有问题,但是这个两个属性,碰到了一起,就出现问题了。
IOS
系统下,fixed
的属性的诸多问题,这里又添加了一员,希望大家多多注意,平时对于fixed
的使用,也多多注意,比如把所有的fixed
元素,都放在body
元素的下面,而不是放在其他子元素的内部。
这样也可以避免一些不必要的麻烦。
对于为什么出现这个问题,没有更深入的认识,所以这里只能把问题的根源稍微说一下,如果您有更深的认识,请指教啦。
总结
本篇文章的内容,本篇的大部分都是属于,以测试实例来反推原因,并没有找到官方的说明来解释这个问题,并且这个只在IOS
系统的一些APP
内部才会出现问题,而在IOS
自带的Safari
浏览器,并没有这个问题的出现,所以这个也许是一些APP
的内部,对于浏览器有一些修改吧。
如果您对这个情况,有更深层次的理解,恳请指教,谢谢。
转载于:https://my.oschina.net/jack088/blog/1929818
fixed在微信下的BUG相关推荐
- 微信小程序 bug 集中营
微信小程序 bug 集中营 create by jsliang on 2018-9-17 17:58:56 Recently revised in 2018-10-18 09:38:15 Hello ...
- “你打篮球像蔡徐坤”:微信翻译这个bug是怎么回事?
关于神经机器翻译,来一次科普教育. 文/光谱 来源:硅星人(ID:guixingren123) 为了微信的一个bug,蔡徐坤的粉丝们差点跟腾讯势不两立. 上周末,一组微信"神翻译" ...
- 前端wx-jssdk的使用及企微和微信下分享等功能自定义处理
前端wx-jssdk的使用及企微和微信下分享等功能自定义处理 一.前端wx-jssdk的使用 wx-jssdk使用需要微信公众平台内进行设置(进入公众号设置的"功能设置"里填写&q ...
- blob 在线解码_PC端微信下的dat 文件在线解码还原成为图片
第二次更新:中间发现一些图片总是失败,考虑到应该是图片的格式问题,最后兼容了下jpg gif png 这三个格式,基本上能把所有的图片全部转化成功了.(代码已更新) 更新: 先提供一个在线的版本,可以 ...
- dat图片 电脑端微信_PC端微信下的dat 文件在线解码还原成为图片
第二次更新:中间发现一些图片总是失败,考虑到应该是图片的格式问题,最后兼容了下jpg gif png 这三个格式,基本上能把所有的图片全部转化成功了.(代码已更新) 更新: 先提供一个在线的版本,可以 ...
- 微信翻译出Bug上热搜,程序员又背锅?
作者| 伍杏玲 来源 | 程序人生(ID:coder_life) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_source=cxrs_ ...
- vue中使用baidushare分享到微信无法显示bug解决方案
vue中使用baidushare分享到微信无法显示bug解决方案 参考文章: (1)vue中使用baidushare分享到微信无法显示bug解决方案 (2)https://www.cnblogs.co ...
- Linux系统下搭建BUG管理系统---禅道
Linux系统下搭建BUG管理系统---禅道 事前准备: Linux系统服务器,centos6.5版本 Windows系统本地电脑 禅道压缩包 Xshell4.xftp管理工具 1.安装mysql y ...
- 安卓微信下video退出视频全屏方法
安卓微信下video退出视频全屏方法 在做h5项目的时候,安卓video全屏模式退出方案: <script>var video = document.getElementById('vid ...
最新文章
- Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...
- canonicalize_url()方法格式化 url
- win7如何更改文件类型_教你win7局域网设置方法
- 硅谷“封城”前夜的L4级别无人车试乘实况,及其背后创新技术的深度剖析
- 永不示弱_永不过时的网页设计:今天和2000年的在线投资组合
- 图的广度优先算法+遍历
- Java124 0,AcWing 124. 数的进制转换java
- Linux 统计文件行数,字节数。
- 剑指企业级云原生,阿里云 CNFS 如何破局容器持久化存储困境
- [最短路/线段树大法优化DIJ] 【模板】单源最短路径(标准版)
- mysql 数据类型 真假_【转】MySQL数据类型
- 问题 | kali2019.04版中文语言安装后就会乱码
- Samza框架-----学习笔记
- SQL Server数据表在编程中实现导出EXCEL的几种方法
- 计算机义诊暑期社会实践报告,义诊社会实践报告
- 手机里多个PDF合并成一个PDF的免费方法
- 5G无线技术基础自学系列 | 网络架构
- Maven第3篇:详解maven解决依赖问题
- Struts——开源MVC框架
- Linaro公司基于GCC推出的的ARM交叉编译工具