【原创】原来你竟然是这样的Chrome?!Firefox笑而不语
书接上文
上一篇文章《【原创】用事实说话,Firefox 的性能是 Chrome 的 2 倍,Edge 的 4 倍,IE11 的 6 倍!》,我们对比了不同浏览器下FineUIPro一个页面的性能,发现Firefox的加载速度最快,而众望所归的Chrome却表现的差强人意,加载速度仅仅是Firefox的一半!
最近我们重新对测试和代码进行了优化和整理,有如下三个发现:
1. 测试代码将开始时间放在<head>标签的做法有失偏颇,如下所示:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script>
var __STARTTIME = new Date();
</script>
</head>
这会导致所计算的时间包含HTML页面,CSS文件和JavaScript文件的网络传输时间,实际上这部分是我们测试案例所不关心的,我们仅关心页面的渲染速度!
因此,优化后的代码将开始时间放到页面底部,如下所示:
</form>
<script>
// 等所有JS资源下载完毕后开始
var __STARTTIME = new Date(); // 表格渲染完毕后结束
function onGridRender() {
F.ui.Grid1.setTitle('表格(23列,500行,行高不同) - 渲染:' + ((new Date() - __STARTTIME) / 1000).toFixed(2));
} </script>
</body>
</html>
2. 前面一篇文章《【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox》,我们发现Chrome解析如下结构时遇到问题:
2.1 页面结构如下:
<td class="f-grid-cell">
<div class="f-grid-cell-inner">杨婷婷</div>
</td>
2.2 页面样式包含:
.f-grid-cell {
overflow: hidden;
}
.f-grid-cell-inner {
position: relative;
}
这样的 CSS 设置会导致滚动时页面出现白屏,并且CPU占用率飙升。
不仅如此,在去除 td 的 overflow:hidden 样式后,我们发现 Chrome 下的页面渲染速度也有明显的提升,这一点对接下来的Chrome性能提升也很重要!
3. FineUIPro 代码中有强制 Chrome 重绘的浏览器特定代码,这也是对 Chrome 之前版本存在滚动条不显示的应急策略:
function forceChromeRepaint(targetNode) {
//:: Chrome的BUG(Firefox,IE都没有此问题)
//:: http://stackoverflow.com/questions/4394350/chrome-scrollbars-not-disappearing-when-content-is-smaller-than-container?rq=1
if(F._fjs_isChrome) {
var overflow = targetNode.css('overflow');
if(overflow === 'auto' && targetNode._fjs_scrollLeft() == 0 && targetNode._fjs_scrollTop() == 0) {
targetNode.css('overflow', 'hidden');
//:: 强制浏览器重新绘制
targetNode[0].scrollWidth;
targetNode.css('overflow', 'auto');
}
}
}
在最新版的Chrome下测试,相应的浏览器滚动条不显示问题已经得到了修正,所以可以把相关的强制重绘代码去掉了(之前出问题的好像是Chrome v58前后的一些版本,现在Chrome都升级到75了)。这也进一步提升了页面的渲染速度。
经过上面三方面的改进,我们再来看下不同浏览器下的页面渲染性能的对比数据。
优化后的对比数据
和第一篇文章的测试类似,我们将表格行增加到 500 多行,列增加到 20 多列,并且行高不固定,来测试下各个浏览器的性能。
测试使用的电脑是 MacBook Pro 笔记本(英特尔 i7-8750H,32GB内存,512GB SSD),单独拆分出一个新的 256GB 分区用来安装 Windows 10 Pro(64位)系统,并更新至最新补丁。
参与测试的浏览器都是最新版,分别为:
- Chrome 75
- Firefox 68
- Edge 44
由于 IE11 有明显的卡顿,进行本测试意义不大,所以这次不再对 IE11 进行测试。
下面是测试结果(第一张是 FineUIPro v5.5.0 的截图,第二张是代码优化后的截图):
Firefox:


Chrome:


Edge:


下面对上述结果进行一个综述:
| 浏览器 | 原始的渲染时间(秒) | 优化后的渲染时间(秒) |
| Firefox | 0.75 | 0.70 |
| Chrome | 1.85 | 1.08 |
| Edge | 5.53 | 2.47 |
注:
1. 每次页面刷新结果都有一定的差异,这个取的是多次运行的中间值。
2. 优化后的结果需要等FineUIPro v5.6.0 发布后自行到官网示例测试,目前没有在线测试链接。
可以看到,经过代码优化后,Chrome的性能有明显的提升,但即使如此,Firefox还是比Chrome有性能优势,只不过不再那么辣眼睛了。
发现新问题
看似一个问题的结束,却是另一个问题的开始,还记得上一篇文章中我们提到 Chrome 下选中卡顿的问题吗?
即使在上述数据优化之后,Chrome的渲染性能有明显提升的情况下(从1.85s提升到1.08s之后),Chrome下的行选中依然有明显的卡顿现象,对比下几个浏览器下的动图:
Chrome:

Firefox:

Edge:

Chrome你这是要闹哪样?即使页面渲染慢得多的Edge都没有卡顿,选中行时非常丝滑,而Chrome就像被卡着脖子一样,每次点击都有差不多0.5秒的延迟!
真不省心,真不省心.....
解决问题
这个问题的解决可以说是费尽周折,因为已经明确知道是Chrome浏览器的BUG,而Firefox和Edge都正常,所以根本不能按照常规思路去解释。
后来,一个偶尔的机会,发现去掉第一列(包含复选框的那一列),问题神奇般的消失了,所以我一度怀疑是复选框的样式问题,来看一下。
复选框的HTML结构很简单:
<i class="f-icon f-iconfont f-grid-checkbox f-checkbox"></i>
CSS代码:
.f-checkbox {
position: relative;
top:;
left:;
display: inline-block;
width: 14px;
height: 14px;
min-width: 14px;
margin: 3px 1px;
border-width: 1px;
border-style: solid;
border-radius: 2px;
}
.f-checkbox:after {
display: table;
position: absolute;
left: 4px;
top: 1px;
width: 5px;
height: 8px;
border-width: 2px;
border-style: solid;
border-color: #fff;
border-top:;
border-left:;
content: " ";
-webkit-transform: rotate(45deg) scale(0);
transform: rotate(45deg) scale(0);
opacity:;
filter: alpha(opacity=0);
}
.f-checkbox.f-checked {
background-color: #007465;
border-color: #007465;
}
.f-checkbox.f-checked:after {
width: 5px;
height: 8px;
left: 4px;
top: 1px;
-webkit-transform: rotate(45deg) scale(1);
transform: rotate(45deg) scale(1);
opacity:;
filter: alpha(opacity=100);
}
这段CSS代码我看了很久很久,实在找不到可以优化的地方,因为这个做法也是业内所公认的,通过将 f-checkbox:after 的 L 型边框旋转 45 度来实现对勾的效果。
接下来,神奇的事情发生了,一个偶然的机会,我会外层的 .f-grid-cell-inner 的 position: relative 去掉,所有的卡顿不见了,一切都像Firefox一样丝滑:

现在来看下去掉这个 CSS 属性之后,行选中的效果,丝滑的就像Firefox一样:

问题解决了,是不是很高兴?
可惜一点都高兴不起来,首先不知道这个 td -> div 的 position:relative 挨着谁的事了,这么不受 Chrome 的待见。
其次这个属性虽然FineUIPro没有大用处,还是有一点用处的,比如这里:

所以遇到这种情况,就先加个例外好了。
不管怎么说,也算是暂时画上一个句号,看Chrome哪个版本能修正类似的问题?
不忘初心,砥砺前行!
【原创】原来你竟然是这样的Chrome?!Firefox笑而不语的更多相关文章
- Chrome firefox ie等浏览器空格 宽度不一样怎么办
有点强迫症,之前某个页面用了空格 ,但是在chrome firefox 和ie显示的宽度都不一样,无法对齐. 搜索了一下,很多人都转载了那篇设置成宋体的,可是仍然没对齐,要么ie对齐,要么chrome ...
- 拒绝IE8-,CSS3 transform rotate旋转动画效果(支持IE9+/chrome/firefox)
<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta nam ...
- 结合FireBreath在Chrome/FireFox的多进程模式下崩溃一例
FireBreath是跨浏览器跨操作系统的插件方案,它封装了ActiveX和NPAPI的插件接口,使用统一的API来暴露JSAPI.Chrome和FireFox使用NPAPI,IE使用ActiveX. ...
- [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器
截至自2017-08-11,支持现世已出的几乎所有PC端浏览器版本判断. 受支持的PC端浏览器列表: Edge IE Chrome Firefox Opera Safari QQ浏览器 360系列浏览 ...
- Chrome/FireFox处理JSON的插件
Chrome/FireFox处理JSON的插件 JSON插件 效果对比 对于json的数据如果不编排一下格式查看起来很费劲,今天推荐一款chrome/Firfox下处理json的插件JSON-ha ...
- 【转】禁用chrome firefox 的 WebRTC功能防止真实IP泄漏
无论是使用VPN还是其它代理方式,很多时候我们不希望暴露自己的真实IP,且一直以来我们认为VPN是安全的,所有流量都会走VPN. 但最近暴露出一个WebRTC特性,会暴露我们的真实IP.适用浏览器:c ...
- Chrome/Firefox 中头toFixed方法四舍五入兼容性问题
每个Number的toFixed()方法可把 Number 四舍五入为指定小数位数的数字.四舍五入顾名思义,4及以下舍去,5及以上加1. 四舍 1.31.toFixed(1) // 1.3 1.32. ...
- 关于IE,Chrome,Firefox浏览器的字符串拼接问题
昨天项目测试的时候,IE8.IE11测试勾选checkbox然后执行保存的时候,竟然执行的结果与预期相反,吓屎我了,最终排查之下,原来是拼接checkbox的值的时候出现的问题.本人对js了解知之甚少 ...
- 各种浏览器的Hack写法(chrome firefox ie等)
Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack. 然后将Hac ...
随机推荐
- 【半小时大话.net依赖注入】(一)理论基础+实战控制台程序实现AutoFac注入
系列目录 第一章|理论基础+实战控制台程序实现AutoFac注入 第二章|AutoFac的常见使用套路 第三章|实战Asp.Net Framework Web程序实现AutoFac注入 第四章|实战A ...
- 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板
标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...
- 记一次linux通过jstack定位CPU使用过高问题或排查线上死锁问题
一.java定位进程 在服务器中终端输入命令:top 可以看到进程ID,为5421的cpu这列100多了. 记下这个数字:5421 二.定位问题进程对应的线程 然后在服务器中终端输入命令:top -H ...
- django基础知识之Ajax:
使用Ajax 使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模型代码,生成最张的html,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差 改进方案:通过ajax的方 ...
- c++2的幂次方
c++2的幂次方 题目描述 任何一个正整数都可以用2的幂次方表示. 同时约定用括号来表示方次,即a的b次,可以表示为a(b). 由此可知,137可以表示为: 2(7)+2(3)+2(0) 进一步: ...
- Notepad++提升工作效率小技巧
前言 简单的提升工具效率需求可以借助Notepad编辑器实现.以前也用Python/Shell开发过本文中提到的需求,现在发现其实没有必要.本文介绍一些工作中常见的可以通过"Notepad+ ...
- 基础篇-1.1走进Java世界
在走进Java世界之前,我们势必先了解下Java是什么?Java是一门面向对象的编程语言,是静态面向对象编程语言的代表,极好得实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.Java具有 ...
- EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构
目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5 ...
- 第二章 Session会话管理
采用网址重写的缺点: 在有些Web浏览器中,URL限制为2000个字符. 仅当有链接要插入值时,值才能转换成后面的资源.此外,要把值添加到静态页面的链接中,可不是一件容易的事情. 网址重写必须在服务器 ...
- MLlib特征变换方法
Spark1.6.2.2.3 PCA 算法介绍: 主成分分析是一种统计学方法,它使用正交转换从一系列可能相关的变量中提取线性无关变量集,提取出的变量集中的元素称为主成分.使用PCA方法可以对变量集合进 ...