<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>小李刀刀博客</title>
	
	<link>http://wukangrui.com</link>
	<description>独立 自由 诚信 宽容 责任 平常心</description>
	<lastBuildDate>Wed, 09 Jun 2010 10:44:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/wukangrui" /><feedburner:info uri="wukangrui" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>wukangrui</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>最近的书单</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/ViPRJAzYLIw/my-rencent-booklist.html</link>
		<comments>http://wukangrui.com/2010/06/09/my-rencent-booklist.html#comments</comments>
		<pubDate>Wed, 09 Jun 2010 10:44:08 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[点滴珍藏]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[图书]]></category>
		<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2010/06/09/my-rencent-booklist.html</guid>
		<description><![CDATA[好久没看书了，一直以来喜欢睡觉前、如厕时看点书，于是前几天到学校图书馆翻了翻，还算不错，虽然没有什么新书，但是翻出一堆可以看看的书。简单列一下：
 
《重构HTML——改善Web应用的设计》：来自Adobe的一本关于网页重构的书，这本书虽然是讲如何对编写混乱的HTML代码进行重构的书，但是其中的很多东西其实对于加深对web标准化、语义化的理解很有帮助。其中的很多章节也都是HTML结构设计的很好的实践。这本书没多少深度，基本上对于在标准化、语义化方面有一定基础的读者帮助不大。
《CSS终极参考手册》：这本书可以当作《CSS权威指南》的补充读物，涵盖了CSS2.1和CSS3已实现的特性。主要优点在于对每个知识点的讲解都比较注重实用性，而且其中对不同浏览器厂商的特有属性以及浏览器兼容性问题有较细致的说明。即使是很熟练的网页重构人员，偶尔翻翻还是会有收益的。
《高性能网站建设指南》：这本书实际上是对yahoo关于改善网站性能的34条建议（或者说34个最佳实践）的细致阐述。如果光看了网上的雅虎34条之后觉得还需要更详细的讲解，可以看看这本书。
《JavaScript DOM编程艺术》：这本书不适合于前端开发工程师，但是比较适合以前只做网页重构的人员学习JavaScript。如果你的JavaScript基础不好，或者是初次接触JavaScript，主要用于操作DOM树，那么倒是值得一看。如果你本来已经很熟悉JavaScript，有较丰富的Ajax实践了，那么这本书对你基本上没有价值。
《JavaScript设计模式》：这本书可以算是这次列出的书单里最有深度的一本，适合初、中级前端开发人员阅读。其中对JavaScript的面向对象特征，各种设计模式在JavaScript中的实现做了深入讲解。这本书中对“接口”、“继承”、“方法的链式调用”等概念的讲解，绝对能引起web前端开发工程师的兴趣。如果你是从其它编程语言转到JavaScript，或者以前从来没有接触过JavaScript中的这些高级概念，绝对值得一读。
相关日志2009-12-21 -- 前台开发从头说起：理解css盒模型2009-12-16 -- 前台开发从头说起：谈谈CSS选择符2009-12-15 -- 前台开发从头说起：关于web标准化2009-06-22 -- Whatever:hover &#8211; 无需javascript让IE支持丰富伪类2009-04-13 -- 简单、通用的JQuery Tab实现2007-03-01 -- 好书推荐：《别具光芒：DIV+CSS网页布局与美化》2006-04-04 -- 动态实现指定图片半透明及鼠标事件2009-04-16 -- 来自微软站点的纯CSS下拉菜单2009-04-09 -- [翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用2009-04-05 -- 使用Google AjaxLib API托管的js库]]></description>
			<content:encoded><![CDATA[<p>好久没看书了，一直以来喜欢睡觉前、如厕时看点书，于是前几天到学校图书馆翻了翻，还算不错，虽然没有什么新书，但是翻出一堆可以看看的书。简单列一下：</p>
<p> <span id="more-943"></span>
<p><a href="http://www.china-pub.com/195744" rel="nofollow" target="_blank">《重构HTML——改善Web应用的设计》</a>：来自Adobe的一本关于网页重构的书，这本书虽然是讲如何对编写混乱的HTML代码进行重构的书，但是其中的很多东西其实对于加深对web标准化、语义化的理解很有帮助。其中的很多章节也都是HTML结构设计的很好的实践。这本书没多少深度，基本上对于在标准化、语义化方面有一定基础的读者帮助不大。</p>
<p><a href="http://www.china-pub.com/46894" rel="nofollow" target="_blank">《CSS终极参考手册》</a>：这本书可以当作《CSS权威指南》的补充读物，涵盖了CSS2.1和CSS3已实现的特性。主要优点在于对每个知识点的讲解都比较注重实用性，而且其中对不同浏览器厂商的特有属性以及浏览器兼容性问题有较细致的说明。即使是很熟练的网页重构人员，偶尔翻翻还是会有收益的。</p>
<p><a href="http://www.china-pub.com/39986" rel="nofollow" target="_blank">《高性能网站建设指南》</a>：这本书实际上是对yahoo关于改善网站性能的34条建议（或者说34个最佳实践）的细致阐述。如果光看了网上的雅虎34条之后觉得还需要更详细的讲解，可以看看这本书。</p>
<p><a href="http://www.china-pub.com/32981" rel="nofollow" target="_blank">《JavaScript DOM编程艺术》</a>：这本书不适合于前端开发工程师，但是比较适合以前只做网页重构的人员学习JavaScript。如果你的JavaScript基础不好，或者是初次接触JavaScript，主要用于操作DOM树，那么倒是值得一看。如果你本来已经很熟悉JavaScript，有较丰富的Ajax实践了，那么这本书对你基本上没有价值。</p>
<p><a href="http://www.china-pub.com/508886" rel="nofollow" target="_blank">《JavaScript设计模式》</a>：这本书可以算是这次列出的书单里最有深度的一本，适合初、中级前端开发人员阅读。其中对JavaScript的面向对象特征，各种设计模式在JavaScript中的实现做了深入讲解。这本书中对“接口”、“继承”、“方法的链式调用”等概念的讲解，绝对能引起web前端开发工程师的兴趣。如果你是从其它编程语言转到JavaScript，或者以前从来没有接触过JavaScript中的这些高级概念，绝对值得一读。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-21 -- <a href="http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-06-22 -- <a href="http://wukangrui.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li><li>2009-04-13 -- <a href="http://wukangrui.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2007-03-01 -- <a href="http://wukangrui.com/2007/03/01/good-book-for-css-layout.html" title="好书推荐：《别具光芒：DIV+CSS网页布局与美化》">好书推荐：《别具光芒：DIV+CSS网页布局与美化》</a></li><li>2006-04-04 -- <a href="http://wukangrui.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2009-04-16 -- <a href="http://wukangrui.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-09 -- <a href="http://wukangrui.com/2009/04/09/aspnetmvc-hands-on-labs-create-application.html" title="[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用</a></li><li>2009-04-05 -- <a href="http://wukangrui.com/2009/04/05/use-google-ajaxlib-api.html" title="使用Google AjaxLib API托管的js库">使用Google AjaxLib API托管的js库</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/ViPRJAzYLIw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2010/06/09/my-rencent-booklist.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2010/06/09/my-rencent-booklist.html</feedburner:origLink></item>
		<item>
		<title>HTML5时代的div</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/j7YuVi1BbpY/div-in-html5.html</link>
		<comments>http://wukangrui.com/2010/06/02/div-in-html5.html#comments</comments>
		<pubDate>Wed, 02 Jun 2010 06:22:39 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[web标准]]></category>
		<category><![CDATA[语义化]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2010/06/02/html5%e6%97%b6%e4%bb%a3%e7%9a%84div.html</guid>
		<description><![CDATA[div，作为web标准化进程中大火大热的HTML标签，在完成了取代table布局的使命之后，在强调语义化的今天，开始成为被滥用得最多的标签。HTML5新增的标签中，有一大部分是为了取代HTML4里的div使用场景。比如：&#60;header&#62;、&#60;footer&#62;、&#60;aside&#62;、&#60;section&#62;、&#60;nav&#62;等。那么div还有存在的意义吗？如果有，又该在什么情况下使用呢？本文尝试对这个问题做一点分析。仅代表个人观点。

要考虑语义化的div，首先想到的当然是div的语义到底是什么。根据w3c的文档，div没有任何语义，它仅描述它所包含的成员，可以通过class、lang、title等属性来标注其语义。在使用上，它用来标注一组连贯的（关联的？）元素。
The div element has no special meaning at all. It represents its children. It can be used with the class, lang, and title attributes to mark up semantics common to a group of consecutive elements.

但是在这段文字下，w3c又用更为醒目的文字做了补充说明：
Authors are strongly encouraged to view the div element as an element of last resort, for when no other element is [...]]]></description>
			<content:encoded><![CDATA[<p>div，作为web标准化进程中大火大热的HTML标签，在完成了取代table布局的使命之后，在强调语义化的今天，开始成为被滥用得最多的标签。HTML5新增的标签中，有一大部分是为了取代HTML4里的div使用场景。比如：&lt;header&gt;、&lt;footer&gt;、&lt;aside&gt;、&lt;section&gt;、&lt;nav&gt;等。那么div还有存在的意义吗？如果有，又该在什么情况下使用呢？本文尝试对这个问题做一点分析。仅代表个人观点。</p>
<p><span id="more-939"></span>
<p>要考虑语义化的div，首先想到的当然是div的语义到底是什么。根据<a title="the definetion of div element" href="http://www.w3.org/TR/2010/WD-html5-20100304/semantics.html#the-div-element" rel="reference" target="_blank">w3c的文档</a>，div没有任何语义，它仅描述它所包含的成员，可以通过class、lang、title等属性来标注其语义。在使用上，它用来标注一组连贯的（关联的？）元素。</p>
<blockquote><p>The <code><a href="http://www.w3.org/#the-div-element">div</a></code> element has no special meaning at all. It <a href="http://www.w3.org/the-xhtml-syntax.html#represents">represents</a> its children. It can be used with the <code><a href="http://www.w3.org/dom.html#classes">class</a></code>, <code><a href="http://www.w3.org/dom.html#attr-lang">lang</a></code>, and <code><a href="http://www.w3.org/dom.html#the-title-attribute">title</a></code> attributes to mark up semantics common to a group of consecutive elements.</p>
</blockquote>
<p>但是在这段文字下，w3c又用更为醒目的文字做了补充说明：</p>
<blockquote><p>Authors are strongly encouraged to view the <code><a href="http://www.w3.org/#the-div-element">div</a></code> element as an element of last resort, for when no other element is suitable. Use of the <code><a href="http://www.w3.org/#the-div-element">div</a></code> element instead of more appropriate elements leads to poor accessibility for readers and poor maintainability for authors.</p>
</blockquote>
<p>由此可见，并不提倡大量使用，到处使用div。在有更合适的元素下，使用div会导致可访问性和可维护性的降低。从这个意义上说，滥用div比恰当使用table的危害更大。因为table毕竟是有明确语义，有明确使用场景的。但是div依然是必不可少的，因为对于复杂的文档结构来说（尤其网页毕竟不是纯粹的文档），我们在网页重构过程中经常会遇到找不到恰当语义的元素的情况，这时候，使用div是没办法下的办法。但是，应该使用title、class、lang（文档没有提到id）等属性来赋予其语义。</p>
<p>比如：网页分为页眉(header)、主体(body)、页脚(footer)，我们现在有了header、footer，缺没有对应于主体的标签（body已经用于文档内容的根元素了），这时候，用article或者section显然不符合语义，那么，选择div就是不错的选择。比如：</p>
<pre style="background: #2e2e2e" class="code"><span style="color: white">&lt;!</span><span style="color: #be5663">DOCTYPE </span><span style="color: #ff8040">html PUBLIC </span><span style="color: #fff9a8">"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: white">&gt;
&lt;</span><span style="color: #be5663">html </span><span style="color: #ff8040">xmlns</span><span style="color: white">=</span><span style="color: #fff9a8">"http://www.w3.org/1999/xhtml"</span><span style="color: white">&gt;
&lt;</span><span style="color: #be5663">head</span><span style="color: white">&gt;
&lt;</span><span style="color: #be5663">title</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">Untitled Page</span><span style="color: white">&lt;/</span><span style="color: #be5663">title</span><span style="color: white">&gt;
&lt;/</span><span style="color: #be5663">head</span><span style="color: white">&gt;
&lt;</span><span style="color: #be5663">body</span><span style="color: white">&gt;
&lt;</span><span style="color: #be5663">header</span><span style="color: white">&gt;
  &lt;</span><span style="color: #be5663">h1</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">文档标题</span><span style="color: white">&lt;/</span><span style="color: #be5663">h1</span><span style="color: white">&gt;
  &lt;</span><span style="color: #be5663">nav </span><span style="color: #ff8040">id</span><span style="color: white">=</span><span style="color: #fff9a8">"global"</span><span style="color: white">&gt;    &lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"news.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">新闻</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt; </span><span style="color: #d3d3d3">-     </span><span style="color: white">&lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"blog.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">博客</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt; </span><span style="color: #d3d3d3">-     </span><span style="color: white">&lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"forums.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">论坛</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt;  &lt;/</span><span style="color: #be5663">nav</span><span style="color: white">&gt;
  &lt;</span><span style="color: #be5663">p</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">最后修改:
    </span><span style="color: white">&lt;</span><span style="color: #be5663">time</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">2009-04-01</span><span style="color: white">&lt;/</span><span style="color: #be5663">time</span><span style="color: white">&gt;
  &lt;/</span><span style="color: #be5663">p</span><span style="color: white">&gt;
  &lt;</span><span style="color: #be5663">nav </span><span style="color: #ff8040">id</span><span style="color: white">=</span><span style="color: #fff9a8">"local"</span><span style="color: white">&gt;
    &lt;</span><span style="color: #be5663">h1</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">导航</span><span style="color: white">&lt;/</span><span style="color: #be5663">h1</span><span style="color: white">&gt;
    &lt;</span><span style="color: #be5663">ul</span><span style="color: white">&gt;
      &lt;</span><span style="color: #be5663">li</span><span style="color: white">&gt;&lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"articles.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">所有文章</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt;&lt;/</span><span style="color: #be5663">li</span><span style="color: white">&gt;
      &lt;</span><span style="color: #be5663">li</span><span style="color: white">&gt;&lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"whatsnew.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">最新文章</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt;&lt;/</span><span style="color: #be5663">li</span><span style="color: white">&gt;
      &lt;</span><span style="color: #be5663">li</span><span style="color: white">&gt;&lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"elite.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">精华推荐</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt;&lt;/</span><span style="color: #be5663">li</span><span style="color: white">&gt;
    &lt;/</span><span style="color: #be5663">ul</span><span style="color: white">&gt;
  &lt;/</span><span style="color: #be5663">nav</span><span style="color: white">&gt;
&lt;/</span><span style="color: #be5663">header</span><span style="color: white">&gt;
<strong><em>&lt;</em></strong></span><span style="color: #be5663"><strong><em>div</em></strong></span><span style="color: white"><strong><em>&gt;</em></strong>
  &lt;</span><span style="color: #be5663">article</span><span style="color: white">&gt;
    &lt;</span><span style="color: #be5663">header</span><span style="color: white">&gt;
      &lt;</span><span style="color: #be5663">h1</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">文章标题</span><span style="color: white">&lt;/</span><span style="color: #be5663">h1</span><span style="color: white">&gt;
    &lt;/</span><span style="color: #be5663">header</span><span style="color: white">&gt;
    &lt;</span><span style="color: #be5663">div</span><span style="color: white">&gt;
      &lt;</span><span style="color: #be5663">p</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">Today I went to the beach and had a lot of fun.</span><span style="color: white">&lt;/</span><span style="color: #be5663">p</span><span style="color: white">&gt;
      </span><span style="color: #d3d3d3">...更多内容... </span><span style="color: white">&lt;/</span><span style="color: #be5663">div</span><span style="color: white">&gt;
    &lt;</span><span style="color: #be5663">footer</span><span style="color: white">&gt;
      &lt;</span><span style="color: #be5663">p</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">发表于
        </span><span style="color: white">&lt;</span><span style="color: #be5663">time </span><span style="color: #ff8040">pubdate datetime</span><span style="color: white">=</span><span style="color: #fff9a8">"2009-10-10T14:36-08:00"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">星期二</span><span style="color: white">&lt;/</span><span style="color: #be5663">time</span><span style="color: white">&gt;
        </span><span style="color: #d3d3d3">.</span><span style="color: white">&lt;/</span><span style="color: #be5663">p</span><span style="color: white">&gt;
    &lt;/</span><span style="color: #be5663">footer</span><span style="color: white">&gt;
  &lt;/</span><span style="color: #be5663">article</span><span style="color: white">&gt;
  </span><span style="color: #d3d3d3">...更多文章... </span><span style="color: white">&lt;/</span><span style="color: #be5663">div</span><span style="color: white">&gt;
&lt;</span><span style="color: #be5663">footer</span><span style="color: white">&gt;
  &lt;</span><span style="color: #be5663">p</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">Copyright © 2010 公司名称</span><span style="color: white">&lt;/</span><span style="color: #be5663">p</span><span style="color: white">&gt;
  &lt;</span><span style="color: #be5663">nav </span><span style="color: #ff8040">id</span><span style="color: white">=</span><span style="color: #fff9a8">"about"</span><span style="color: white">&gt;
    &lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"about.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">About</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt; </span><span style="color: #d3d3d3">-
    </span><span style="color: white">&lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"policy.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">Privacy Policy</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt; </span><span style="color: #d3d3d3">-
    </span><span style="color: white">&lt;</span><span style="color: #be5663">a </span><span style="color: #ff8040">href</span><span style="color: white">=</span><span style="color: #fff9a8">"contact.html"</span><span style="color: white">&gt;</span><span style="color: #d3d3d3">Contact Us</span><span style="color: white">&lt;/</span><span style="color: #be5663">a</span><span style="color: white">&gt;
  &lt;/</span><span style="color: #be5663">nav</span><span style="color: white">&gt;
&lt;/</span><span style="color: #be5663">footer</span><span style="color: white">&gt;
&lt;/</span><span style="color: #be5663">body</span><span style="color: white">&gt;
&lt;/</span><span style="color: #be5663">html</span><span style="color: white">&gt;</span><span></pre>
<p>请关注这个HTML（来自w3c官方网站）结构，根据w3c的说明，div在这里用于包装页面上除了页眉和页脚之外的所有内容，以及包装文章中除了文章的头和尾之间的所有内容。w3c说明的原文如下：</p>
<blockquote><p>Notice the <code><a href="http://www.w3.org/#the-div-element">div</a></code> elements being used to wrap all the contents of the page other than the header and footer, and all the contents of the blog entry other than its header and footer.</p>
</blockquote>
<p>对于div在HTML5中的应用，个人觉得这个文档结构已经给出了非常明确的例子。</p>
<p>小小的总结一下：div在HTML5中与在HTML4中的用途变化不大，除了已经有明确语义的新元素能够承担责任（比如header、footer、nav）之外，要将一组彼此关联的内容作为一个整体的时候，仍然适用div。</p>
<p></span></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-21 -- <a href="http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-10-13 -- <a href="http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html" title="关于web标准化的一些误区">关于web标准化的一些误区</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/j7YuVi1BbpY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2010/06/02/div-in-html5.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2010/06/02/div-in-html5.html</feedburner:origLink></item>
		<item>
		<title>Visual Studio 2010 Ultimate RTM 版开放MSDN下载</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/ZzGZH1GxRec/vs2010-rtm-avaliable-on-msdn.html</link>
		<comments>http://wukangrui.com/2010/04/14/vs2010-rtm-avaliable-on-msdn.html#comments</comments>
		<pubDate>Tue, 13 Apr 2010 20:31:51 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2010/04/14/vs2010-rtm-avaliable-on-msdn.html</guid>
		<description><![CDATA[在4月12日召开盛大的发布会之后，微软很快在官方网站开始提供Visual Studio 2010版相关试用版本的下载，MSDN的下载也已经提供。不过目前暂时没有中文版。]]></description>
			<content:encoded><![CDATA[<p>在4月12日召开盛大的发布会之后，微软很快在官方网站开始提供Visual Studio 2010版相关试用版本的下载，MSDN的下载也已经提供。不过目前暂时没有中文版。</p>
<p> <span id="more-924"></span>
<p>MSDN上的已经提供了Visual Studio 2010版全系列及.NET Framework 4.0相关的所有产品的下载。中文语言的暂时还没有任何项目。</p>
<p align="center"><a href="http://file.wukangrui.com/attachments/2010/04/image8.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image_thumb7.png" width="523" height="112" /></a> </p>
<p align="left">以下为ultimate版的文件信息：</p>
<blockquote><p><em>文件名 en_visual_studio_2010_ultimate_x86_dvd_509116.iso</em></p>
<p><em>发布日期 (UTC): 4/12/2010 8:53:48 AM       <br />上次更新日期 (UTC): 4/12/2010 10:44:43 AM</em></p>
<p><em>SHA1: 84C90BB02AF92347010FF9058E0A2BA28F19CC53       <br />ISO/CRC: B22E6250</em></p>
<p><em>Available to Levels: Developer AA; BizSpark Admin; BizSpark; VS Ultimate with MSDN (VL); VS Ultimate with MSDN (Retail);</em>&#160;</p>
</blockquote>
<p>安装后的版本提示为 Version 10.0.30319.1 RTMRel</p>
<p><a href="http://file.wukangrui.com/attachments/2010/04/image4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image_thumb3.png" width="541" height="405" /></a> </p>
</p>
<p>安装后开始菜单下的项目变化不大，最主要的是增加了Microsoft Test Manager 2010，需要和Team Foundation Server搭配使用。</p>
<p>启动后可以选择的默认开发环境增加了几个。</p>
<p align="center"><a href="http://file.wukangrui.com/attachments/2010/04/image5.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image_thumb4.png" width="326" height="180" /></a> </p>
<p align="left">我选择的是 Visual C# Development Settings，初次启动后连起始页都没有了，我估计应该是自动检测和导入了Visual Studio 2008的设置造成的。</p>
<p align="left">创建新项目的界面：</p>
<p align="center"><a href="http://file.wukangrui.com/attachments/2010/04/image6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image_thumb5.png" width="557" height="373" /></a> </p>
</p>
<p>创建新项目后，发现开发环境的颜色配置的确就是导入了Visual Studio 2008的配色方案，但是字体却恢复成了默认的“新宋体”而不是我在VS2008中设置的“Consolas”。</p>
<p>随便建个项目做了一点测试，很明显可以感觉出来在创建项目、添加新项、添加引用的时候反应敏捷了很多，用直接双击工具箱的方式向页面添加控件速度依然会比较慢（第一个控件，之后就没有延迟了）。</p>
<p>尝试打开一个Visual Studio 2008的解决方案，提示转换，但是没有备份的选项，转换时依然会自动提示是否将网站转换到4.0版本，其它项目不会转换。我的解决方案中包含三个类库一个ASP.NET MVC 1.0项目，转换后编译运行正常。</p>
<p>初步体验暂时如此。</p>
<p>需要下载试用版的同学可以移步到：<a title="http://www.microsoft.com/visualstudio/en-us/download" href="http://www.microsoft.com/visualstudio/en-us/download">http://www.microsoft.com/visualstudio/en-us/download</a>。至于试用期满的问题，相信序列号很快就会出现。在Help菜单下单击Register Product按钮不是跳转到网站，而是弹出一个提示框，估计试用版升级为正式版的入口就在此处。</p>
<p align="center"><a href="http://file.wukangrui.com/attachments/2010/04/image7.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image_thumb6.png" width="494" height="194" /></a></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2005-12-03 -- <a href="http://wukangrui.com/2005/12/03/visual-studio-2005-trial.html" title="Visual Studio 2005体验感受">Visual Studio 2005体验感受</a></li><li>2010-04-04 -- <a href="http://wukangrui.com/2010/04/04/vspaste-customization-with-net-reflector.html" title="VSPaste 的持续改造">VSPaste 的持续改造</a></li><li>2009-06-17 -- <a href="http://wukangrui.com/2009/06/17/regular-expression-in-dreamweaver.html" title="Dreamweaver中的正则表达式">Dreamweaver中的正则表达式</a></li><li>2009-06-05 -- <a href="http://wukangrui.com/2009/06/05/uncharted-waters-4-in-windows7-x64.html" title="Windows 7 兼容性展示：大航海时代4">Windows 7 兼容性展示：大航海时代4</a></li><li>2009-05-24 -- <a href="http://wukangrui.com/2009/05/24/sql-express-2008-x64-integration-with-visual-studio-2008-sp1.html" title="Visual Studio 2008 搭配64位SQL Server的问题解决方案">Visual Studio 2008 搭配64位SQL Server的问题解决方案</a></li><li>2009-05-16 -- <a href="http://wukangrui.com/2009/05/16/window7-beta-dvd-from-microsoft.html" title="微软发放的Windows 7测试版光盘">微软发放的Windows 7测试版光盘</a></li><li>2009-04-30 -- <a href="http://wukangrui.com/2009/04/30/solution-for-js-intellisense-error.html" title="VS2008 中 JS IntelliSense出错的解决">VS2008 中 JS IntelliSense出错的解决</a></li><li>2009-04-16 -- <a href="http://wukangrui.com/2009/04/16/tencent-qq-2009-rtm-released.html" title="QQ2009正式版发布">QQ2009正式版发布</a></li><li>2009-04-13 -- <a href="http://wukangrui.com/2009/04/13/aspnetmvc-hands-on-labs-develop-application.html" title="[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用</a></li><li>2009-04-09 -- <a href="http://wukangrui.com/2009/04/09/aspnetmvc-hands-on-labs-create-application.html" title="[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/ZzGZH1GxRec" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2010/04/14/vs2010-rtm-avaliable-on-msdn.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2010/04/14/vs2010-rtm-avaliable-on-msdn.html</feedburner:origLink></item>
		<item>
		<title>VSPaste 的持续改造</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/GcnwObP7CGE/vspaste-customization-with-net-reflector.html</link>
		<comments>http://wukangrui.com/2010/04/04/vspaste-customization-with-net-reflector.html#comments</comments>
		<pubDate>Sun, 04 Apr 2010 07:02:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[.NET Reflector]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[VSPaste]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2010/04/04/vspaste-customization-with-net-reflector.html</guid>
		<description><![CDATA[Paste from Visual Studio 是一个很好用的代码高亮插件，对于使用Visual Studio编写代码，用WLW写博客的我们来说实在是不二之选。但是作者从2007年11月22日之后就停止了该插件的更新。而到这时，这个插件还有一些不如人意的地方。 
很多人都尝试过对这个插件的改造工作（参见《自己改造VSPaste插件》、《定制Paste from Visual Studio插件（上）》、《定制Paste from Visual Studio插件（下）》），在他们研究的过程中，都由于.NET Reflector无法完成工作而借助了IL。而我在尝试的时候，却发现只是用 .NET Reflector 就完成了对插件源代码的改造工作。以下是具体方法：

用.NET Reflector打开VSPaste.dll文件，选择Export：

导出后就会得到一个C#的项目：
&#160;
然后，用Visual Studio打开这个项目。我的目的是解决以下几个问题：


当IDE的颜色主题做了修改之后（主要是背景），粘贴时自动将背景颜色设置到&#60;pre&#62;标签而不是&#60;span&#62;标签（一般情况下，背景色的改变都不会是针对关键字而是对整个文本编辑器的）；

如果从代码中间段复制（缩进层次比较多），粘贴时自动将多余的缩进去除。


这两个工作在《自己改造VSPaste插件》中其实都做了，唯一的区别就是DiryBoy是去除背景，而我要保留背景，只是换个地方放置。
第一步，参照DiryBoy的代码直接实现缩进的去除，在VSPaste.cs文件中找到Undent方法，替换其中的源代码：
public static string Undent(string s) {
    var beginSpaces = new System.Text.RegularExpressions.Regex("^(?:&#60;span[^&#62;]*&#62;&#124;)( +)");
    var depth = beginSpaces.Match(s).Groups[1].Value.Length;
    if (depth == 0) return s;

    var space2trim = [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Paste from Visual Studio" href="http://gallery.live.com/liveItemDetail.aspx?li=d8835a5e-28da-4242-82eb-e1a006b083b9" target="_blank">Paste from Visual Studio</a> 是一个很好用的代码高亮插件，对于使用<a title="Microsoft Visual Studio" href="http://msdn.microsoft.com/zh-cn/vstudio/default.aspx" rel="external" target="_blank">Visual Studio</a>编写代码，用<acronym title="Windows Live Writer">WLW</acronym>写博客的我们来说实在是不二之选。但是作者从2007年11月22日之后就停止了该插件的更新。而到这时，这个插件还有一些不如人意的地方。</acronym> </p>
<p>很多人都尝试过对这个插件的改造工作（参见<a title="DiryBoy's .Net Life：自己改造VSPaste插件" href="http://www.cnblogs.com/Diryboy/archive/2008/12/02/1345407.html" rel="external" target="_blank">《自己改造VSPaste插件》</a>、<a title="老赵：定制Paste from Visual Studio插件（上）" href="http://blog.zhaojie.me/2009/12/vspaste-customization-1.html" rel="external" target="_blank">《定制Paste from Visual Studio插件（上）》</a>、<a title="老赵：定制Paste from Visual Studio插件（下）" href="http://blog.zhaojie.me/2009/12/vspaste-customization-2.html" rel="external" target="_blank">《定制Paste from Visual Studio插件（下）》</a>），在他们研究的过程中，都由于<a title=".NET Reflector" href="http://www.red-gate.com/products/reflector/" rel="external" target="_blank">.NET Reflector</a>无法完成工作而借助了IL。而我在尝试的时候，却发现只是用 <a title=".NET Reflector" href="http://www.red-gate.com/products/reflector/" rel="external" target="_blank">.NET Reflector</a> 就完成了对插件源代码的改造工作。以下是具体方法：</p>
<p><span id="more-909"></span>
<p>用.NET Reflector打开VSPaste.dll文件，选择Export：</p>
<p align="center"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image.png" width="385" height="480"></p>
<p>导出后就会得到一个C#的项目：</p>
<p align="center"><a href="http://file.wukangrui.com/attachments/2010/04/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image_thumb.png" width="385" height="217"></a>&nbsp;</p>
<p align="left">然后，用Visual Studio打开这个项目。我的目的是解决以下几个问题：</p>
<ol>
<li>
<div align="left">当IDE的颜色主题做了修改之后（主要是背景），粘贴时自动将背景颜色设置到&lt;pre&gt;标签而不是&lt;span&gt;标签（一般情况下，背景色的改变都不会是针对关键字而是对整个文本编辑器的）；</div>
<li>
<div align="left">如果从代码中间段复制（缩进层次比较多），粘贴时自动将多余的缩进去除。</div>
</li>
</ol>
<p>这两个工作在<a title="DiryBoy's .Net Life：自己改造VSPaste插件" href="http://www.cnblogs.com/Diryboy/archive/2008/12/02/1345407.html" rel="external" target="_blank">《自己改造VSPaste插件》</a>中其实都做了，唯一的区别就是<a href="http://www.cnblogs.com/Diryboy/" rel="external" target="_blank">DiryBoy</a>是去除背景，而我要保留背景，只是换个地方放置。</p>
<p>第一步，参照DiryBoy的代码直接实现缩进的去除，在VSPaste.cs文件中找到Undent方法，替换其中的源代码：</p>
<pre style="background: #2e2e2e" class="code"><span style="color: #ff8040">public static string </span><span style="color: #d3d3d3">Undent(</span><span style="color: #ff8040">string </span><span style="color: #d3d3d3">s) {
    </span><span style="color: #ff8040">var </span><span style="color: #d3d3d3">beginSpaces = </span><span style="color: #ff8040">new </span><span style="color: #d3d3d3">System.Text.RegularExpressions.</span><span style="color: #2b91af">Regex</span><span style="color: #d3d3d3">(</span><span style="color: #fcc289">"^(?:&lt;span[^&gt;]*&gt;|)( +)"</span><span style="color: #d3d3d3">);
    </span><span style="color: #ff8040">var </span><span style="color: #d3d3d3">depth = beginSpaces.Match(s).Groups[1].Value.Length;
    </span><span style="color: #ff8040">if </span><span style="color: #d3d3d3">(depth == 0) </span><span style="color: #ff8040">return </span><span style="color: #d3d3d3">s;

    </span><span style="color: #ff8040">var </span><span style="color: #d3d3d3">space2trim = </span><span style="color: #ff8040">new </span><span style="color: #d3d3d3">System.Text.RegularExpressions.</span><span style="color: #2b91af">Regex
                     </span><span style="color: #d3d3d3">(
                         </span><span style="color: #fcc289">"^(&lt;span[^&gt;]*&gt;|) {" </span><span style="color: #d3d3d3">+ depth + </span><span style="color: #fcc289">"}"
                         </span><span style="color: #d3d3d3">, System.Text.RegularExpressions.</span><span style="color: #2b91af">RegexOptions</span><span style="color: #d3d3d3">.Multiline
                     );
    </span><span style="color: #ff8040">var </span><span style="color: #d3d3d3">tmp = space2trim.Replace(s, </span><span style="color: #fcc289">"$1"</span><span style="color: #d3d3d3">);
    </span><span style="color: #ff8040">var </span><span style="color: #d3d3d3">garbageSpan = </span><span style="color: #ff8040">new </span><span style="color: #d3d3d3">System.Text.RegularExpressions.</span><span style="color: #2b91af">Regex
                     </span><span style="color: #d3d3d3">(
                        </span><span style="color: #fcc289">"^&lt;span[^&gt;]*&gt;&lt;/span&gt;"
                        </span><span style="color: #d3d3d3">, System.Text.RegularExpressions.</span><span style="color: #2b91af">RegexOptions</span><span style="color: #d3d3d3">.Multiline
                     );
    </span><span style="color: #ff8040">return </span><span style="color: #d3d3d3">garbageSpan.Replace(tmp, </span><span style="color: #2b91af">String</span><span style="color: #d3d3d3">.Empty);
}</span><span></pre>
</p>
<p></span></p>
<p>接下来是要将背景设置在&lt;pre&gt;标签中，从源代码里可以发现，&lt;pre&gt;标签的生成是在VSPaste.cs的CreateContent方法中，而背景颜色的判断和设置却不在这里，于是我首先想到的是让具体负责背景颜色的代码将颜色值传递出来，所以对CreateContent的方法我做了这样的修改：</p>
<pre style="background: #2e2e2e" class="code"><span style="color: #ff8040">if </span><span style="color: #d3d3d3">(</span><span style="color: #2b91af">Clipboard</span><span style="color: #d3d3d3">.ContainsData(</span><span style="color: #2b91af">DataFormats</span><span style="color: #d3d3d3">.Rtf))
{
    </span><span style="color: #ff8040">string </span><span style="color: #d3d3d3">allBackColor = </span><span style="color: #ff8040">string</span><span style="color: #d3d3d3">.Empty;
    </span><span style="color: #ff8040">string </span><span style="color: #d3d3d3">htmlContent = Undent(</span><span style="color: #2b91af">HTMLRootProcessor</span><span style="color: #d3d3d3">.FromRTF(
        (</span><span style="color: #ff8040">string</span><span style="color: #d3d3d3">)</span><span style="color: #2b91af">Clipboard</span><span style="color: #d3d3d3">.GetData(</span><span style="color: #2b91af">DataFormats</span><span style="color: #d3d3d3">.Rtf),
        </span><span style="color: #ff8040">out </span><span style="color: #d3d3d3">allBackColor));
    </span><span style="color: #ff8040">if</span><span style="color: #d3d3d3">(</span><span style="color: #ff8040">string</span><span style="color: #d3d3d3">.IsNullOrEmpty(allBackColor)) {
        newContent = </span><span style="color: #ff8040">string</span><span style="color: #d3d3d3">.Format(
            </span><span style="color: #fcc289">"&lt;pre class=\"code\"&gt;{0}&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;"</span><span style="color: #d3d3d3">,
            htmlContent);
    }
    </span><span style="color: #ff8040">else
    </span><span style="color: #d3d3d3">{
        newContent = </span><span style="color: #ff8040">string</span><span style="color: #d3d3d3">.Format(
            </span><span style="color: #fcc289">"&lt;pre class=\"code\" style=\"background:{0};\"&gt;{1}&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;"</span><span style="color: #d3d3d3">,
            allBackColor,
            htmlContent);
    }
    </span><span style="color: #ff8040">return </span><span style="color: #2b91af">DialogResult</span><span style="color: #d3d3d3">.OK;
}</span><span></pre>
<p>原来的代码是：</p>
<pre style="background: #2e2e2e" class="code"><span style="color: #ff8040">if </span><span style="color: #d3d3d3">(</span><span style="color: #2b91af">Clipboard</span><span style="color: #d3d3d3">.ContainsData(</span><span style="color: #2b91af">DataFormats</span><span style="color: #d3d3d3">.Rtf))
{
    newContent = </span><span style="color: #fcc289">"&lt;pre class=\"code\"&gt;" </span><span style="color: #d3d3d3">+ Undent(</span><span style="color: #2b91af">HTMLRootProcessor</span><span style="color: #d3d3d3">.FromRTF((</span><span style="color: #ff8040">string</span><span style="color: #d3d3d3">) </span><span style="color: #2b91af">Clipboard</span><span style="color: #d3d3d3">.GetData(</span><span style="color: #2b91af">DataFormats</span><span style="color: #d3d3d3">.Rtf))) + </span><span style="color: #fcc289">"&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;"</span><span style="color: #d3d3d3">;
    </span><span style="color: #ff8040">return </span><span style="color: #2b91af">DialogResult</span><span style="color: #d3d3d3">.OK;
}</span><span></pre>
<p>我的改变就是用为HTMLRootProcessor类的FromRTF方法增加一个传出参数，通过这个参数来获取背景色，从而可以在生成&lt;pre&gt;标签时直接使用。接下来，打开HTMLRootProcessor这个方法，通过阅读其源代码，可以知道，由int类型的颜色转成string类型是通过ColorProcessor的CssColor方法实现的，而每个HTMLRootProcessor方法里面有一个colors的私有字段就是ColorProcessor的实例。所以，我将HTMLRootProcessor的FromRTF方法改造如下：</p>
<pre style="background: #2e2e2e" class="code"><span style="color: #ff8040">public static string </span><span style="color: #d3d3d3">FromRTF(</span><span style="color: #ff8040">string </span><span style="color: #d3d3d3">rtf, </span><span style="color: #ff8040">out string </span><span style="color: #d3d3d3">allBackColor)
{
    </span><span style="color: #ff8040">string </span><span style="color: #d3d3d3">str;
    </span><span style="color: #ff8040">using </span><span style="color: #d3d3d3">(</span><span style="color: #2b91af">StringWriter </span><span style="color: #d3d3d3">writer = </span><span style="color: #ff8040">new </span><span style="color: #2b91af">StringWriter</span><span style="color: #d3d3d3">())
    {
        </span><span style="color: #ff8040">using </span><span style="color: #d3d3d3">(</span><span style="color: #2b91af">StringReader </span><span style="color: #d3d3d3">reader = </span><span style="color: #ff8040">new </span><span style="color: #2b91af">StringReader</span><span style="color: #d3d3d3">(rtf))
        {
            </span><span style="color: #2b91af">ProcessorStack </span><span style="color: #d3d3d3">stack = </span><span style="color: #ff8040">new </span><span style="color: #2b91af">ProcessorStack</span><span style="color: #d3d3d3">();
            </span><span style="color: #2b91af">HTMLRootProcessor </span><span style="color: #d3d3d3">processor = </span><span style="color: #ff8040">new </span><span style="color: #2b91af">HTMLRootProcessor</span><span style="color: #d3d3d3">(stack, writer);
            stack.Push(processor);
            </span><span style="color: #2b91af">Scanner </span><span style="color: #d3d3d3">scanner = </span><span style="color: #ff8040">new </span><span style="color: #2b91af">Scanner</span><span style="color: #d3d3d3">(reader);
            </span><span style="color: #ff8040">new </span><span style="color: #2b91af">Parser</span><span style="color: #d3d3d3">(scanner, stack).Parse();
            <strong style="background: #666">allBackColor = processor.background.HasValue ? processor.colors.CssColor(processor.background.Value) : </span><span style="color: #ff8040">string</span><span style="color: #d3d3d3">.Empty;</strong>
            str = writer.ToString();
        }
    }
    </span><span style="color: #ff8040">return </span><span style="color: #d3d3d3">str;
}</span><span></pre>
</p>
<p></span></span></span></p>
<p>其中高亮的代码就是重点，首先我利用HTMLRootProcessor自带的background属性来存储背景色，然后调用colors实例的CssColor方法来为其赋值，如果没有背景色，则返回空字符串。最后一步，就是修改对background属性赋值的语句，使其只需要判断一次即可（整个代码总共就一种背景色，没必要反复赋值了）。这段代码在HTMLRootProcessor的SyncColors方法中，改造后的代码如下：</p>
<pre style="background: #2e2e2e" class="code"><span style="color: #ff8040">private void </span><span style="color: #d3d3d3">SyncColors(</span><span style="color: #ff8040">bool </span><span style="color: #d3d3d3">bgOnly)
{
    </span><span style="color: #ff8040">int</span><span style="color: #d3d3d3">? nullable;
    </span><span style="color: #ff8040">int</span><span style="color: #d3d3d3">? nullable2;
    </span><span style="color: #ff8040">if </span><span style="color: #d3d3d3">((</span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.background != </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.nextBackground) || ((((nullable = </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.color).GetValueOrDefault() != (nullable2 = </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.nextColor).GetValueOrDefault()) || (nullable.HasValue != nullable2.HasValue)) &amp;&amp; !bgOnly))
    {
        </span><span style="color: #ff8040">if </span><span style="color: #d3d3d3">(</span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.color.HasValue || </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.background.HasValue)
        {
            </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.writer.Write(</span><span style="color: #fcc289">"&lt;/span&gt;"</span><span style="color: #d3d3d3">);
        }
        </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.color = </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.nextColor;
        </span><span style="color: #ff8040">if</span><span style="color: #d3d3d3">(</span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.background.HasValue == </span><span style="color: #ff8040">false</span><span style="color: #d3d3d3">)
            </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.background = </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.nextBackground;
        </span><span style="color: #ff8040">if </span><span style="color: #d3d3d3">(</span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.color.HasValue || </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.background.HasValue)
        {
            </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.writer.Write(</span><span style="color: #fcc289">"&lt;span style=\""</span><span style="color: #d3d3d3">);
            </span><span style="color: #ff8040">if </span><span style="color: #d3d3d3">(</span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.color.HasValue)
            {
                </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.writer.Write(</span><span style="color: #fcc289">"color:"</span><span style="color: #d3d3d3">);
                </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.writer.Write(</span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.colors.CssColor(</span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.color.Value));
            }
            </span><span style="color: gray">//if (this.background.HasValue)
            //{
            //    if (this.color.HasValue)
            //    {
            //        this.writer.Write(';');
            //    }
            //    this.writer.Write("background:");
            //    this.writer.Write(this.colors.CssColor(this.background.Value));
            //}
            </span><span style="color: #ff8040">this</span><span style="color: #d3d3d3">.writer.Write(</span><span style="color: #fcc289">"\"&gt;"</span><span style="color: #d3d3d3">);
        }
    }
}</span></pre>
<p>其中做了两处修改，第一处是在对background赋值前判断其是否已经有值，如果有了，则不再进行赋值操作。第二处是将原来给&lt;span&gt;标签增加背景色的代码注释掉。</p>
<p>至此已经全部改造完毕，然后进行编译，顺利通过。将得到的VSPaste.dll覆盖到C:\Program Files\Windows Live\Writer\Plugins 目录下，启动<acronym title="Windows Live Writer">WLW</acronym>，随便从Visual Studio中赋值一段代码，粘贴，得到了本文中代码显示的效果。为了确认，打开没有改变颜色主题的Visual Web Developer 2008 Exress，复制一段代码，粘贴到<acronym title="Windows Live Writer">WLW</acronym>中，得到了没有背景色的代码样式（这里就不演示了）。至此，大功告成。</p>
<p>最后，对编译修改后的源代码做一点补充说明：如果生成配置是Debug，则没有任何问题，改成Release则一旦使用该插件就会造成<acronym title="Windows Live Writer">WLW</acronym>崩溃。如果要使用Release配置编译，则应该做如下调整：</p>
<p align="center"><a href="http://file.wukangrui.com/attachments/2010/04/image2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/04/image_thumb1.png" width="510" height="280"></a> </p>
<p>这是经过我反复调整测试后得出的，关键在于“定义Debug常量”，其它选项都可选可不选。</p>
<p>本人水平有限，虽然通过尝试得出了正确结果，但是对于编译时发生的事情却不知其所以然，也无法解释其原因。望高人指点。</p>
<p>==================================================</p>
<p>修改后的VSPaste.dll下载：<a href="http://file.wukangrui.com/vspaste.zip" rel="attachment" target="_blank">vspaste.zip</a></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2010-04-14 -- <a href="http://wukangrui.com/2010/04/14/vs2010-rtm-avaliable-on-msdn.html" title="Visual Studio 2010 Ultimate RTM 版开放MSDN下载">Visual Studio 2010 Ultimate RTM 版开放MSDN下载</a></li><li>2009-05-24 -- <a href="http://wukangrui.com/2009/05/24/sql-express-2008-x64-integration-with-visual-studio-2008-sp1.html" title="Visual Studio 2008 搭配64位SQL Server的问题解决方案">Visual Studio 2008 搭配64位SQL Server的问题解决方案</a></li><li>2009-04-30 -- <a href="http://wukangrui.com/2009/04/30/solution-for-js-intellisense-error.html" title="VS2008 中 JS IntelliSense出错的解决">VS2008 中 JS IntelliSense出错的解决</a></li><li>2009-04-13 -- <a href="http://wukangrui.com/2009/04/13/aspnetmvc-hands-on-labs-develop-application.html" title="[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-3：开发ASP.NET MVC应用</a></li><li>2009-04-09 -- <a href="http://wukangrui.com/2009/04/09/aspnetmvc-hands-on-labs-create-application.html" title="[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用">[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用</a></li><li>2009-04-09 -- <a href="http://wukangrui.com/2009/04/09/aspnetmvc-hands-on-labs-introduction.html" title="[翻译]ASP.NET MVC动手系列1-1：ASP.NET MVC概述">[翻译]ASP.NET MVC动手系列1-1：ASP.NET MVC概述</a></li><li>2005-12-03 -- <a href="http://wukangrui.com/2005/12/03/visual-studio-2005-trial.html" title="Visual Studio 2005体验感受">Visual Studio 2005体验感受</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/GcnwObP7CGE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2010/04/04/vspaste-customization-with-net-reflector.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2010/04/04/vspaste-customization-with-net-reflector.html</feedburner:origLink></item>
		<item>
		<title>前台开发从头说起：理解css盒模型</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/ziCiwj1LnVE/web-developer-understand-css-box-model.html</link>
		<comments>http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html#comments</comments>
		<pubDate>Mon, 21 Dec 2009 14:58:41 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web标准]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[网页]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html</guid>
		<description><![CDATA[在布局的时候，实际上主要是借助元素的宽、高、定位、浮动、边距、边框、间距、背景颜色、背景图片的组合来实现的。而所有这些，都要基于对css盒模型的理解。网上对盒模型的论述很多，我这里想从实用的角度来谈谈。]]></description>
			<content:encoded><![CDATA[<p>在掌握了丰富而强大的<a href="http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html" rel="prev">css选择符</a>之后，就具备了将css样式根据需要应用到网页中任何元素的能力。能够应用规则了，接下来就需要熟练掌握规则的制定方法——什么样的属性组合能够实现什么样的效果。一般的颜色、字体、字号、行高等的设置比较容易掌握，而初学者在应用css的时候，主要头疼的还是如何用css实现复杂的网页布局，从两栏布局、三栏布局，到表单设计等。在布局的时候，实际上主要是借助元素的宽、高、定位、浮动、边距、边框、间距、背景颜色、背景图片的组合来实现的。而所有这些，都要基于对css盒模型的理解。网上对盒模型的论述很多（推荐阅读《<a href="http://www.blueidea.com/tech/web/2007/4545.asp" rel="reference" target="_blank">彻底理解css盒子模式</a>》），我这里想从实用的角度来谈谈。</p>
</p>
<p> <span id="more-891"></span>
</p>
<p>网上有两张著名的图片，分别以2D和3D的形式描述css盒模型：</p>
<p><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="图片1" border="0" alt="图片1" src="http://file.wukangrui.com/blog/webcss_13001/1_thumb.gif" width="460" height="262" /></p>
<p align="center"><a href="http://file.wukangrui.com/blog/webcss_13001/cssbox3d.gif"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="cssbox3d" border="0" alt="cssbox3d" src="http://file.wukangrui.com/blog/webcss_13001/cssbox3d_thumb.gif" width="478" height="383" /></a></p>
<p>通过这两张图，一般来说对于margin、border、background-color、background-image、padding以及width和height有较直观的了解了。</p>
<p>更为重要的是要了解以下几点：</p>
<ol>
<li>对于所有以“块(block)”方式呈现的元素都具备这个模型的特性，而不只是div； </li>
<li>margin是以所指定元素的父级元素（常称为“容器”）为基准的； </li>
<li>一个元素（通常为块元素）在页面中所占的位置尺寸为：宽度= <strong>width + padding-left + padding-right + border-left-width + border-right-width + margin-left + margin-right</strong>；高度 = <strong>height + padding-top + padding-bottom + border-top-width + border-bottom-width + margin-top + margin-bottom</strong>；（部分浏览器有差异，以后再具体讨论）； </li>
<li>background-color将填满border内部的全部范围；background-image默认以图片左上角对齐border内部左上角点，然后完整显示整个图片（超出部分不予显示），如果图片尺寸不足铺满整个范围，图片默认重复自己直至铺满或超出范围； </li>
<li>background-image将叠加到background-color之上；通过指定图片的对齐方式，可以改变background-image的位置； </li>
</ol>
<p>通过以上这些规则的组合，就能在有限的元素组合下，实现各种修饰性效果。一个简单的例子如下：</p>
<p>将一个15像素高，颜色为#c00的纯色图片<a href="http://file.wukangrui.com/blog/webcss_13001/c00.gif"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="c00" border="0" alt="c00" src="http://file.wukangrui.com/blog/webcss_13001/c00_thumb.gif" width="14" height="19" /></a> 放入一个高度为30像素，背景色为#f00的块元素，设定图片在Y轴方向不平铺，在x轴方向平铺。结果得到一个类似下图的效果：</p>
<p><a href="http://file.wukangrui.com/blog/webcss_13001/c00f33.gif"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="c00f33" border="0" alt="c00f33" src="http://file.wukangrui.com/blog/webcss_13001/c00f33_thumb.gif" width="104" height="34" /></a> 这是简单的由背景色与背景图组合实现的效果。根据这样的原理，当我们的文档结构有两层时，例如：&lt;a href=”#&quot;&gt;&lt;span&gt;文字&lt;/span&gt;&lt;/a&gt;，我们可以通过由a元素的背景颜色图片和span元素的背景颜色图片组合，从而得到较为复杂的效果，例如：</p>
<p align="center"><a href="http://file.wukangrui.com/blog/webcss_13001/button.gif"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="button" border="0" alt="button" src="http://file.wukangrui.com/blog/webcss_13001/button_thumb.gif" width="204" height="40" /></a>&#160;</p>
<p align="left">这个按钮效果，用纯图片很容易实现，但是用图片实现就会面临一个问题：不通用。如果要通用，应该把文字和背景图片分离开来，同时，由于文字有多有少，因此按钮的宽度要是可变的，但是按钮并不是从左到右完全一致的背景，于是不能使用一张图片进行横向平铺，按照以前的做法，可能会使用一个一行三列的表格，第一个单元格放入左侧的图片，中间的单元格放文字和平铺的背景，右边的单元格放右侧的图片。这种思维传递到了“div+css”布局思维模式下，于是就出现了这样的结构：</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">div </span><span style="color: red">class</span><span style="color: blue">=”button”&gt;&lt;</span><span style="color: #a31515">div </span><span style="color: red">class</span><span style="color: blue">=”left”&gt;&lt;/</span><span style="color: #a31515">div</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">div </span><span style="color: red">class</span><span style="color: blue">=”center”&gt;&lt;/</span><span style="color: #a31515">div</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">div </span><span style="color: red">class</span><span style="color: blue">=”right”&gt;&lt;/</span><span style="color: #a31515">div</span><span style="color: blue">&gt;</span></pre>
<p>这个结构的出现，就是为了实现自适应宽度的按钮，今天依然存在。实际上，使用上面的a+span的基本结构，就能实现这个效果。将中间平铺部分和左侧或右侧的边缘图片组合在一起，重复部分做得宽一些，作为a的背景图片，把另一侧的图片作为span的背景图片覆盖到a的背景图片上。组合起来看上去就成为一个整体。代码如下：</p>
<p>效果如下：</p>
<p align="center"><a href="http://file.wukangrui.com/blog/webcss_13001/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/blog/webcss_13001/image_thumb.png" width="232" height="60" /></a></p>
<pre class="code"><span style="color: #a31515">a </span>{<span style="color: red">display</span>:<span style="color: blue">block</span>;<span style="color: red">width</span>:<span style="color: blue">200px</span>;<span style="color: red">height</span>:<span style="color: blue">36px</span>;<span style="color: red">background</span>:<span style="color: blue">url(button.gif) no-repeat right bottom</span>;}
<span style="color: #a31515">a span </span>{<span style="color: red">display</span>:<span style="color: blue">block</span>;<span style="color: red">line-height</span>:<span style="color: blue">36px</span>;<span style="color: red">background</span>:<span style="color: blue">url(button.gif) no-repeat left top</span>;<span style="color: red">color</span>:<span style="color: blue">#fff</span>;<span style="color: red">text-decoration</span>:<span style="color: blue">none</span>;<span style="color: red">text-align</span>:<span style="color: blue">center</span>;}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>用到的背景图片如下：</p>
<p align="center"><a href="http://file.wukangrui.com/blog/webcss_13001/button_3.gif"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="button" border="0" alt="button" src="http://file.wukangrui.com/blog/webcss_13001/button_thumb_3.gif" width="200" height="72" /></a>&#160;</p>
<p align="left">这个例子很简单，但是需要对“背景组合”有足够的理解，能够想到应用。而要想到如此应用，首先是对于盒模型中的“background”足够的理解。否则，就只会想到三个div（或者其它元素组合方式），但是由于左右两个结构完全一样，为了区分它们，只好使用class或者id来标记。这就是我在<a href="http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html" rel="prev">上一篇</a>中所提到的不必要的class和id。</p>
<p align="left">除了利用display:block让行内元素改变为块元素从而使用盒模型特征外，在浮动的时候，也经常会用到盒模型的一些特征。再举个例子：</p>
<p align="left">使用浮动布局的时候，并列呈现的浮动元素中的第一个如果设置与浮动方向相同的margin，则IE 6下会出现margin加倍的bug（这就是著名的IE6浮动边距加倍bug）。为了解决这个问题，很多人喜欢给一组浮动元素的第一个加上class=”first”，从而可以对这个元素单独应用样式。或者对这一组浮动元素加上display:inline的属性以解决这个bug。</p>
<p align="left">上述两种方式都是没有使用hack选择符或者类似“_margin”这样的非标准属性的很好的hack方式。但是，如果不是非用margin不可，只要使用padding来代替margin，就能解决这个问题。或者采用与浮动方向相反的margin也可以。不需要任何额外的hack。这也是在充分理解盒模型的基础上，由于对这个bug的了解，从而在实现样式的时候直接避开，而不是出现了之后再用额外手段去hack。</p>
<p align="left">对盒模型的理解，除了margin、border、padding、width、height五大属性以及两种背景的应用之外，还要了解父级元素与子元素之间的关系。比如父元素没有设置尺寸，而对子元素设置margin-top属性，在某些浏览器下，本来是想针对父元素的边缘设置margin，结果margin被设置到了父元素之外，造成父元素与外部元素的margin。这种情况，将子元素的margin改成父元素的padding，也可以在不改变表现的情况下实现相同的效果。</p>
<p align="left">要想通过对盒模型特征的充分应用来减少css中的hack使用，或者以更简洁的代码实现更复杂的效果，需要对盒模型不断地尝试和总结。这是《css权威指南》之类的经典巨著也没法教给你的。</p>
<p align="left">只有越理解盒模型，才能越好地利用浮动和定位来实现复杂、精确的布局。关于浮动的问题，下一次我们再一起来了解一下。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-16 -- <a href="http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-10-13 -- <a href="http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html" title="关于web标准化的一些误区">关于web标准化的一些误区</a></li><li>2009-06-22 -- <a href="http://wukangrui.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li><li>2009-04-16 -- <a href="http://wukangrui.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-13 -- <a href="http://wukangrui.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://wukangrui.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2010-06-09 -- <a href="http://wukangrui.com/2010/06/09/my-rencent-booklist.html" title="最近的书单">最近的书单</a></li><li>2006-03-28 -- <a href="http://wukangrui.com/2006/03/28/simulate-window-in-center-with-css.html" title="CSS:模拟Windows窗口及DIV居中">CSS:模拟Windows窗口及DIV居中</a></li><li>2005-12-12 -- <a href="http://wukangrui.com/2005/12/12/action-of-refactor-page-with-css.html" title="实践：用Div+CSS重构网页">实践：用Div+CSS重构网页</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/ziCiwj1LnVE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html</feedburner:origLink></item>
		<item>
		<title>前台开发从头说起：谈谈CSS选择符</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/jDo3np_-VHY/web-developer-about-css-selector.html</link>
		<comments>http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html#comments</comments>
		<pubDate>Wed, 16 Dec 2009 06:14:03 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web标准]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[网页]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html</guid>
		<description><![CDATA[去除了不必要的表现元素和属性（font、center、align、height）之后，又去除了不必要的id、class、onclick、onmouseover之类的样式和行为属性，我们的网页源代码尺寸越来越小，抓一个页面下来，少量必要的结构元素之外，剩下的全是链接和内容，这样的网站，搜索引擎能不喜欢吗？]]></description>
			<content:encoded><![CDATA[<p>以前我接受了网上不少博文的说法，一直认为学习css的三大最重要问题是：盒模型、定位、浮动。因为这三块的内容决定了css布局的能力。但是通过<a href="http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html" rel="prev">上一篇</a>日志的分析，xhtml要实现和css的解耦，就要尽量不依赖于css（或者说不要纯粹为了给css预留接口而添加<strong>不必要</strong>的class和id），那么，在用css布局之前，其实就有一个更紧迫的任务摆在我们的面前——如何将css规则准确应用到目标元素。于是，css选择符的地位在这个前提下就空前的提高了。所以，在开始学习盒模型、浮动、定位之前，有必要回顾一下选择符。</p>
</p>
</p>
<p> <span id="more-888"></span>
</p>
<p>一般稍微接触过css的网页设计人员，都会很快地学会三种css选择符：</p>
<ul>
<li>元素选择符（例如：body 、a 、li ） </li>
<li>ID选择符（例如：#head、#body、#foot） </li>
<li>类选择符（例如：.red、.item、.content） </li>
</ul>
<p>更进一步之后，开始了解到一些进阶的选择符：</p>
<ul>
<li>后代选择符（例如 #head .menu、#foot #copyright） </li>
<li>伪类选择符（例如 a:hover、a:link） </li>
</ul>
<p>以及由这些选择符组合起来形成的综合选择符。实际上css还支持一些更丰富的选择符。但是能够被浏览器广泛支持的其实主要就是上面这几种，其它的选择符在css中往往用来区别处理不同的浏览器，或者用在jQuery一类的框架中。本文就不提了。有兴趣的可以自己在网上查一下，像属性选择符（input[type=’password’]、input[type=’radio’]）、直接后代选择符（body &gt; div、 #head &gt; ul）等。</p>
<p>实际上，有了上面列出的五种主要的选择符，通过对它们的组合，已经能够满足我们绝大部分时候的要求了，这也就意味着，相同结构下的元素，父级元素或者祖先元素只要有一点点区别，我们就能够在不借助id或者class的情况下直接访问到。例如：</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;
  &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单1<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单1-1<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单1-2<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单1-3<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
    &lt;/</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;
  &lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
  &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单2<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单2-1<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单2-2<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
      &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>菜单2-3<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
    &lt;/</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;
  &lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;</span></pre>
<p>这个结构是我在<a href="http://wukangrui.com/2009/04/16/best-practices-of-css-dropdown-menu.html" rel="prev">《来自微软的纯css下拉菜单》</a>一文中用到的下拉菜单结构。在那个示例中，没有使用任何的class或者id，但是我们通过不同优先级的元素+后台选择符，对结构中的不同层次的ul、li、a实现了精确定位。如下面的代码：</p>
<pre class="code"><span style="color: #a31515">ul </span>{}
<span style="color: #a31515">li </span>{}
<span style="color: #a31515">ul ul </span>{}
<span style="color: #a31515">ul ul li </span>{}
<span style="color: #a31515">li a </span>{}
<span style="color: #a31515">ul li a </span>{}
<span style="color: #a31515">ul li:hover ul </span>{}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>那么，在实际开发中，为什么很多网页设计人员还是离不开多如牛毛的ID和class呢（我要声明一下，我从来没有说完全抛弃id和class，我的观点是他们应该尽量少，并且由文档结构决定而不是由css需要决定）？我觉得有三方面的原因：</p>
<p>第一、xhtml文档结构不合理，通过元素不能体现文档的层次结构。满篇都是div。没有有效利用Hx系列标签和ul、ol、dl等不同含义的列表标签、没有有效利用p、quote、pre等标签。xhtml为我们提供了丰富的标签元素，但是如果我们只会用div，那还不如人家用table来布局的。至少他的table在一定程度上也是文档结构的体现，而满篇嵌套的div，文档结构完全没体现。</p>
<p>第二、css选择符掌握得不够，不善于借助文档结构层次上的细微区别，用不同的组合选择符来区别相似但其实不同的元素。例如上面的下拉菜单结构，有的人就非要用“menu”和“submenu”来区别。</p>
<p>第三、css选择符的优先级不清楚。css是支持继承和覆盖的，什么时候继承，什么时候覆盖。两条规则都对相同元素做出了样式规定而且样式规定重复的情况下，哪一条规则会被应用呢？这些问题不清楚，就没办法充分利用优先级实现规则的覆盖。于是只好每个要应用样式的元素都加上id或者class。关于css选择符的优先级，网上也有很多文章，我就不赘述了。</p>
<p>所以说，如果感觉离不了class，离不了id，那只能说明两个问题——xhtml结构不合理或者css掌握得还不够。我<a href="http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html" rel="prev">上一篇</a>博文发了以后，有位朋友评论说我没做过前台开发。因为没有class和id，就不能实现css和javascript的分离。实际上，只要是长期深入学习css和javascript的朋友应该都清楚：在结构有差异的情况下，用css选择符就能精确定位某个元素；在结构完全相同的情况下，借助javascript和DOM，同样可以精确定位某个元素。</p>
<p>仍然以上面的下拉菜单列表为例。首先使用 ul a 对父级菜单的链接应用样式，然后用ul ul a就可以精确定位到次级菜单的链接，应用新的样式，对ul a的定义进行覆盖。那么，如果是要精确定位到第二级菜单的第二个元素呢？由于css3的选择符目前还没被广泛支持，而结构又没有差异，不借助javascript有困难了。但是借助于javascript，非常轻松，比如在jQuery中，我们可以用 $(&quot;ul ul:nth(2) li:nth(2)”) 或者 $(&quot;ul ul”).eq(1).find(“li”).eq(1) 都能得到第二个子菜单的第二个菜单元素。</p>
<p>css和javascript能够自己精确找到网页中的任何一个元素，那么网页自然就不用自己标识自己的每个元素。少了这层负担，我们在设计网页文档结构的时候，自然就可以抛弃一切后顾之忧，那么，xhtml中和结构无关的id和class，还有什么必要存在呢？</p>
<p>去除了不必要的表现元素和属性（font、center、align、height）之后，又去除了不必要的id、class、onclick、onmouseover之类的样式和行为属性，我们的网页源代码尺寸越来越小，抓一个页面下来，少量必要的结构元素之外，剩下的全是链接和内容，这样的网站，搜索引擎能不喜欢吗？</p>
<p>没有了后顾之忧，认清了努力方向，那么下一次我们就来谈谈css的盒模型。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-21 -- <a href="http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-15 -- <a href="http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-10-13 -- <a href="http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html" title="关于web标准化的一些误区">关于web标准化的一些误区</a></li><li>2009-06-22 -- <a href="http://wukangrui.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li><li>2009-04-16 -- <a href="http://wukangrui.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-13 -- <a href="http://wukangrui.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://wukangrui.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2010-06-09 -- <a href="http://wukangrui.com/2010/06/09/my-rencent-booklist.html" title="最近的书单">最近的书单</a></li><li>2006-03-28 -- <a href="http://wukangrui.com/2006/03/28/simulate-window-in-center-with-css.html" title="CSS:模拟Windows窗口及DIV居中">CSS:模拟Windows窗口及DIV居中</a></li><li>2005-12-12 -- <a href="http://wukangrui.com/2005/12/12/action-of-refactor-page-with-css.html" title="实践：用Div+CSS重构网页">实践：用Div+CSS重构网页</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/jDo3np_-VHY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html</feedburner:origLink></item>
		<item>
		<title>前台开发从头说起：关于web标准化</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/tFopet3Hg9M/web-developer-from-web-standard.html</link>
		<comments>http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html#comments</comments>
		<pubDate>Mon, 14 Dec 2009 17:00:43 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web标准]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[网页]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html</guid>
		<description><![CDATA[虽然CSS在表现方面天生具有很多优势，但是如果不是web标准化的盛行，估计CSS不会达到今天这样的热门。所以要说CSS，肯定要从web标准化说起。实际上，对CSS的理解越深，才能越好地理解和使用CSS。]]></description>
			<content:encoded><![CDATA[<p>虽然CSS在表现方面天生具有很多优势，但是如果不是web标准化的盛行，估计CSS不会达到今天这样的热门。所以要说CSS，肯定要从web标准化说起。实际上，对CSS的理解越深，才能越好地理解和使用CSS。</p>
<p>很多人对于web标准化的理解就是“DIV+CSS”，或者“IE、FF、Chrome、Opera、Safari测试无错”，或者就是“通过w3c校验”。实际上，这些都只是web标准化以后附带的一些好处或者说一些表现。web标准化的精髓并不是为了抛弃表格，或者浏览器兼容，或者通过w3c校验。有时候，标准化了的网页未必一定能达到上述这些特征。</p>
<p> <span id="more-887"></span>
</p>
<p>web标准化的精髓或者说本质到底是什么呢？其实很简单，就是“结构、表现、行为分离”。这句话看起来简单，但是真的实现起来，就不那么容易了。分离，分离到什么程度算是标准？分离的目的是什么？举例来说吧。</p>
<p>既然要分离，那么耦合度当然是越低越好。</p>
<p>以样式为例。我们可以把所有的样式都放到外部CSS文件中，那么，CSS规则如何影响你的页面元素呢？有时候用到ID，有时候用到class。如果你的页面充满了ID和class，那么实际上分离得就不怎么彻底，因为你的页面上仍然有大量的ID或者class实际上是为了样式表现而存在的，他们并不是文档结构本身的要求。所以现在有“class hell”的说法。就是为了完全由外部css对页面实现精确控制，而在页面文档中加入大量，甚至过多的class。</p>
<p>再以行为为例。很多时候我们需要和用户交互，于是要给页面上的元素添加“onclick”，“onchange”，“onmouseover”等属性，这些属性编写在页面文档中，依赖于外部javascript。一旦外部的javascript被拿走，页面就出现执行脚本错误，甚至完全不能正常阅读。在这种情况下，javascript实际上和xhtml就没有能够解除耦合。</p>
<p>实际上，由于只有xhtml、css、javascript三者存在，我们不可能在网页开发中引入“面向接口编程”之类的设计模式。那么，我们所谓的彻底分离，其实从三者分离的最根本目的来说，就是要实现xhtml对另外两者不依赖。即使去除了所有的css和javascript，xhtml本身也能很好地完成自己的职责——文档结构。而css和javascript呢？依赖于xhtml是必然的。</p>
<p>如此一来，如何解除耦合呢？其实答案就呼之欲出了。那就是尽量避免和文档结构无关的元素嵌套，尽量去除class和事件属性。比如：</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>国内新闻<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>国际新闻<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>财经新闻<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">li</span><span style="color: blue">&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">=&quot;#&quot;&gt;</span>体育新闻<span style="color: blue">&lt;/</span><span style="color: #a31515">a</span><span style="color: blue">&gt;&lt;/</span><span style="color: #a31515">li</span><span style="color: blue">&gt;
&lt;/</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;</span></pre>
<p>这样一段源代码，从文档结构的角度来理解，它就是一组彼此关联，没有先后和主次之分的列表，可以理解为列表，也可以理解为目录。</p>
<p>但是在css的作用下，它可以变成菜单、导航条等各种形式，如果css和javascript相结合起来，它还可以变成滑动门、三态菜单等。在这种情况下，css负责表现，javascript负责行为，而xhtml并没有因为css想实现什么样式或者javascript想实现什么交互行为而改变自己。不管css和javascript想做什么，都跟它没关系。那么实际上就真正达到了我们“彻底分离”的目的。保证了文档结构的纯粹性。这就是web标准的思维模式。</p>
<p>随之而来的好处，那就是页面的兼容性，不管在什么样的浏览器里，这段xhtml都是合法有效的。w3c校验也不会有任何问题。并且SEO也会非常好。因为搜索引擎想要的并不是class或者onmouseover，搜索引擎想要的只不过是链接地址和链接文字。</p>
<p>那么，没有class，怎么实现样式呢？没有onmouseover或者onclick，怎么实现javascript事件呢？这就需要网页开发人员的css功力和javascript功力了。</p>
<p>所以，越是标准化，对css和javascript的技术要求越高。反过来，css的能力达不到，或者javascript的能力达不到，那就需要借助于class（id和文档结构有关，不算在这里，后面我们再谈）、借助于onmouseover或者onclick这些与结构无关的属性来帮助实现样式或者行为。</p>
<p>在博客园上，<a href="http://www.cnblogs.com/yuntian/archive/2008/01/08/1029433.html" rel="reference" target="_blank">暴牙齿提出“独立于根”的想法</a>。我个人认为从文档结构的角度，并没有“独立于根”的要求。但是如果能够达到“独立于根”的开发能力，那么实现起标准化来就绝对会非常得心应手。因为连“独立于根”都能实现自己的设计样式和行为的话，有了结构的文档就更不在话下了。</p>
<p>理解了标准化的本质和终极目标，如何通过css和javascript来达到这个目标呢？这个问题，留到本系列以后的文章再谈。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-21 -- <a href="http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-10-13 -- <a href="http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html" title="关于web标准化的一些误区">关于web标准化的一些误区</a></li><li>2009-06-22 -- <a href="http://wukangrui.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li><li>2009-04-16 -- <a href="http://wukangrui.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-13 -- <a href="http://wukangrui.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://wukangrui.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2010-06-09 -- <a href="http://wukangrui.com/2010/06/09/my-rencent-booklist.html" title="最近的书单">最近的书单</a></li><li>2006-03-28 -- <a href="http://wukangrui.com/2006/03/28/simulate-window-in-center-with-css.html" title="CSS:模拟Windows窗口及DIV居中">CSS:模拟Windows窗口及DIV居中</a></li><li>2005-12-12 -- <a href="http://wukangrui.com/2005/12/12/action-of-refactor-page-with-css.html" title="实践：用Div+CSS重构网页">实践：用Div+CSS重构网页</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/tFopet3Hg9M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html</feedburner:origLink></item>
		<item>
		<title>关于web标准化的一些误区</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/re0A8aR2s6A/misconceptions-about-web-standardization.html</link>
		<comments>http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html#comments</comments>
		<pubDate>Tue, 13 Oct 2009 10:13:06 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[乱七八糟]]></category>
		<category><![CDATA[web标准]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[网页]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html</guid>
		<description><![CDATA[“web标准”这个词最近几年在国内的热火程度就好像钱江潮一样一浪高过一浪，随着雅虎、MSN以及国内各大门户网站纷纷抛弃表格布局，现在的网页，要是还没有使用div+css布局，那别人一看就首先从心底鄙视起来。
但是作为一直在web开发这个领域混迹的开发人员，我从网上的文章，还有周围人的讨论中发现，很多人都把“web标准”和“div+css”完全弄混了。包括现在热卖的一些书也是这样，通篇都是“div+css”布局。严重一点的，那更是“万般皆div”。

“div+css”布局，作为web标准的一个重要部分，也是对web标准下网页布局的一个最直观布局，但是我们不应该顾名思义，以为web标准就是“div+css”布局，最后的结果就是，虽然完全抛弃了table，但是网页结构却离标准十万八千里。
web标准的本质是“结构、表现、行为”的彻底分离。在进行了多年的标准化实践以后，我越来越体会到应用web标准以后的种种好处。打开一个网页的源代码，结构清晰，标签应用准确，看到&#60;hx&#62;就知道这是标题，看到&#60;p&#62;就知道这是段落。去掉css以后，一个类似word文档的结构清晰的文件就呈现在页面上。
只有这样的网页，才能真正体现web标准化的优点。web标准化的优点主要是什么呢？加载速度快、易于维护、搜索引擎友好、减少带宽占用、利于团队分工合作……很多。采用div+css布局，做得好的话，也只不过是能够减小文件大小，提高加载速度，易于维护而已。有的文章里说“采用div+css”布局的页面更容易被搜索引擎索引，或者说“google更喜欢div+css”，这就是误区了。google喜欢的不是采用div布局或者table布局的页面，而是喜欢结构清晰良好的页面。比如一个导航条，如果采用table布局、采用flash实现、采用图片按钮等，那么google不能识别出这是对于网站来说很重要的导航条。而如果采用div布局，可以去掉很多不必要的table\tr标签，从而让对搜索引擎真正有用的两个内容——链接地址、标题更加突出。但是，只有真正符合web标准的结构，才能彻底剥离掉html代码里面的css和javascript。比如：
&#60;a href="index.html" title="首页" onmouseover="highLight(this)"
 style="font-weight:bold;color:red"&#62;返回首页&#60;/a&#62;

这样一段代码，其中对搜索引擎有用的只不过是“index.html”和“首页”罢了。符合web标准的html应该是这样：
&#60;a href="index.html" title="首页"&#62;返回首页&#60;/a&#62;

css怎么办呢？放到外部css文件里去，鼠标滑过的效果呢？放到外部js里去，为网页元素附加事件，这属于行为，应该是javascript的职责范围。不应该放到文档结构里。
刚才是一个结构表现行为混合的反面例子，除了三块不分开以外，现在网上流传很广的很多div+css布局的页面还存在另外一个问题，就是html标签使用不合理，虽然使用了div+css布局，但是html丝毫不能体现页面结构。比如：
&#60;div id="wrap"&#62;
    &#60;div id="head"&#62;
        &#60;div id="logo"&#62;
            &#60;img src="logo.gif" border="0" width="250" height="60" /&#62;
        &#60;/div&#62;
    &#60;/div&#62;
&#60;/div&#62;

像这样的例子，现在互联网上遍地都是，做成这样，你可以说你抛弃了表格，采用了div+css布局，但是这样的div布局，有什么意义呢？除了抛弃表格赶了现在的时髦以外。这里的这张图是网站的标识，也就是说，搜索引擎来到这里，应该得到的是网站的名称之类的信息。那么结构合理的站点怎么做的呢？
&#60;div id="wrap"&#62;
    [...]]]></description>
			<content:encoded><![CDATA[<p>“web标准”这个词最近几年在国内的热火程度就好像钱江潮一样一浪高过一浪，随着雅虎、MSN以及国内各大门户网站纷纷抛弃表格布局，现在的网页，要是还没有使用div+css布局，那别人一看就首先从心底鄙视起来。</p>
<p>但是作为一直在web开发这个领域混迹的开发人员，我从网上的文章，还有周围人的讨论中发现，很多人都把“web标准”和“div+css”完全弄混了。包括现在热卖的一些书也是这样，通篇都是“div+css”布局。严重一点的，那更是“万般皆div”。</p>
<p><span id="more-877"></span></p>
<p>“div+css”布局，作为web标准的一个重要部分，也是对web标准下网页布局的一个最直观布局，但是我们不应该顾名思义，以为web标准就是“div+css”布局，最后的结果就是，虽然完全抛弃了table，但是网页结构却离标准十万八千里。</p>
<p>web标准的本质是“结构、表现、行为”的彻底分离。在进行了多年的标准化实践以后，我越来越体会到应用web标准以后的种种好处。打开一个网页的源代码，结构清晰，标签应用准确，看到&lt;hx&gt;就知道这是标题，看到&lt;p&gt;就知道这是段落。去掉css以后，一个类似word文档的结构清晰的文件就呈现在页面上。</p>
<p>只有这样的网页，才能真正体现web标准化的优点。web标准化的优点主要是什么呢？加载速度快、易于维护、搜索引擎友好、减少带宽占用、利于团队分工合作……很多。采用div+css布局，做得好的话，也只不过是能够减小文件大小，提高加载速度，易于维护而已。有的文章里说“采用div+css”布局的页面更容易被搜索引擎索引，或者说“google更喜欢div+css”，这就是误区了。google喜欢的不是采用div布局或者table布局的页面，而是喜欢结构清晰良好的页面。比如一个导航条，如果采用table布局、采用flash实现、采用图片按钮等，那么google不能识别出这是对于网站来说很重要的导航条。而如果采用div布局，可以去掉很多不必要的table\tr标签，从而让对搜索引擎真正有用的两个内容——链接地址、标题更加突出。但是，只有真正符合web标准的结构，才能彻底剥离掉html代码里面的css和javascript。比如：</p>
<pre class="code"><span style="color: blue;">&lt;</span><span style="color: #a31515;">a </span><span style="color: red;">href</span><span style="color: blue;">="index.html" </span><span style="color: red;">title</span><span style="color: blue;">="首页" onmouseover="highLight(this)"
 style="font-weight:bold;color:red"&gt;</span>返回首页<span style="color: blue;">&lt;/</span><span style="color: #a31515;">a</span><span style="color: blue;">&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>这样一段代码，其中对搜索引擎有用的只不过是“index.html”和“首页”罢了。符合web标准的html应该是这样：</p>
<pre class="code"><span style="color: blue;">&lt;</span><span style="color: #a31515;">a </span><span style="color: red;">href</span><span style="color: blue;">="index.html" </span><span style="color: red;">title</span><span style="color: blue;">="首页"&gt;</span>返回首页<span style="color: blue;">&lt;/</span><span style="color: #a31515;">a</span><span style="color: blue;">&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>css怎么办呢？放到外部css文件里去，鼠标滑过的效果呢？放到外部js里去，为网页元素附加事件，这属于行为，应该是javascript的职责范围。不应该放到文档结构里。</p>
<p>刚才是一个结构表现行为混合的反面例子，除了三块不分开以外，现在网上流传很广的很多div+css布局的页面还存在另外一个问题，就是html标签使用不合理，虽然使用了div+css布局，但是html丝毫不能体现页面结构。比如：</p>
<pre class="code"><span style="color: blue;">&lt;</span><span style="color: #a31515;">div </span><span style="color: red;">id</span><span style="color: blue;">="wrap"&gt;
    &lt;</span><span style="color: #a31515;">div </span><span style="color: red;">id</span><span style="color: blue;">="head"&gt;
        &lt;</span><span style="color: #a31515;">div </span><span style="color: red;">id</span><span style="color: blue;">="logo"&gt;
            &lt;</span><span style="color: #a31515;">img </span><span style="color: red;">src</span><span style="color: blue;">="logo.gif" </span><span style="color: red;">border</span><span style="color: blue;">="0" </span><span style="color: red;">width</span><span style="color: blue;">="250" </span><span style="color: red;">height</span><span style="color: blue;">="60" /&gt;
        &lt;/</span><span style="color: #a31515;">div</span><span style="color: blue;">&gt;
    &lt;/</span><span style="color: #a31515;">div</span><span style="color: blue;">&gt;
&lt;/</span><span style="color: #a31515;">div</span><span style="color: blue;">&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>像这样的例子，现在互联网上遍地都是，做成这样，你可以说你抛弃了表格，采用了div+css布局，但是这样的div布局，有什么意义呢？除了抛弃表格赶了现在的时髦以外。这里的这张图是网站的标识，也就是说，搜索引擎来到这里，应该得到的是网站的名称之类的信息。那么结构合理的站点怎么做的呢？</p>
<pre class="code"><span style="color: blue;">&lt;</span><span style="color: #a31515;">div </span><span style="color: red;">id</span><span style="color: blue;">="wrap"&gt;
    &lt;</span><span style="color: #a31515;">div </span><span style="color: red;">id</span><span style="color: blue;">="head"&gt;
        &lt;</span><span style="color: #a31515;">h1</span><span style="color: blue;">&gt;</span>网站名称<span style="color: blue;">&lt;/</span><span style="color: #a31515;">h1</span><span style="color: blue;">&gt;
    &lt;/</span><span style="color: #a31515;">div</span><span style="color: blue;">&gt;
&lt;/</span><span style="color: #a31515;">div</span><span style="color: blue;">&gt;</span></pre>
<p>作为网站标题，也就是一本书的书名，一篇文章的标题，在word里面我们一般会设置“标题一”，在现阶段的HTML规范里，那就对应着一级标题&lt;h1&gt;，所以这里理所当然使用每个页面都应该有且仅有一个的&lt;h1&gt;。</p>
<p>可是设计图里这个地方不显示网站的标题而是现实网站的LOGO，怎么办呢？这就不属于文档结构的问题，而是页面表现的问题了，应该是css的职责。实现起来其实也不难：</p>
<pre class="code"><span style="color: #a31515;">h1 </span>{<span style="color: red;">background</span>:<span style="color: blue;">(logo.gif) no-repeat</span>;<span style="color: red;">width</span>:<span style="color: blue;">250px</span>;<span style="color: red;">height</span>:<span style="color: blue;">60px</span>;<span style="color: red;">text-indent</span>:<span style="color: blue;">-9999px</span>;}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>在web标准中，文档结构是首要问题，你的HTML应该体现你的网页的文档结构和层次，从每个部分的先后、重要程度、主次程度出发，考虑是段落还是标题？是列表还是引用？从而使用对应的标签。而不是为了实现设计样式，把重要的放下面，把标题改成图片。当然其中最失败的，就是到处都是div。</p>
<p>HTML中提供了那么多的标签，本意就是每个标签对应文档的不同部分，每个标签有各自的用途和意义。如果一切都从布局需要出发，只要是要应用样式的就来个div，那HTML还有什么意义？只需要&lt;html&gt;、&lt;head&gt;、&lt;body&gt;加上&lt;div&gt;、&lt;a&gt;就够了。还要&lt;ul&gt;、&lt;ol&gt;、&lt;dl&gt;、&lt;p&gt;、&lt;quote&gt;这些干什么呢？</p>
<p>最后还有一个误区，那就是——div+css布局才是标准化，用了table就是不标准。w3c从来没有说过table是不推荐使用的标签，更没有说过web标准要求禁止table。table的作用，是呈现数据，结构化的数据，在数据库中是怎么存储的？当然是以数据表的形式。那么这些数据要呈现到页面上，同样大部分时候仍然是以表格形式。在这个时候，就应该使用表格，使用table。</p>
<p>在web标准刚刚热火起来的时候，主要是针对大家已经使用多年形成依赖的table布局和table嵌套而把用div进行网页块划分和用table进行网页块划分的两种页面布局方式进行比较，从而才出现了“div布局”和“table布局”的概念。实际上，比这种叫法更准确的，应该是“css布局”和“html布局”。</p>
<p>一律使用div不是标准，标准也从来不禁用table。div只是web标准中用来实现网页布局的重要标签，实际上没有任何效果是必须依赖div的。所有的效果都是由css实现的，不管是div还是p，css都能让他们呈现出同样的效果。而table呢？应该回归到它本来的作用——呈现表格形式的数据。</p>
<p>我以前一直认为这只是网络上网页设计自学者和一些网页设计网站混淆了概念，搞错了重点。但是当我回到高校，从事电子商务开发方面的教学时，我才发现，问题已经蔓延到了高校教材、课堂教学中了。</p>
<p>现在其实有很多网页设计师，UI工程师和程序员都很努力地致力于web标准的推广。我想说的是，希望大家在传播web标准理念的时候，不要光顾技术细节、技巧方面的问题了，而忽略了web标准的本质——先进的设计模式和开发理念。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-21 -- <a href="http://wukangrui.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://wukangrui.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://wukangrui.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-04-16 -- <a href="http://wukangrui.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2010-06-02 -- <a href="http://wukangrui.com/2010/06/02/div-in-html5.html" title="HTML5时代的div">HTML5时代的div</a></li><li>2009-06-22 -- <a href="http://wukangrui.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li><li>2009-04-13 -- <a href="http://wukangrui.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://wukangrui.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2006-03-28 -- <a href="http://wukangrui.com/2006/03/28/simulate-window-in-center-with-css.html" title="CSS:模拟Windows窗口及DIV居中">CSS:模拟Windows窗口及DIV居中</a></li><li>2005-12-12 -- <a href="http://wukangrui.com/2005/12/12/action-of-refactor-page-with-css.html" title="实践：用Div+CSS重构网页">实践：用Div+CSS重构网页</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/re0A8aR2s6A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2009/10/13/misconceptions-about-web-standardization.html</feedburner:origLink></item>
		<item>
		<title>吃烧烤囧事</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/asLIynhXNxQ/funny-dialog.html</link>
		<comments>http://wukangrui.com/2009/10/08/funny-dialog.html#comments</comments>
		<pubDate>Wed, 07 Oct 2009 17:39:14 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[乱七八糟]]></category>
		<category><![CDATA[感受]]></category>
		<category><![CDATA[搞笑]]></category>
		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2009/10/08/funny-dialog.html</guid>
		<description><![CDATA[国庆长假的时候，回老家，返昆明之前在文山停留了一天，跟兄弟朋友聚聚。晚上唱完歌我们到“一品鸡翅尖”吃烧烤。可能是由于太晚了吧，生意不算很好，店铺里间只有我们和另外一桌。大家都是刚刚到。
 
就在等烧烤的时候，隔壁那一桌的对话就开始吸引我们的注意力了，一直到我们离开。实在让我觉得叹为观止。
隔壁最开始是三个女的一个男的，其中的一男大约是四十多接近五十岁的年纪，三个女的其中一个大约20多岁，长相一般，另外两个女的膀大腰圆，大约三十多岁。显然他们的人也没到齐。20多岁那个女的正在给朋友打电话：“快来快来，有两个美女一个帅哥！”
我由于位置关系，侧前方就是他们，看得非常清楚，听到这个女的打电话，和所看到的互相参照，让我有点忍俊不禁。当时脑子里重复了一下“两个美女一个帅哥”，很好笑但是没笑出来，也没跟朋友说起。
过了一会儿，我们正在吃，他们人都到齐了，一边吃一边互相敬酒。那位中年男人举起酒杯给其中一个三十多岁的胖女人敬酒，嘴里说：“我祝你永远美（丽）！”
按说朋友之间嘛，互相吹捧一下也是正常的，但是接下来那个女的回答的话差点让我们这桌刚喝的酒水全喷出来：“我心目中的美，就是要靠你们来多浇水、多施肥……”
我当时一下没忍住，赶紧把头转向另一边。我得承认，我在听到这句话的时候，心里实在是有点不健康的，不过，很显然不只是我这样理解了，我们这桌显然都是同样的理解。
我兄弟吃着吃着，嘴里开玩笑还把“多施肥”几个字说了出来，我频频提醒他：“别提起别提起……”，很担心因为这个导致两桌之间的冲突。
不过一个胖女人对一个老男人说：“我心目中的美，就是要靠你们来多浇水、多施肥”这样的形象，我不论从哪个角度去理解，都只能赞叹——太TMD经典了，太囧了！
相关日志2009-08-28 -- 突如其来的暴雨2007-06-15 -- 以前的邮件2006-09-19 -- 喝酒，喝酒……2006-09-06 -- 是在长大吗？2005-11-22 -- 《世界大战》2005-10-29 -- 感冒来袭2005-09-20 -- 有所失，有所思2005-09-12 -- 同样的人和事，N年前的我会怎样面对2005-07-03 -- To 贾宁旨：兄弟，保重！]]></description>
			<content:encoded><![CDATA[<p>国庆长假的时候，回老家，返昆明之前在文山停留了一天，跟兄弟朋友聚聚。晚上唱完歌我们到“一品鸡翅尖”吃烧烤。可能是由于太晚了吧，生意不算很好，店铺里间只有我们和另外一桌。大家都是刚刚到。</p>
<p> <span id="more-876"></span>
<p>就在等烧烤的时候，隔壁那一桌的对话就开始吸引我们的注意力了，一直到我们离开。实在让我觉得叹为观止。</p>
<p>隔壁最开始是三个女的一个男的，其中的一男大约是四十多接近五十岁的年纪，三个女的其中一个大约20多岁，长相一般，另外两个女的膀大腰圆，大约三十多岁。显然他们的人也没到齐。20多岁那个女的正在给朋友打电话：“快来快来，有两个美女一个帅哥！”</p>
<p>我由于位置关系，侧前方就是他们，看得非常清楚，听到这个女的打电话，和所看到的互相参照，让我有点忍俊不禁。当时脑子里重复了一下“两个美女一个帅哥”，很好笑但是没笑出来，也没跟朋友说起。</p>
<p>过了一会儿，我们正在吃，他们人都到齐了，一边吃一边互相敬酒。那位中年男人举起酒杯给其中一个三十多岁的胖女人敬酒，嘴里说：“我祝你永远美（丽）！”</p>
<p>按说朋友之间嘛，互相吹捧一下也是正常的，但是接下来那个女的回答的话差点让我们这桌刚喝的酒水全喷出来：“我心目中的美，就是要靠你们来多浇水、多施肥……”</p>
<p>我当时一下没忍住，赶紧把头转向另一边。我得承认，我在听到这句话的时候，心里实在是有点不健康的，不过，很显然不只是我这样理解了，我们这桌显然都是同样的理解。</p>
<p>我兄弟吃着吃着，嘴里开玩笑还把“多施肥”几个字说了出来，我频频提醒他：“别提起别提起……”，很担心因为这个导致两桌之间的冲突。</p>
<p>不过一个胖女人对一个老男人说：“我心目中的美，就是要靠你们来多浇水、多施肥”这样的形象，我不论从哪个角度去理解，都只能赞叹——太TMD经典了，太囧了！</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-08-28 -- <a href="http://wukangrui.com/2009/08/28/sudden-storm.html" title="突如其来的暴雨">突如其来的暴雨</a></li><li>2007-06-15 -- <a href="http://wukangrui.com/2007/06/15/old-email.html" title="以前的邮件">以前的邮件</a></li><li>2006-09-19 -- <a href="http://wukangrui.com/2006/09/19/drinking-and-drinking.html" title="喝酒，喝酒……">喝酒，喝酒……</a></li><li>2006-09-06 -- <a href="http://wukangrui.com/2006/09/06/does-it-mean-grow-up.html" title="是在长大吗？">是在长大吗？</a></li><li>2005-11-22 -- <a href="http://wukangrui.com/2005/11/22/movie-world-war-comment.html" title="《世界大战》">《世界大战》</a></li><li>2005-10-29 -- <a href="http://wukangrui.com/2005/10/29/catch-cold.html" title="感冒来袭">感冒来袭</a></li><li>2005-09-20 -- <a href="http://wukangrui.com/2005/09/20/thinking-after-lost.html" title="有所失，有所思">有所失，有所思</a></li><li>2005-09-12 -- <a href="http://wukangrui.com/2005/09/12/think-about-our-choose-of-life.html" title="同样的人和事，N年前的我会怎样面对">同样的人和事，N年前的我会怎样面对</a></li><li>2005-07-03 -- <a href="http://wukangrui.com/2005/07/03/say-goodbye-to-my-brother.html" title="To 贾宁旨：兄弟，保重！">To 贾宁旨：兄弟，保重！</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/asLIynhXNxQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2009/10/08/funny-dialog.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2009/10/08/funny-dialog.html</feedburner:origLink></item>
		<item>
		<title>突如其来的暴雨</title>
		<link>http://feedproxy.google.com/~r/wukangrui/~3/MEQcYt0xxi4/sudden-storm.html</link>
		<comments>http://wukangrui.com/2009/08/28/sudden-storm.html#comments</comments>
		<pubDate>Fri, 28 Aug 2009 12:21:48 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[点滴珍藏]]></category>
		<category><![CDATA[日记]]></category>
		<category><![CDATA[暴雨]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://wukangrui.com/2009/08/28/sudden-storm.html</guid>
		<description><![CDATA[昨天下班走得比较早，办了一卡通之后，就叫碧姐一起去食堂吃饭。等了蛮久她才忙完，我们要出门的时候已经开始飘起小雨了。我这个人向来是不备伞不带伞的，幸好之前办宽带的时候送了一把电信天翼的宣传伞。我拿了伞下楼，结果雨又小到若有若无了。
 
在食堂吃饭的时候，雨开始渐渐大起来。碧姐说：雨很大，干脆慢慢吃。
但是我吃完的时候看到有学生不打伞直接走出食堂，雨又小下去了。于是我们也离开食堂。刚走了十多米，暴雨骤然而至。从若有若无到倾盆大雨之间没有任何过度，别说是一把伞，就算是我们各拿了一把大伞也挡不住，何况还有风不断把雨从侧面吹过来。
旁边就是趁开学到学校来设点促销的遮阳伞摊点。一男一女两个年轻人已经收拾好东西了，只差伞和桌子还没收，我们赶紧跑到他们的伞下，暂避一时。
那个男的手里举着铺桌子的布，挡住风吹过来的雨，但是没坚持多一会儿，他就跑到车（他们开了一辆三厢轿车在那里）里去了，剩下那个女孩子怕风把伞吹跑，还守着。
这时候又有三个学生家长挤了进来，雨更大了，风也更大了。大家都把手里的伞撑到风吹过来的方向，挡住雨水。但是伞本来设计的是对付头顶落下的雨，挡侧面就有点力不从心了，大家尽量用伞护住头部和衣服，裤子、裙子都已经湿透了。一阵大过一阵的风刮来，虽然是8月，在暴雨中穿得很单薄的我们都冷得发抖。
坚持了十来分钟，风力猛然增大，太阳伞不断地向后扬。于是我们纷纷用手抓住伞梁，不让风把它吹走。这时候风助雨势雨借风力，三把雨伞终于失去了作用，我们每个人都已经是浑身湿透了，这时候站在太阳伞下已经失去了避雨的意义，我们唯一能做的就是尽量帮助那个拼命保护太阳伞的女孩子，帮她抓住在一阵强过一阵的风中摇摇欲坠的伞。
又过了一会儿，拿雨伞的三个人都坚持不住，跑回食堂去了，我们剩下的人依然在坚持，猛烈的雨水打在脸上，我觉得什么都看不清楚，只是感觉风力稍有增强，就拼命抓住。
最后，风还是没能把太阳伞连根拔起，但是伞布已经被撕破了，我们再抓住架子也没意义了，大家才陆续撒手跑进食堂去。那个女孩子还拼命地抓住伞架不肯走，我拼命跟她喊：“大家都走了，你一个人抓不住，你会被伞带翻的！”后来强行把她的手掰开，她才躲进了车里去。
我跑到食堂，碧姐和我都已经浑身湿透了，我身上的钱，还有背的包都无一幸免，我们干脆冒着雨跑回宿舍。我回到自己宿舍，换了衣服，擦干身子直接钻到被窝里睡觉了，虽然这时候还不到20点。
相关日志2007-06-15 -- 以前的邮件2006-09-19 -- 喝酒，喝酒……2006-09-06 -- 是在长大吗？2005-10-29 -- 感冒来袭2005-09-20 -- 有所失，有所思2005-09-12 -- 同样的人和事，N年前的我会怎样面对2005-07-03 -- To 贾宁旨：兄弟，保重！2005-05-12 -- 十月九日夜2009-10-08 -- 吃烧烤囧事2008-08-26 -- 感谢让我学会享受痛苦的人]]></description>
			<content:encoded><![CDATA[<p>昨天下班走得比较早，办了一卡通之后，就叫碧姐一起去食堂吃饭。等了蛮久她才忙完，我们要出门的时候已经开始飘起小雨了。我这个人向来是不备伞不带伞的，幸好之前办宽带的时候送了一把电信天翼的宣传伞。我拿了伞下楼，结果雨又小到若有若无了。</p>
<p> <span id="more-868"></span>
<p>在食堂吃饭的时候，雨开始渐渐大起来。碧姐说：雨很大，干脆慢慢吃。</p>
<p>但是我吃完的时候看到有学生不打伞直接走出食堂，雨又小下去了。于是我们也离开食堂。刚走了十多米，暴雨骤然而至。从若有若无到倾盆大雨之间没有任何过度，别说是一把伞，就算是我们各拿了一把大伞也挡不住，何况还有风不断把雨从侧面吹过来。</p>
<p>旁边就是趁开学到学校来设点促销的遮阳伞摊点。一男一女两个年轻人已经收拾好东西了，只差伞和桌子还没收，我们赶紧跑到他们的伞下，暂避一时。</p>
<p>那个男的手里举着铺桌子的布，挡住风吹过来的雨，但是没坚持多一会儿，他就跑到车（他们开了一辆三厢轿车在那里）里去了，剩下那个女孩子怕风把伞吹跑，还守着。</p>
<p>这时候又有三个学生家长挤了进来，雨更大了，风也更大了。大家都把手里的伞撑到风吹过来的方向，挡住雨水。但是伞本来设计的是对付头顶落下的雨，挡侧面就有点力不从心了，大家尽量用伞护住头部和衣服，裤子、裙子都已经湿透了。一阵大过一阵的风刮来，虽然是8月，在暴雨中穿得很单薄的我们都冷得发抖。</p>
<p>坚持了十来分钟，风力猛然增大，太阳伞不断地向后扬。于是我们纷纷用手抓住伞梁，不让风把它吹走。这时候风助雨势雨借风力，三把雨伞终于失去了作用，我们每个人都已经是浑身湿透了，这时候站在太阳伞下已经失去了避雨的意义，我们唯一能做的就是尽量帮助那个拼命保护太阳伞的女孩子，帮她抓住在一阵强过一阵的风中摇摇欲坠的伞。</p>
<p>又过了一会儿，拿雨伞的三个人都坚持不住，跑回食堂去了，我们剩下的人依然在坚持，猛烈的雨水打在脸上，我觉得什么都看不清楚，只是感觉风力稍有增强，就拼命抓住。</p>
<p>最后，风还是没能把太阳伞连根拔起，但是伞布已经被撕破了，我们再抓住架子也没意义了，大家才陆续撒手跑进食堂去。那个女孩子还拼命地抓住伞架不肯走，我拼命跟她喊：“大家都走了，你一个人抓不住，你会被伞带翻的！”后来强行把她的手掰开，她才躲进了车里去。</p>
<p>我跑到食堂，碧姐和我都已经浑身湿透了，我身上的钱，还有背的包都无一幸免，我们干脆冒着雨跑回宿舍。我回到自己宿舍，换了衣服，擦干身子直接钻到被窝里睡觉了，虽然这时候还不到20点。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2007-06-15 -- <a href="http://wukangrui.com/2007/06/15/old-email.html" title="以前的邮件">以前的邮件</a></li><li>2006-09-19 -- <a href="http://wukangrui.com/2006/09/19/drinking-and-drinking.html" title="喝酒，喝酒……">喝酒，喝酒……</a></li><li>2006-09-06 -- <a href="http://wukangrui.com/2006/09/06/does-it-mean-grow-up.html" title="是在长大吗？">是在长大吗？</a></li><li>2005-10-29 -- <a href="http://wukangrui.com/2005/10/29/catch-cold.html" title="感冒来袭">感冒来袭</a></li><li>2005-09-20 -- <a href="http://wukangrui.com/2005/09/20/thinking-after-lost.html" title="有所失，有所思">有所失，有所思</a></li><li>2005-09-12 -- <a href="http://wukangrui.com/2005/09/12/think-about-our-choose-of-life.html" title="同样的人和事，N年前的我会怎样面对">同样的人和事，N年前的我会怎样面对</a></li><li>2005-07-03 -- <a href="http://wukangrui.com/2005/07/03/say-goodbye-to-my-brother.html" title="To 贾宁旨：兄弟，保重！">To 贾宁旨：兄弟，保重！</a></li><li>2005-05-12 -- <a href="http://wukangrui.com/2005/05/12/on-october-9th-night.html" title="十月九日夜">十月九日夜</a></li><li>2009-10-08 -- <a href="http://wukangrui.com/2009/10/08/funny-dialog.html" title="吃烧烤囧事">吃烧烤囧事</a></li><li>2008-08-26 -- <a href="http://wukangrui.com/2008/08/26/thanks-to-those-make-me-painful.html" title="感谢让我学会享受痛苦的人">感谢让我学会享受痛苦的人</a></li></ul><img src="http://feeds.feedburner.com/~r/wukangrui/~4/MEQcYt0xxi4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wukangrui.com/2009/08/28/sudden-storm.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://wukangrui.com/2009/08/28/sudden-storm.html</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.996 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-06-16 21:46:42 --><!-- Compression = gzip -->
