如何写成高性能的代码(一):巧用Canvas绘制电子表格
一、什么是Canvas
Canvas是HTML5的标签,是HTML5的一种新特性,又称画板。顾名思义,我们可以将其理解为一块画布,支持在上面绘制矩形、圆形等图形或logo等。
需要注意的是,与其他标签不同,Canvas只是一块空画布,其本身是不能绘制图形的,必须通过JavaScript 脚本进行绘制。
大多数现代浏览器都支持Canvas技术,例如Chrome、Firefox以及最新的IE9以上版本。
IE8及以下不支持H5,所以也不支持Canvas,不过我们可以在Canvas标签之间书写内容,来提示用户升级或使用支持的浏览器打开。

二、Canvas与DOM的区别
如果想绘制一个图形,你会有几种思路呢?
在HTML5出现之前,大家通常会使用SVG(本质上也是DOM)绘制,使用XML语言中描述图形的具体信息,进一步渲染图形。
也有同学会直接使用DOM进行绘制,比如借助div标签画个矩形,并结合CSS进行样式的渲染。
对比Canvas和DOM,二者究竟有哪些区别呢?
1、绘制的图片格式不同
DOM是使用矢量图进行页面渲染的,每一个元素都是一个独立的DOM元素。作为一个独立的DOM元素,CSS和JavaScript都可以直接操纵DOM,对其进行监听。
而canvas本质上是一张位图,其构成最小单位是像素,其中的图形不会单独创建DOM元素。
2、工作机制不同
前面提到,DOM作为矢量图进行渲染,如果页面内容复杂时,系统就会创建特别多的DOM元素。浏览器在渲染时就需要对所有的DOM元素进行解析计算,庞大的计算量易导致页面卡顿或者渲染过度。
在渲染Canvas时,浏览器的每次重绘都是基于代码的,只需要在内存中构建出画布,在JS引擎中执行绘制逻辑,然后遍历整个画布中像素点的颜色直接输出到屏幕就可以了。
也就是说,不管canvas中的元素有多少个,浏览器在渲染阶段也只需要处理一张画布,而不是像矢量图那样,需要对所有的DOM元素进行计算。这也就是Canvas的最大优势:渲染性能。
除此之外,因为Canvas的绘制是在JS层通过代码控制的,所以在灵活性方面较DOM也有很大的优势。
三、攻克电子表格技术的性能难点
电子表格发展以来,以其便捷性、即时性深深影响了人们的生活。微软认为世界上每五个成年人中就有一个使用 Excel (源于“微软 Excel 的最新发展” ,2017年9月)。随着互联网技术的发展,电子表格结合在线系统也成为大多企业呈现分析数据的优选方案,发挥出巨大的作用。
在实际的业务场景中,Web表格不仅只是展示数据,伴随来的还有复杂精美的样式、繁琐灵活的操作,来帮助开发者更快捷地获取整合数据。
结合前文分析的Canvas和DOM工作机制,如果数据量不大,浏览器绘制电子表格时二者性能差异不会很明显。
但如果在工业制造、金融财会等行业中,所使用电子表格动辄就是上百万行,浏览器不仅需要对单元格内容进行渲染,还需要涉及到丰富的数据处理,这对前端性能就会有很大的挑战。
传统的DOM进行渲染时,如果执行更新、滚动等操作,就需要不停地销毁创建DOM,这无形中也增加了大量无效计算,容易造成页面卡顿等渲染问题。
而使用canvas绘制,就不会有重复创建、销毁DOM操作,打破了DOM元素对UI的诸多限制,同时也可以绘制种类更为丰富的UI元素,如线性、特殊图形等。
目前业内已经出现了使用Canvas技术绘制画布的前端表格控件。
在使用canvas绘制的过程中,还引入了双缓存画布的机制,将不易改变的主题图层绘制在缓存画布中,在发生渲染行为时,只需要将缓存画布中的主体图层通过克隆的方式绘制在主画布,并附加装饰图层元素,这种“双剑合璧“的形式大大优化了电子表格的绘制性能。
在线demo体验纯前端表格控件:https://demo.grapecity.com.cn/spreadjs/gc-sjs-samples/index.html
如何写成高性能的代码(一):巧用Canvas绘制电子表格的更多相关文章
- OpenCV x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)
首先参照下面这里进行opencv x64位机器下面的配置 http://wiki.opencv.org.cn/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85O ...
- 使用gfortran将数据写成Grads格式的代码示例
使用gfortran将数据写成Grads格式的代码示例: !-----'Fortran4Grads.f90' program Fortran4Grads implicit none integer,p ...
- JAVA语言之怎样写出高性能的Java代码?
本文主要向大家介绍了JAVA语言之怎样写出高性能的 Java 代码?通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 在这篇文章中,我们将讨论几个有助于提升Java应用程序性能的方法.我 ...
- css中用#id.class的形式定义样式,为什么这样用,不直接写成.class.代码如下:#skin_0.selected{}这种的
<ul class="skin"> <li id="skin_0" title="蓝色" class="sele ...
- CSS Icon 项目地址 小图标-用css写成的
http://cssicon.space/#/icon/focus 这是所有用css写成的 小图标 右侧有 html和css代码
- HTML 5 背离贪吃蛇 写成了类似于屏幕校准
中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...
- ASP.NET的一次奇遇:UserControl写成Control引发的w3wp进程崩溃
昨天在写代码中一不小心将UserControl写成了Control,将原来应该继承自System.Web.UI.UserControl的用户控件,比如下面的BlogStats: <%@ Cont ...
- 如何将oc代码转换成运行时代码
// 运行时 其实就是oc的底层 平时写的代码 最终都是转成底层的运行时代码以下面程序为例子: 如果我们想要看我们的main.m文件底层转换成了怎样的运行时代码 ,我们可以这样做. 1.打开终端 ...
- 如何写出无法维护的代码(JAVA版)
程序命名(针对那些不能混淆的代码) 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, x,y,z,或者干脆上中文比如(阿隆索肯德基) 有创意地拼写错误.比如:SetPint ...
随机推荐
- MYSQL的事务和索引
事务 什么是事务 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行 MySQL事务处理只支持InnoDB和BDB数据表类型 事务的ACID原则 ...
- Quick Pow: 如何快速求幂
今天讲个有趣的算法:如何快速求 \(n^m\),其中 n 和 m 都是整数. 为方便起见,此处假设 m >= 0,对于 m < 0 的情况,求出 \(n^{|m|}\) 后再取倒数即可. ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
- NC14583 糖糖别胡说,我真的不是签到题目
NC14583 糖糖别胡说,我真的不是签到题目 题目 题目描述 从前,有 \(n\) 只萌萌的糖糖,他们分成了两组一起玩游戏.他们会排成一排,第 \(i\) 只糖糖会随机得到一个能力值 \(b_i\) ...
- 边缘计算 KubeEdge+EdgeMash
简介 KubeEdge是面向边缘计算场景.专为边云协同设计的业界首个云原生边缘计算框架,在 Kubernetes 原生的容器编排调度能力之上实现了边云之间的应用协同.资源协同.数据协同和设备协同等能力 ...
- Java开发学习(十二)----基于注解开发依赖注入
Spring为了使用注解简化开发,并没有提供构造函数注入.setter注入对应的注解,只提供了自动装配的注解实现. 1.环境准备 首先准备环境: 创建一个Maven项目 pom.xml添加Spring ...
- 第二天python3 set常用方法
set set的元素要求set的元素必须可hash,目前学过的不可hash的类型有list.set: 1.元素不可以被索引 可变的.无序的.不重复的元素的集合 2.set可以被迭代 set增加 add ...
- [BJDCTF2020]Cookie is so stable-1|SSTI注入
1.打开之后在各个界面查看源代码,未发现很明显的有用信息,仅发现了提示,结果如下: 2.尝试输入数据,结果就是输入什么就回显什么,也未进行过滤,尝试进行sql注入失败,结果如下: 3.那就根据提示抓包 ...
- PHP小工具
防SQL注入 function clean($input) { if (is_array($input)) { foreach ($input as $key => $val) { $outpu ...
- Mac os:将Homebrew的下载源换成国内镜像增加下载速度(阿里云镜像)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_135 可能所有的mac os系统爱好者都遇到过下面这种倒霉情况,在网络环境不太好的时候,你满怀期待的敲下 brew install ...