JavaScript极速狂飙:CSS样式表的渲染效率

2016-02-19 19:45 8 1 收藏

下面这个JavaScript极速狂飙:CSS样式表的渲染效率教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - Web开发 】

  我的MzTreeView1.0树控件发布至今,得到了不少意见反馈,很多网友给了我很多的中肯的建议,也指出了这个控件里的诸多BUG和不足之处,所以我准备写一个新版本的树,将大家的建议都整合进来实现。这几天我就一直在写新版的树,树控件最重要的是效率,特别是大节点量的时候,效率稍微差点的模式就会拖垮浏览器,所以新版的树我首要的还是提高效率,比如增加异步数据加载的支持等,另外我还有一个设想,就是树的树型结构竖线用样式表(背景图)来实现,样式表背景图片只需要加载一次,而现在这个模式(用多个img)图片虽然有缓存机制,但还是有可以每张小图片都请求一次服务器的,所以我想用样式表来实现有多么的好呀,代码又精简,结构又清晰,效果又酷,但是结果我将近一个星期的测试,我这种设想彻底失败,原因就是样式表的渲染效率太差。新的构想没能实现,心情有些沮丧,但我想也应该让大家分享一下这个测试成果。

  这里我再解释一下树型里的竖线,树的左边都有 ┌ ├ └ │ 这些竖线图表示树层次,我的1.0版里是用一张张的小图片堆积起来的,而这种使用样式表的是用div class="l2"/div 这种代码来实现的,样式表负责填充背景图。

  #mtvroot div td{width:20px;height:20px;}
  #mtvroot .l0{background:url(line0.gif) no-repeat center}
  #mtvroot .l1{background:url(line1.gif) no-repeat center}
  #mtvroot .l2{background:url(line2.gif) no-repeat center}
  #mtvroot .l3{background:url(line3.gif) no-repeat center}
  #mtvroot .l4{background:url(line4.gif) no-repeat center}
  #mtvroot .ll{background:url(line5.gif) no-repeat center}
  #mtvroot .pm0{background:url(plus0.gif) no-repeat center}
  #mtvroot .pm1{background:url(plus1.gif) no-repeat center}
  #mtvroot .pm2{background:url(plus2.gif) no-repeat center}
  #mtvroot .pm3{background:url(plus3.gif) no-repeat center}
  #mtvroot .expand .pm0{background:url(minus0.gif) no-repeat center}
  #mtvroot .expand .pm1{background:url(minus1.gif) no-repeat center}
  #mtvroot .expand .pm2{background:url(minus2.gif) no-repeat center}
  #mtvroot .expand .pm3{background:url(minus3.gif) no-repeat center}

  我首先的反应是:是不是用了太多的table影响了效率?因为我每一个节点都用了一个table,但是我把table换成了div、span等,效率没有什么改善,说明这个CPU占用率100%的问题不是HTML标签的问题,那么剩下来的问题就是这里使用了样式表。

  以一个500节点的量来说吧,1.0里左边大概要堆积2000个左右的小图片。这种情况在浏览器端设置本地不缓存的时候会存在很大的问题,要加载这些多的小图片需要消耗不少的时间和服务器资源,所以我才会有这种新的用样式表来解决的想法,现在换成样式表法,也就是大概有2000个地方需要用样式表来渲染出背景图。我测试了各种情况,再对比1.0版的代码得出的结论是:CPU的点用率如此之高,唯一的原因也就只有这种渲染的耗时了。验证也非常简单,我把上面的样式表的左边 #mtvroot 这部分去掉,也就是去掉样式表的依托关系,测试的结果发现效率改善了很多,但耗时依然是可观的,有3-5秒之多。

  另外我换了不同的浏览器,测试的结果也不太一样,在IE里最为恶心,比如说我在某个节点有500子节点,我将它收起(CPU100%,等待3-5秒),也就是display="none",这时候若我去收起这个节点的父节点(这个节点没有其它的同级节点,即它的父节点只有它这么一个子节点),照理说只有一个节点,收起应该是即时的事,但结果不然,结果又是3-5秒的CPU100%,这个让我狂郁闷,也就是说即使HTML对象被display="none"隐藏掉了,但是对它的父级进行任何操作的时候,IE会对这些被隐藏的对象用样式表重新渲染一遍,真是搞不懂IE的开发者当初是怎么想的。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)


  我又到FIREFOX里测试了一下,在收起的时候(display=none)是瞬间的,可以肯定,FF对待被隐藏的对象不会再消耗精力。当然展开的时候所有的浏览器都一样:3-5秒的CPU100%,不过FF稍微要快些。

  通过上面的这些现象我得出这么一个结论:样式表在动态渲染的时候效率并不高;在父容器发现状态变化的时候会引起它的所以子孙对象的样式表重新渲染;FireFox 对待被display=none隐藏的对象不会重新渲染而IE会。

  那么这种样式表的渲染效率问题以前为什么一直没有被发现呢?嘿嘿,大家做网页的时候难得会做到这种极端的时候,一个页面里有几千个需要样式表渲染背景图。通常也就几个地方或者几十个地方了,所以感觉不出来渲染的效率,也感觉不出这方面在不同的浏览器之间的差别。但是在做树这些的控件的时候必定会碰到各种极端的问题,比如大数据量的数组,生成的HTML对象的多少等等,象这种渲染的效率差别也只是我在写JS脚本时碰到的问题之一而已。今天我把这个测试结果共享出来是希望对大家以后写程序的时候有所借荐,在做设计的时候有所考虑。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  最后多谢大家对我写的控件的肯定与支持,谢谢了!

来源:http://www.tulaoshi.com/n/20160219/1621738.html

延伸阅读
标签: Web开发
总结了一下自己工作中使用到的注释书写规范,没有什么技术含量,只是用于统一制作方式,方便维护。包含了区域注释、单行注释、注释层级和协助注释四个部分。 如果大家有其它的建议,欢迎留言。 大部分同学使用的区域注释的方法,会以注释内容开始或注释内容结束、start或end等,相比之下,以S或E开始可以更快的使用,比如只要写一次开始或...
标签: Web开发
一、 去除超级链接的下划线以及在超级链接上实现鼠标悬停变色: 在默认情况下,用DreamWeaver设计的网页中的超级链接都有下划线,看上去不大美观。要去除这些讨厌的下划线,很多报刊介绍的方法都是在HTML源代码中手工加入一段代码,其实在DreamWeave中很容易去除链接的下划线。首先在DreamWeaver的Document Windows中随便建立一个链接...
标签: Web开发
原文: 作者: 有多种方式可以将渐进增强融入到层叠样式表(Cascading Style Sheets, 简称CSS)的工作中,本文将讨论其中比较成功的一些,并考虑采用其它方式来逐步增强你的站点。 样式表的组织 如何在文档中引入样式表,很多Web设计者和开发者并没有想太多,但这其实是一门艺术。使用正确的方法,可以立即获得渐进增强的很多好处。 使...
随着互联网经济的不断发展,互联网上的专业网站、公众服务网站以及企业门户的数量都在飞速的增长,各网站的信息量也呈爆炸性增长的趋势。面对这些庞大的信息量,我们对网页中每一个栏目的增删,都会是一个很复杂的过程。为了提高网页的维护更新效率,我们可以使用样式表,来仅仅改变一个文件,就能达到同时改变几百个网页的外观,而其...
标签: Web开发
定义LI前面的小点样式  view plaincopy to clipboardprint? 语法:   list-style-type : disc | circle | square | decimal | lower-roman | upper-roman | lower-alpha | upper-alpha | none | armenian | cjk-ideographic | georgian | lower-greek | hebrew | hiragana | hiragana-iroha | katakana | katakana-iroha...

经验教程

853

收藏

79
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部