【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

时间:2022-05-19 19:28:32

前言

俗话说,常在河边走哪能不湿鞋,天天和浏览器打交道,发现浏览器竟然也隐藏BUG也不是新鲜事了。可以看下我之前的文章:

【原创】分享IE7一个神奇的BUG(不是封闭标签的问题,的确是IE7的BUG)

【原创】Chrome53 最新版惊现无厘头卡死 BUG!

【原创】Chrome最新版(53-55)再次爆出BUG!

【原创】三招搞死你的IE11,可重现代码下载(IE Crash keyframes iframe)!

【原创】抓个Firefox的小辫子,围观群众有:Chrome、Edge、IE8-11

【续】抓个Firefox的小辫子,jQuery表示不背这黑锅,Chrome,Edge,IE8-11继续围观中

这类BUG之所以被大家所深恶痛绝,在于其隐蔽性,很多时候不能用常规的逻辑去分析。另一个原因是开发人员一般都很善良,出现问题总是从自身找原因,很少会怀疑到IDE,浏览器这些开发工具上面来。

事实情况是,浏览器也是开发人员开发的,是个软件就有BUG!

今天公开的这个Chrome BUG一直长期存在,并且行为表现的和IE11下的一模一样,而Edge和Firefox没有这个问题,下面就听我详细道来......

起因

最初这个问题是我们的一个客户发现的,为了测试性能,客户修改了官网示例的代码:

https://pro.fineui.com/#/gridpaging/gridpaging_pageitems_pagesize_database.aspx

增加到每页 100 行数据,就有如下的聊天截图:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

总结下来,这个问题有如下特点:

1. 滚动时卡顿,CPU占用率飙升至 27%,滚动结束后CPU占用率下降

2. IE11下滚动中有白屏

为了重现这个效果,我们加大了测试力度,把列增加到100列,行调整为190行,在Chrome下的效果如下:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

在滚动过程中,可以明显看到白屏!!

分析问题

由于这个白屏发生在滚动的过程中,所以首先怀疑 FineUIPro 注册的滚动事件,如下所示:

me._fjs_gridBodyctEl.on('scroll', function (event) {
return; ......
}

scroll事件处理函数中直接返回,测试发现白屏依旧!

既然不是JavaScript代码导致的,那就可能是CSS代码,因为 FineUIPro 中用到了 CSS3 动画,而白屏可能是动画过程,这是极有可能的:

/*
.f-animation .f-calendar-header .f-calendar-nav,
.f-animation .f-tool,
.f-animation .f-btn,
.f-animation .f-tab-header .f-tool.f-tool-close .f-tool-icon,
.f-animation .f-checkbox,
.f-animation .f-radiobutton {
-webkit-transition: background-color .3s, border-color .3s, color .3s;
transition: background-color .3s, border-color .3s, color .3s;
} .... */

经测试白屏依旧!!

既然不是JavaScript的影响,也不是CSS3 动画的影响,莫非是某些CSS规则导致的?

为了便于分析问题,我们将页面生成的HTML拷贝到一个独立的文件中,在页面中只引用 FineUIPro 的CSS文件,经过一点一点的对CSS进行删除测试,最终发现了如下代码会对页面滚动产生影响:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

由于表格有近200行100列,所以这个测试文件有 3M 左右,文末会提供下载,你也可以自行测试。

简单来说,就是如下两个CSS规则:

.f-grid-cell {
overflow: hidden;
}
.f-grid-cell-inner {
position: relative;
}

其中,f-grid-cell 是表格的 td 元素,而 f-grid-cell-inner 是表格 td 里面的 div 元素,如下所示:

<td class="f-grid-cell">
<div class="f-grid-cell-inner">杨婷婷</div>
</td>

在Chrome中测试效果如下:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

这里观察到两个显现:

1. 滚动中有明显的白屏

2. Chrome的CPU占用率由最初的 0%,随着滚动的进行一路飙升到 19%

现在修改页面上的CSS规则如下:

.f-grid-cell {
/* overflow: hidden; */
}
.f-grid-cell-inner {
position: relative;
}

也即是注释掉表格td元素的 overflow 样式规则,刷新页面,再次测试:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

仅仅是注释掉 td 的 overflow:hidden 属性,这次的现象截然不同:

1. 滚动过程中已没有白屏现象

2. Chrome的CPU占用率在滚动过程中最高不超过 5%

说明Chrome在解析如下两个属性时出现了问题,至少目前发现的这个问题是由于这两个属性冲突导致的:

1. TD 上的 overflow 属性

2. TD 内部 DIV 上的 position:relative

浏览器对比

为了确定是否其他浏览器也有类似问题,我们分别对 Edge,IE11,Firefox进行测试,这些浏览器都是目前最新版,版本如下:

1. Chrome:75.0.3770.100(正式版本) (64 位)

2. Firefox:68.0.1 (32 位)

3. Edge:44.18362.1.0

4. IE11:11.239.18362.0

测试代码是如下两个CSS属性同时存在的情况:

.f-grid-cell {
overflow: hidden;
}
.f-grid-cell-inner {
position: relative;
}

Chrome:前面已经测试过了。

Edge:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

IE11:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

Firefox:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

下面对比下各个浏览器的表现:

  • Chrome:滚动时出现白屏,CPU 在滚动过程中会飙升到 19%
  • Edge:滚动时不会出现白屏,CPU 在滚动过程中会升到到 9%
  • IE11:滚动时出现白屏,CPU 在滚动过程中会飙升到 17%
  • Firefox:滚动时不会出现白屏,CPU 在滚动过程中会升到到 5%

而把CSS样式改为:

.f-grid-cell {
/* overflow: hidden; */
}
.f-grid-cell-inner {
position: relative;
}

则在滚动时,四个浏览器都不会出现白屏现象,CPU占用率也会提升,但已经没有那么明显,看下Chrome下的表现:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

IE11下的表现:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

这里的效果和之前的有天壤之别,简单概述下,在Chrome下:

  • 添加 TD 的 overflow 属性:滚动时有白屏现象,CPU占用率会飙升到 19%
  • 去掉 TD 的 overflow 属性:滚动时没有白屏,CPU占用率小于3%

在IE11下:

  • 添加 TD 的 overflow 属性:滚动时有白屏现象,CPU占用率会飙升到 19%
  • 去掉 TD 的 overflow 属性:滚动时没有白屏,CPU占用率会升到10%

解决办法

目前的解决办法也很简单,去掉 TD 的 overflow 属性,这个设置应该属于历史遗留代码,暂时也没有什么用处。

最后,再来对比下修改前后,在Chrome 下 FineUIPro 测试页面的运行效果:

修改前:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

修改后:

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

性能提升明显!

注意:不是说td有 overflow:hidden 属性就会出现这个滚动问题,而是要同时满足如下几个条件:

1. 页面结构如下:

<td class="f-grid-cell">
<div class="f-grid-cell-inner">杨婷婷</div>
</td>

2. 页面样式包含:

.f-grid-cell {
overflow: hidden;
}
.f-grid-cell-inner {
position: relative;
}

3. 表格包含大量的元素,本示例包含200行100列。

你也可以自行测试:

测试页面下载

不忘初心,砥砺前行!

本系列:

=======================

【原创】用事实说话,Firefox 的性能是 Chrome 的 2 倍,Edge 的 4 倍,IE11 的 6 倍!

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox

【原创】原来你竟然是这样的Chrome?!Firefox笑而不语

【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox的更多相关文章

  1. 【原创】抓个Firefox的小辫子,围观群众有:Chrome、Edge、IE8-11

    前言 很多人都知道我们在做FineUI控件库,在这 9 年多的时间里,在和浏览器无数次的交往中,也发现了多个浏览器自身的BUG,并公开出来方便大家查阅: 分享IE7一个神奇的BUG(不是封闭标签的问题 ...

  2. 【原创】用事实说话,Firefox 的性能是 Chrome 的 2 倍,Edge 的 4 倍,IE11 的 6 倍!

    前言 每个浏览器新版本发布,都号称性能有显著提升,并且市面有各种测试工具,测试结果也是大相径庭,比如下面这篇文章: https://www.oschina.net/news/97924/browser ...

  3. 【原创】原来你竟然是这样的Chrome?!Firefox笑而不语

    书接上文 上一篇文章<[原创]用事实说话,Firefox 的性能是 Chrome 的 2 倍,Edge 的 4 倍,IE11 的 6 倍!>,我们对比了不同浏览器下FineUIPro一个页 ...

  4. 各种位置和高度计算&colon;&period;position&lpar;&rpar;、&period;offset&lpar;&rpar;、&period;outerHeight&lpar;&rpar;、&period;scrollTop、&period;scrollHeight、&period;clientHeight

    1..position()和.offset() jquery的.position()获取相对于最近的position为relative或absolute的父元素的偏移,返回.position().le ...

  5. 如何允许WebGL从本地载入资源

    随着mono-design不断推广,用户越来越多,陆续有电话来询问“为什么3D展现的时候,是一团黑?”,针对这个问题,专门写个帖子说明原因并给出解决方案,并且在mono-design编辑器中加了判断功 ...

  6. 关于IE11

    最近,一个开发代号为Windows Blue的Windows操作系统泄漏到了互联网上,该操作系统的内置浏览器为IE11,本文将介绍一下这个泄漏版的IE11中有哪些关键的新变化和新特性. 预先声明: 本 ...

  7. 【转】Chrome 控制台不完全指南

    原文出处: 刘哇勇的博客(@刘哇勇)   欢迎分享原创到伯乐头条 Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快 ...

  8. 360 chrome 国际版能够隐藏用户保存的密码

    用360 chrome 国际版一段时间了,今天发现它一个优点:取消了浏览器保存的密码明文显示! 原生的chrome和枫树都会明文显示密码,360 chrome国际版则只显示保存了密码的域名和账户名.光 ...

  9. 前端图片预览,上传前预览,兼容IE7、8、9、10、11,Firefox,Chrome&lpar;学习到的知识&rpar;

    文章地址:http://www.cnblogs.com/rubylouvre/p/4597344.html 一.window.URL 在Chrome中,window.URL和window.webkit ...

随机推荐

  1. jquery select取值,赋值操作

    select">jquery select取值,赋值操作 一.获取Select 获取select 选中的 text : $("#ddlRegType").find( ...

  2. POJ 2965 The Pilots Brothers&&num;39&semi; refrigerator

    题目链接 题意:一个冰箱上有4*4共16个开关,改变任意一个开关的状态(即开变成关,关变成开)时,此开关的同一行.同一列所有的开关都会自动改变状态.要想打开冰箱,要所有开关全部打开才行. 输入:一个4 ...

  3. android使用友盟第三方自动更新&sol;手动更新

    最近项目用到自动更新,发现一个方便快捷的第三方组件非常好用,只需要几行代码搞定,非常适合新手使用.分享给大家一起学习. 本文档帮助您以最快速最简洁的方式集成使用自动更新组件. 一.申请友盟开发者账号创 ...

  4. YUM源、磁盘基础知识 CDN概念

    第1章 YUM源 1.1 什么是yum源 Yellowdog Updater, Modified 一个基于RPM包管理的字符前端软件包管理器.能够从指定的服务器自动下载RPM包并且安装,可以处理依赖性 ...

  5. Luogu2973:&lbrack;USACO10HOL&rsqb;赶小猪

    题面 Luogu Sol 设\(f[i]\)表示炸弹到\(i\)不爆炸的期望 高斯消元即可 另外,题目中的概率\(p/q\)实际上为\(1-p/q\) 还有,谁能告诉我不加\(EPS\),为什么会输出 ...

  6. (转)Spring Boot &lpar;十三&rpar;: Spring Boot 小技巧

    http://www.ityouknow.com/springboot/2017/06/22/spring-boot-tips.html 一些 Spring Boot 小技巧.小知识点 初始化数据 我 ...

  7. MySQL用户授权【转】

    MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant selec ...

  8. pycharm提示This inspection detects instance attribute definition outside &lowbar;&lowbar;init&lowbar;&lowbar; method

    示例代码: class MiNiCarStore(CarStore): def createCar(self, typeName): self.carFactory = CarFactory() # ...

  9. Dubbo简单环境搭建

    Dubbo服务的发展和作用: 首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程. 其次,当服务越来越多之后,我们需要做哪些服务治理? 最后,是d ...

  10. 使用GPUImage渲染图片教程

    使用GPUImage渲染图片教程 Prepare - 准备 GPUImage开源库并不像普通的开源库那样子,拖进你的工程中就可以用.以下将详细的告诉你如何将GPUImage导入到你的工程当中. 首先上 ...