BearRui(AK-47)
花开有时,错过了一日便错过了一季,就象人生错过了相遇,就不再找寻到美丽的相聚
随笔- 39  文章- 2  评论- 1287 
博客园  首页  新随笔  联系  管理  订阅 订阅
名站技术分析 — facebook奇特的页面加载技术

  没事使用代理上了下facebook,注册进入个人首页后,习惯性的查看源代码,发现了1个很有意思的现象,首页内容不少,但源代码中HTML的代码却很少,但去多出了很多段的javascript代码,这些js代码都是用于动态生成html的,facebook为什么需要这样做了?出于职业习惯,研究研究:

 

一、html代码。

     先看看首页查看的源代码,因为源代码比较大,所以把图片压缩了下,可能看不太清楚,只需要注意图中红色是html代码,其余黑压压一片的就全部是JS代码:

 

二、JS代码

     看到黑压压的JS代码是不是被吓一跳,下面就截取一段JS来分析(其余段的JS都是类似的),facebook源代码中充斥了类似于下面的JS代码:

 

<script>
big_pipe.onPageletArrive({
	"id":"pagelet_welcome_box","phase":1,"is_last":false,"append":false,"bootloadable":[],
	"css":["lDRwi","eon+N"],
	"js":["F+B8D","IdQlc"],
	"resource_map":[],"requires":[],"provides":[],
	"onload":["window.__UIControllerRegistry[\"c4c13a3ed2dd1e0e349b72\"] = new UIPagelet(\"c4c13a3ed2dd1e0e349b72\", \"\\\/pagelet\\\/generic.php\\\/WelcomeBoxPagelet\\\/\", {}, {});; ;"],
	"onafterload":[],"onpagecache":[],"onafterpagecache":[],"refresh_pagelets":[],"invalidate_cache":[],
	"content":{
		"pagelet_welcome_box":"<div id=\"c4c13a3ed2dd1e0e349b72\"><div class=\"UIImageBlock clearfix fbxWelcomeBox\"> ...这里省略N多HTML"
		},
	"page_cache":true
});
</script>

 

让我们再看看big_pipe.onPageletArrive函数到底做了什么了?我们只关注参数中的id,js,css,content4个参数,可以看出js和css都是进行过编码,下面是解码后我们关注的代码:

<script>
big_pipe.onPageletArrive({
	"id":"pagelet_welcome_box",
	"css":{
		name: "css/c5mv8gd5gwoc4kk0.pkg.css"
		permanent: true
		src: "http://static.ak.fbcdn.net/rsrc.php/zBP3B/hash/abee68r4.css"
		type: "css"
	},
	"js":{
		name: "js/19khsprwvtvokwow.pkg.js"
		permanent: false
		src: "http://static.ak.fbcdn.net/rsrc.php/zAVXU/hash/e8mwcqsi.js"
		type: "js"
	},
	"content":{
		"pagelet_welcome_box":"<div id=\"c4c13a3ed2dd1e0e349b72\"><div class=\"UIImageBlock clearfix fbxWelcomeBox\"> ...这里省略N多HTML"
		}
});
</script>

看到还原后的JS,你应该猜出onPageletArrive函数是干嘛的吧,其实onPageletArrive最主要实现就是把"content"中的html内容插入到对应id(上面的"pagelet_welcome_box")的html元素中,并下载对应的css和JS。

 

三、chunk、flush

      看到上面的分析后,大家一定奇怪,facebook为什么要生成那么多段JS,再用js去动态插入html代码,这不是脱了裤子放屁,多此一举吗?还不如直接生成html代码了。facebook当然不会那么笨了,让我们先监控下facebook的http请求,监控图如下:

      注意上图中红色部分,原来facebook使用了chunk对页面进行分块输出。这就比较容易理解了,facebook首页的js代码段不是1次就全部输出的,而是一段一段进行输出的。

      什么是chunk和如何使用chunk,请参考我的另1篇博文:flush让页面分块,逐步呈现

 

总结

     facebook使用chunk技术让页面分块输出成很多JS段,这样做的好处就是服务器和客户端可以并行进行处理,不用等服务器全部处理完毕,客户端才进行处理。

     举个博客园首页的列子,博客园首页分为下面几块("推荐博客排行","首页随笔列表","最新新闻"...),

     我们一般对该http请求处理如下:

         1. 浏览器发送http请求

         2. 服务器处理请求(从缓存读取前50个推荐博客,从数据库读取"首页随笔列表",从数据库读取"最新新闻"),生成首页的html代码。

         3. 服务器发送html代码给客户端

         4、浏览器接收到响应,处理html(下载css,js,image,执行js等等)

    可以看出传统的http请求4个过程中,每个过程都必须等待前1个过程完成后才能执行,这样就存在很大的资源浪费。

 

    facebook的对该http请求的处理如下:

        1. 浏览器发送http请求

        2. 服务器处理请求(从缓存读取前50个推荐博客,生成"推荐博客"的js代码段,flush输出该代码段,

      服务器继续读取"首页随笔列表",并生成输入js代码段。

      服务器继续读取"最新新闻",并生成输入js代码段。

        3. 浏览器接收到js代码段,下载该代码段所需的js和css。插入html代码。

     在这个处理流程中,最大的特点就是2,3是并行进行处理的,服务器处理完一部分数据就把已经处理好的数据交给浏览器进行呈现处理,自己再继续处理其他的数据。

 

PS:文章看完了,有些同学可能会想,为什么不像博客园一样,前台全部用ajax来异步读取"推荐博客" ,“最新新闻”的数据了,这样做就不会出现因为要处理太多数据而让客户端等待太久的问题了。我觉得对于facebook这种并发量巨大的网站,使用这种方法无疑会产生太多的请求,比如facebook首页用了14个chunk,如果使用ajax,则需要多14个request请求,这将增加不少服务器的压力吧。     

 

相关文章: 名站技术分析 — 浅谈tudou.com首页图片延迟加载的效果

[作者]:BearRui(AK-47)
[博客]: http://www.cnblogs.com/BearsTaR/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2010-06-18 08:51 BearRui(AK-47) 阅读(17263) 评论(203) 编辑 收藏
发表评论
2270159
评论共3页: 上一页 1 2 3 
 回复 引用 查看   
#104楼 2010-06-18 15:45 | duncannjm      
学习了,顶
 回复 引用 查看   
#105楼 2010-06-18 15:54 | 扶风      
文章很精彩,推荐一下!
 回复 引用 查看   
#106楼[楼主] 2010-06-18 15:57 | BearRui(AK-47)      
谢谢楼上几位支持,^_^
 回复 引用 查看   
#107楼 2010-06-18 16:11 | 疯狂的包子      
文章很精彩,推荐一下!
 回复 引用 查看   
#108楼 2010-06-18 16:11 | 疯狂的包子      
好文章,顶一下!
 回复 引用 查看   
#109楼 2010-06-18 16:11 | 疯狂的包子      
文章写的一般般,:)
 回复 引用 查看   
#110楼 2010-06-18 16:11 | 疯狂的包子      
看不懂哦,~_~
 回复 引用 查看   
#111楼 2010-06-18 16:11 | 疯狂的包子      
博主还需努力啊!
 回复 引用 查看   
#112楼 2010-06-18 16:18 | 东华一只球      
好文章,顶一下!
 回复 引用 查看   
#113楼 2010-06-18 16:31 | 的确小凉      
好文章,顶一下!
 回复 引用 查看   
#114楼 2010-06-18 16:34 | onekey      
好文章,顶一下!
 回复 引用 查看   
#115楼 2010-06-18 16:35 | onekey      
那个http的监控工具是什么?
 回复 引用 查看   
#116楼 2010-06-18 16:42 | 曾祥展      
好文章,顶一下!
 回复 引用 查看   
#117楼 2010-06-18 16:44 | zmxmiss      
好文章,顶一下!
 回复 引用 查看   
#118楼[楼主] 2010-06-18 16:46 | BearRui(AK-47)      
引用onekey:那个http的监控工具是什么?

httpwatch,专业版要收费,免费版功能少一些,所以最好去找注册或者破解版。

 回复 引用 查看   
#119楼 2010-06-18 17:01 | 小驴      
多谢楼主的答复!
 回复 引用 查看   
#120楼 2010-06-18 17:08 | z s k      
好
 回复 引用 查看   
#121楼[楼主] 2010-06-18 17:11 | BearRui(AK-47)      
引用小驴:多谢楼主的答复!

不客气,^_^

 回复 引用 查看   
#122楼 2010-06-18 17:16 | NickLemon      
好文章,顶一下!
 回复 引用 查看   
#123楼 2010-06-18 17:16 | NickLemon      
文章写的一般般,:)
 回复 引用 查看   
#124楼 2010-06-18 17:16 | NickLemon      
看不懂哦,~_~
 回复 引用 查看   
#125楼 2010-06-18 17:16 | NickLemon      
博主还需努力啊!
 回复 引用 查看   
#126楼 2010-06-18 17:16 | NickLemon      
文章很精彩,推荐一下!
 回复 引用 查看   
#127楼 2010-06-18 17:41 | SOSOS's BLog      
好文章,顶一下!
 回复 引用 查看   
#128楼 2010-06-18 17:41 | SOSOS's BLog      
文章写的一般般,:)
 回复 引用 查看   
#129楼 2010-06-18 17:41 | SOSOS's BLog      
看不懂哦,~_~
 回复 引用 查看   
#130楼 2010-06-18 17:41 | SOSOS's BLog      
博主还需努力啊!
 回复 引用 查看   
#131楼 2010-06-18 17:41 | SOSOS's BLog      
文章很精彩,推荐一下!
 回复 引用 查看   
#132楼 2010-06-18 17:45 | xiaosuo      
牛B
 回复 引用 查看   
#133楼[楼主] 2010-06-18 17:52 | BearRui(AK-47)      
乱点的人越来越多了,~_~
 回复 引用 查看   
#134楼 2010-06-18 17:53 | 阿K&LiveCai      
好文章,顶一下!
 回复 引用 查看   
#135楼 2010-06-18 18:36 | jordan51341      
好文章,顶一下!
 回复 引用 查看   
#136楼 2010-06-18 18:39 | 邓三皮      
好文章,顶一下!
 回复 引用 查看   
#137楼 2010-06-18 19:11 | yqpeng      
好文章,顶一下!
 回复 引用 查看   
#138楼 2010-06-18 20:28 | TonyWang      
看不懂哦,~_~
 回复 引用 查看   
#139楼 2010-06-18 20:28 | TonyWang      
文章写的一般般,:)
 回复 引用 查看   
#140楼 2010-06-18 20:28 | TonyWang      
好文章,顶一下!
 回复 引用 查看   
#141楼 2010-06-18 20:28 | TonyWang      
文章很精彩,推荐一下!
 回复 引用 查看   
#142楼 2010-06-18 20:28 | TonyWang      
博主还需努力啊!
 回复 引用 查看   
#143楼 2010-06-18 21:00 | ilovedotnet      
文章很精彩,推荐一下!
 回复 引用 查看   
#144楼 2010-06-18 21:17 | wisenwu      
好文章,顶一下!
 回复 引用 查看   
#145楼 2010-06-18 21:17 | wisenwu      
文章写的一般般,:)
 回复 引用 查看   
#146楼 2010-06-18 21:17 | wisenwu      
看不懂哦,~_~
 回复 引用 查看   
#147楼 2010-06-18 21:17 | wisenwu      
博主还需努力啊!
 回复 引用 查看   
#148楼 2010-06-18 21:17 | wisenwu      
文章很精彩,推荐一下!
 回复 引用 查看   
#149楼 2010-06-18 23:18 | 小未      
文章很精彩,推荐一下!
 回复 引用 查看   
#150楼 2010-06-18 23:25 | IT鸟      
好文章 我想收藏下,可惜没找到按钮。
 回复 引用 查看   
#151楼[楼主] 2010-06-18 23:50 | BearRui(AK-47)      
引用IT鸟:好文章 我想收藏下,可惜没找到按钮。

建议不错,下次把收藏按钮也加上去。

 回复 引用 查看   
#152楼 2010-06-19 00:01 | 木由水      
看不懂哦,~_~
 回复 引用 查看   
#153楼 2010-06-19 00:01 | 木由水      
博主还需努力啊!
 回复 引用 查看   
#154楼 2010-06-19 00:01 | 木由水      
文章写的一般般,:)
 回复 引用 查看   
#155楼 2010-06-19 00:01 | 木由水      
好文章,顶一下!
 回复 引用 查看   
#156楼 2010-06-19 00:01 | 木由水      
文章很精彩,推荐一下!
 回复 引用 查看   
#157楼 2010-06-19 04:42 | Darryn      
好文章,顶一下!
 回复 引用 查看   
#158楼 2010-06-19 07:10 | Motto(Momo)      
好文章,顶一下!
 回复 引用 查看   
#159楼 2010-06-19 12:31 | 不误正业      
第一张图片很有震撼力啊
 回复 引用 查看   
#160楼[楼主] 2010-06-19 12:58 | BearRui(AK-47)      
引用不误正业:第一张图片很有震撼力啊

呵呵,是啊,图片还是压缩很小的,如果不压缩,震撼力更强啊。

 回复 引用 查看   
#161楼 2010-06-19 16:51 | duwamish      
好文章,顶一下!
 回复 引用 查看   
#162楼 2010-06-19 16:51 | duwamish      
文章写的一般般,:)
 回复 引用 查看   
#163楼 2010-06-19 16:51 | duwamish      
看不懂哦,~_~
 回复 引用 查看   
#164楼 2010-06-19 16:51 | duwamish      
博主还需努力啊!
 回复 引用 查看   
#165楼 2010-06-19 16:51 | duwamish      
文章很精彩,推荐一下!
 回复 引用 查看   
#166楼 2010-06-20 14:36 | 张少峰      
好文章,顶一下!
 回复 引用 查看   
#167楼 2010-06-21 09:37 | 亦续缘      
推荐一篇文章
http://ued.koubei.com/?p=1193

 回复 引用 查看   
#168楼[楼主] 2010-06-21 09:44 | BearRui(AK-47)      
引用亦续缘:
推荐一篇文章
http://ued.koubei.com/?p=1193


我也写过一篇关于JS,CSS合并的文章,可以参考下:
http://www.blogjava.net/BearRui/archive/2010/05/04/js_css_merge_compress_cache.html

 回复 引用 查看   
#169楼 2010-06-21 09:45 | 亦续缘      
@BearRui(AK-47)
谢谢,学习中...

 回复 引用 查看   
#170楼 2010-06-21 09:52 | vruc      
文章写的一般般,:)
 回复 引用 查看   
#171楼 2010-06-21 09:52 | vruc      
看不懂哦,~_~
 回复 引用 查看   
#172楼 2010-06-21 09:52 | vruc      
博主还需努力啊!
 回复 引用 查看   
#173楼 2010-06-21 09:52 | vruc      
好文章,顶一下!
 回复 引用 查看   
#174楼 2010-06-21 09:52 | vruc      
文章很精彩,推荐一下!
 回复 引用 查看   
#175楼[楼主] 2010-06-21 10:00 | BearRui(AK-47)      
引用亦续缘:
@BearRui(AK-47)
谢谢,学习中...


共同学习,^_^

 回复 引用 查看   
#176楼 2010-06-21 14:06 | 黑羽飘舞      
博主还需努力啊!
 回复 引用 查看   
#177楼 2010-06-21 14:35 | icjyw.com      
好文
 回复 引用 查看   
#178楼[楼主] 2010-06-21 14:43 | BearRui(AK-47)      
呵呵,谢谢楼上几位支持。
 回复 引用 查看   
#179楼 2010-06-21 16:27 | leif      
好文章,顶一下!
 回复 引用 查看   
#180楼 2010-06-21 16:27 | leif      
文章很精彩,推荐一下!
 回复 引用 查看   
#181楼 2010-06-21 20:58 | 洛可可      
@木由水
你的回复好矛盾啊

 回复 引用 查看   
#182楼[楼主] 2010-06-21 21:00 | BearRui(AK-47)      
引用洛可可:
@木由水
你的回复好矛盾啊

呵呵,他们都是乱点的玩的。

 回复 引用 查看   
#183楼 2010-06-22 15:56 | 小善      
看不懂哦,~_~
 回复 引用 查看   
#184楼 2010-06-22 15:56 | 小善      
文章写的一般般,:)
 回复 引用 查看   
#185楼 2010-06-22 15:56 | 小善      
好文章,顶一下!
 回复 引用 查看   
#186楼 2010-06-22 15:56 | 小善      
文章很精彩,推荐一下!
 回复 引用 查看   
#187楼 2010-06-22 15:56 | 小善      
博主还需努力啊!
 回复 引用 查看   
#188楼 2010-06-23 00:56 | mashihua      

facebook的架构不是每一个站点都合适,BigPipe确实是因为chuncked添加了不少引人注意的特性,六个月让网站性能加快2倍。

不过http watcher不能捕获每一块chuncked的内容也是一种缺陷。如果没有实际的看过每一块chunck块,就单凭14个chunck断定是因为http中transfer-encoding的特性帮助了facebook的性能。有点武断。

反过来说淘宝首页有6-7个chunck,是否淘宝也是得益于此,我看只能是一部分。淘宝是采用auto flush的方式,淘宝的第一块chunck结束是在内联样式表的中间。相比google的搜索结果页就相对比较高明了,手动flush的。

 回复 引用 查看   
#189楼[楼主] 2010-06-23 09:11 | BearRui(AK-47)      
@mashihua
httpwatch 是可以监控到每个chunck的内容的,我在flush chunk的文章就解释过,chunk的结构:
chunk #1(这里通常是16进制的数字,标志这个块的大小)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"....

chunk #2
<div .....

chunk #3
....</body></html>

httpwatch的stream中可以看出这样的结果,但因为一般网站都启用了gzip,所以stream中看到的结果是压缩后的结果,并不是明文,需要解压。

其实我这篇文章并没有说这个功能对facebook的性能有多大提升,因为这个我也不知道是不是提升了,提升了多少,只是讨论它使用的这个技术可以让服务器和客户端并行进行处理。这个想法很不错,至于性能,可能每个网站使用相同的方法,结果可能都不一样。

监控了下,没发现淘宝的首页使用了chunk,其实很多http服务器都支持auto flush,比如apache,不过这种方式并不好,一般这种方式是判断当前缓存池中数据到了一定数量就flush出去,对于flush,我也觉得应该使用手动的比较好。

 回复 引用 查看   
#190楼 2010-06-24 16:17 | Tear Y      
好文章,顶一下!
 回复 引用 查看   
#191楼 2010-06-24 16:29 | loveu0508      
我发现自己看的越多 自己不懂的也越多
 回复 引用 查看   
#192楼[楼主] 2010-06-24 16:31 | BearRui(AK-47)      
@loveu0508
主要是技术更新太快了,^_^

 回复 引用 查看   
#193楼 2010-06-24 18:00 | mashihua      
对不起,我把http watcher的功能察看每一块chunck内容当成了捕获每一块chunck。我记得是没有一个工具实现过gzip压缩的chunck内容察看。


facebook性能是提升了:http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919

淘宝我察看了是6块chunck.它使用auto flush,buffer大小是8096bytes。

手动成本高,自动成本低。效果来说是手动好。
amazom :
http://www.phpied.com/wp-content/uploads/2009/12/amazon.png


我认为不是所有的站点都适合facebook这个架构。

 回复 引用 查看   
#194楼[楼主] 2010-06-24 18:53 | BearRui(AK-47)      
@mashihua
其实使用facebook这个架构,后台要写的代码要比一般架构要写的多很多,开发效率估计应该会比较低。

facebook的地址要翻墙才能看啊,公司翻不了,暂时还看不到。

 回复 引用 查看   
#195楼 2010-06-25 09:33 | xuyuanever      
好文章,顶一下!
 回复 引用 查看   
#196楼 2010-08-08 00:26 | xcntime      
LZ说的太经典了,又学习了哈
 回复 引用 查看   
#197楼[楼主] 2010-08-08 00:38 | BearRui(AK-47)      
@xcntime
谢谢夸奖,^_^

 回复 引用 查看   
#198楼 2010-08-18 16:42 | jixilq      
感谢lz的分享 有一个关于chunk 和 flush 的问题就是可以在服务器生成好了一个平pagelet的内容后就flush个客户端,为什么要用json的格式传送过去然后再用js库去解析呢 我是菜鸟
 回复 引用 查看   
#199楼[楼主] 2010-08-18 21:42 | BearRui(AK-47)      
@jixilq
呵呵,一看就是老鸟,菜鸟不会提出这种问题的。

我个人觉的可能有下面2个原因:
1. 如果chunk直接输出html,如果模块比较多,模块间必须按顺序加载,在html前面的模块必须先加载完,后面的才能加载,这样也就没办法每个模块同时显示loading标志。比如下面的html:
<div id="div1"></div><div id="div2"></div><div id="div3"></div>.
假设上面3个div分别代表3个模块,如果直接chunk输出html的话,必须先加载完毕div1模块中的数据flush出去后,才能继续加载div2再flush,如果flush顺序不一样,输出的html结构肯定就会出问题,这样就导致前台页面没办法同时显示3个loading。因为这样flush必须要有先后顺序。而如果采用JS的话,可以前台显示3个loading,而且不需要关心到底哪个模块先加载完,这样还能发挥后台多线程处理数据的优势。

2. 使用JS这种方式可以采用通用的JS和后台处理方式,管理方便些。

 回复 引用 查看   
#200楼 2010-08-19 15:14 | jixilq      
@BearRui(AK-47)
呵呵,您太抬举我了,我真的是刚刚开始看这块儿内容,有很多内容不明白。一开始是看的那篇BigPipe的文章,觉得挺有意思,想自己实现一下。网上搜了一下,资料很少,就到这儿来了,还是感谢lz的分享及回答。
还有个问题,就是big_pipe.onPageletArrive()函数中的"css":["lDRwi","eon+N"]是如何解析成"css":{
name: "css/c5mv8gd5gwoc4kk0.pkg.css"
permanent: true
src:"http://static.ak.fbcdn.net/rsrc.php/zBP3B/hash/abee68r4.css"
type: "css"
}的 还望指教,多谢了

 回复 引用 查看   
#201楼[楼主] 2010-08-20 10:48 | BearRui(AK-47)      
@jixilq
关于解码,其实很简单,facebook是把每种编码对应的值都先写入了1个对象中,比如:allItem = {"lDRwi":"css/c5mv8gd5gwoc4kk0.pkg.css","eon+N":"js"}

然后解码的时候直接从allItem中获取对应的值就是了。

 回复 引用 查看   
#202楼 2011-07-19 16:26 | 刘喜东.php      
强啊,这思路。人的智慧真是美妙啊。
 回复 引用 查看   
#203楼 2011-12-14 17:06 | nope      
赞LZ
评论共3页: 上一页 1 2 3 
刷新评论列表  刷新页面  返回页首
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

验证码: 验证码 看不清,换一个

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1757393 2W6MOTwMDQ0=
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· Chrome将给老机带来更快的3D绘图性能
· 在线支付创业公司Stripe获红杉资本等1800万美元的投资,公司估值达1亿美元
· 创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》
· 霍金的伟大与不幸
· Linux为什么成功?因为它的失败是免费的!
» 更多新闻...
最新知识库文章:
· 高级编程语言的发展历程
· 如何学习一门新的编程语言?
· 学习不同编程语言的重要性
· 为什么我喜欢富于表达性的编程语言
· 计算机专业的女生为什么要学编程
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务

抓虾
google reader
鲜果
哪吒
QQ邮箱
http://wap.feedsky.com/BearRui
昵称:BearRui(AK-47)
园龄:5年10个月
荣誉:推荐博客
粉丝:124
关注:3

搜索

 

最新随笔

  • 1. 产生唯一随机码的方法分析。
  • 2. URL中允许携带sessionid带来的安全隐患。
  • 3. JS 实现完美include
  • 4. 基于模板的excel导出
  • 5. 实现if elseif else的jsp标签。
  • 6. 记一复杂页面的前端优化(2) - 其他优化
  • 7. 记一复杂页面的前端优化(1) - 不一样的延迟加载
  • 8. 名站技术分析 — tudou网首页下列菜单的弹出效果
  • 9. LESS 让css也支持变量,运算符,include,嵌套规则等等
  • 10. CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能

随笔分类(38)

  • .NET(11)
  • CSS(3)
  • JAVA(2)
  • javascript(4)
  • Life(5)
  • WEB(4)
  • 高性能WEB开发(5)
  • 浏览器(1)
  • 名站技术分析(3)

随笔档案(39)

  • 2010年10月 (1)
  • 2010年8月 (3)
  • 2010年7月 (5)
  • 2010年6月 (4)
  • 2010年5月 (6)
  • 2006年6月 (4)
  • 2006年5月 (7)
  • 2006年4月 (9)

积分与排名

  • 积分 - 178236
  • 排名 - 485

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Copyright ©2012 BearRui(AK-47)