原来CSS这样写是会让app崩溃的

简介:

先废话一下

之前在自己的个人公众号中提到了一篇利用 CSS 的方式进行 XSS 攻击,当时有朋友跟我说,让我去获取那个网站的 cookie,再然后进入那个网站的后台去玩。然而,技术能力实在有限,搞不了这些东西,只是觉得那个网站没有适当过滤 HTML 标签是一件很危险的事情。

不过今天要说的 CSS 代码真的是让 app 崩溃了,至于信不信,看图就知道咯。

crash-app-by-css-01

故事背景

昨晚在被窝中的我突然收到一封邮件,大概内容是说因为 CSS 的问题让 app 挂了。当时在想,怎么样的 CSS 如此牛逼,居然让 app 挂了!于是掏出手机按照邮件中提示的 URL 打开看了一下,我只想说,这代码,额,算了,还是不吐槽了,其实要是我写的话,肯定会更烂。

虽然是来自其他部门的一个页面,但作为公司的一员,怎么能不为公司的产品考虑呢。听起来感觉像是在拍马屁,其实真的是,因为我最好奇的是出现 bug 的原因是什么,当然,肯定也是关心产品的啦。

于是第二天一早就到公司开始排雷……

大概的过程

首先我仔细看了一下代码,从最初怀疑是 animation 的性能影响低端设备运行开始排查。结果发现这个所谓的性能问题其实也并没那么厉害,一时也找不到头绪,然后源文件又不是在我们自己这边,只好打开花瓶抓 CSS 文件,然后替换后,用删除法一点点查。

最后在储大师的提点以及提供的一个 URL 来看,居然是 rem 导致的。

https://bugs.chromium.org/p/chromium/issues/detail?id=364222

这个网址大家应该都知道,是专门看 bug 的,当然,也可以提 bug 啦。


 
 
  1. @-webkit-keyframes crashChrome { 
  2.         0%{ -webkit-transform: translateX(0rem);} 
  3. .anim:before{ 
  4.     content: ""
  5.     width: 3rem; 
  6.     height: 3rem;     
  7.     border-radius: 3rem;     
  8.     position: absolute;     
  9.     left:5rem;     
  10.     top: 5rem;         
  11.     background-color: #06839f;         
  12.     -webkit-animation: crashChrome; 

 
 
  1. <div class="anim"></div> 

刚开始看到这段 CSS 代码的时候,我在想啊,这个好像也没什么问题啊,不就是通过 :before 这个伪元素来做一个 animation动画效果么,然后使用了 rem 这个单位量。

反正是百思不得其解。

还是找测试机,继续删除那个有问题的页面代码吧。先是用了三星的,发现没问题,接着用了小米的,果然奔溃了。看了一下版本,三星的是 Android 4.4.2,小米的是 Android 4.4.4,难道是版本的关系?

crash-app-by-css-02

总之,在最开始那块有动画效果的部分排查了很久都没找到问题。最后还是回到那个已经报了 bug 的页面上看具体说明。

突然想到,这个页面中用了 :before 来做动画,莫非我们的这个页面中也有,于是一搜,结果,真的有

赶紧我们自己页面上的这段代码拿过来做尝试,终于找到你了。赶紧回邮件告诉对方……

再次感谢储大师的提点,让我有机会了解到未曾了解到的一个问题。

简单分析

这个 bug 在目前桌面端的设备中已经被处理掉了,按照 bug list 页面上说的,当时发现这个 bug 是在

Chrome Version: 34.0.1847.116 (Official Build 260972) m

这个版本上的,并且各系统都有。然而,现在的 Chrome 都已经是 50 以上的版本了,所以桌面端完全不需要去担心了。

但是这次既然是在移动端上遇见了,而且是 Android 4.4.4 这个版本,虽然是在小米3 中发现,但 Android 4.4.4 这个版本应该还算是比较普遍的,难道真的会是这个问题。

crash-app-by-css-03

获取一下这个 webview 的 UA 信息,看到其中有一个是 Chrome/33.0.0.0 Mobile Safari,于是我想啊,可能应该就是这个 webview 的关系了,毕竟我在小米3 这台测试机上的各个浏览器里都看了一遍,没发现问题。

尝试了解

现在是知道 remanimation 一起的时候回出现这个 bug,但是在其他元素中并没有问题啊。出于自己的好奇心,于是又换了几个方式来尝试。

animationtransition

animation 换成 transition,并且也是通过改变有 rem 的属性,结果发现这个想法的结果是,没有任何问题。

放弃这个想法……

:before 是伪元素

想到 :before 是伪元素,那么对于伪元素的选择符还有几个,都尝试一下看看。

crash-app-by-css-04

:这个截图是曾经个人整理的有关 CSS 选择符的一张图

结果发现这四个伪元素选择符全部都会让页面崩溃……

小结一下

浏览器(webview)的底层渲染机制我不懂,但就目前来看,可能应该就是因为 Chrome/33.0.0.0 Mobile Safari 这个版本的问题,如果在伪元素中使用 animation,并且改变了其中的 rem 的值就会出现页面崩溃的问题。

所以,可能应该就是这样:

  • 使用了 :before 等伪元素中的其中一个来做 animation 动画;
  • animation 动画改变了其中的某个 rem 的值;

在这样的前提下,又是使用有这个 bug 的版本浏览器,那么就会让页面崩溃。

如果要避免这个 bug 的出现,那么应该是:

  • 换一个 webview,高版本的应该会好一些;
  • 在伪元素中使用 animation 动画时,不用 rem 单位;

不过好像现在大家都会去用 rem 单位,然后也会去用 animation 做动画,那这样好了,不在伪元素上使用者两样东西咯。

题外话

说到在伪元素上使用动画,我想起了几年前自己在做国际网站的时候,当时好像用的比较多的是 Firefox,然后在往返程的一个模块中,就是用了伪元素的方式。

不过当时我好像使用的是 transition,并且当时主要是考虑 Firefox,所以也没遇到什么问题。印象中遇到的问题就是,好像在某个浏览器中并没看到那个 transition 效果,而且这个只是作为一个小“亮点”的存在,产品经理也没砍我。想想也算万幸的……

哦,还有,如果各位已经知道了这个 bug,也请不要嘲笑我,我真的是第一次知道,平时日常中很少这样去写样式。-_”


来源:51CTO

相关文章
|
4月前
|
消息中间件 Android开发 开发者
🔍深度剖析Android内存泄漏,让你的App远离崩溃边缘,稳如老狗!🐶
【7月更文挑战第28天】在 Android 开发中,内存管理至关重要。内存泄漏可悄无声息地累积,最终导致应用崩溃或性能下滑。它通常由不正确地持有 Activity 或 Fragment 的引用引起。常见原因包括静态变量持有组件引用、非静态内部类误用、Handler 使用不当、资源未关闭及集合对象未清理。使用 Android Studio Profiler 和 LeakCanary 可检测泄漏,修复方法涉及使用弱引用、改用静态内部类、妥善管理 Handler 和及时释放资源。良好的内存管理是保证应用稳定性的基石。
78 4
|
3月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
6月前
|
前端开发
【专栏】在 create-react-app 中集成 less/sass 预处理器和 react-css-modules 的方法
【4月更文挑战第29天】本文介绍了在 create-react-app 中集成 less/sass 预处理器和 react-css-modules 的方法。首先,通过 `npm` 安装 less 或 sass 依赖,然后修改 `config-overrides.js` 配置文件以支持 less/sass 编译。接着,详细阐述如何使用 less/sass 编写样式。再者,安装 react-css-modules 并配置 webpack,使能样式模块化。最后,展示了如何结合使用 less/sass 和 react-css-modules,以提升前端开发的效率和代码质量。
495 0
|
6月前
|
前端开发
最新版本create-react-app 如何使用css-module
最新版本create-react-app 如何使用css-module
49 0
|
6月前
|
前端开发
uni-app中基于bootstrap的css样式
uni-app中基于bootstrap的css样式
117 0
uni-app学习笔记-引入全局uni.css和flex布局(七)
uni-app学习笔记-引入全局uni.css和flex布局(七)
600 0
|
API Android开发
fragment不断切换app崩溃的解决办法
fragment不断切换app崩溃的解决办法
|
前端开发
CSS 速复习(基础知识) (思维导图App: Xmind)
CSS 速复习(基础知识) (思维导图App: Xmind)
891 0
CSS 速复习(基础知识) (思维导图App: Xmind)
|
Java 应用服务中间件 容器
APP 莫名崩溃,开始以为是 Header 中 name 大小写的锅,最后发现原来是容器的错!
本文主要是分析生产遇到的一个问题,然后开始探究原因,开始的时候发现是 Spring 的原因,因为使用 Map 接收时, headerName 什么格式就是什么格式。 在自己写 demo 时又发现,原来和 Spring 的关系并不大,是容器的原因。不同的容器处理方式不同。所以总结出来相关文章,供大家参考,不足之处,欢迎指正。
654 0
|
Java Android开发 UED
能否让APP永不崩溃—小光和我的对决
关于拦截异常,想必大家都知道可以通过Thread.setDefaultUncaughtExceptionHandler来拦截App中发生的异常,然后再进行处理。
215 0
能否让APP永不崩溃—小光和我的对决

热门文章

最新文章

下一篇
无影云桌面