<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>裁纸刀下 &#187; javascript</title>
	<atom:link href="http://ofcss.com/tags/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://ofcss.com</link>
	<description>独立 自由 诚信 宽容 责任 平常心</description>
	<lastBuildDate>Fri, 20 Apr 2012 04:08:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>对《优化浏览器渲染》的补充【译】</title>
		<link>http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html</link>
		<comments>http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html#comments</comments>
		<pubDate>Mon, 14 Mar 2011 08:06:50 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<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://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html</guid>
		<description><![CDATA[ISD Webteam的大布同学（twitter：@tc_bryanzhang）在2010年1月翻译了google Page Speed系列中的Optimize browser rendering，很是方便了大家。在此基础上，google又有了更新，我且在此把google新增的部分翻译一下，作为对大布同学译稿的补充。 google这篇文章关注的是资源被下载到客户端以后，在浏览器加载、解释、渲染HTML、CSS和JavaScript阶段的性能优化，提出了5个要点： 使用高效率的CSS选择器 避免CSS expressions 将样式表放在页面顶部 指定图像尺寸 尽早指定文档的字符编码 前四点大布同学已经翻译过了，没拜读过的同学可以点击上面的链接到涛哥的博客学习，第五点的翻译如下： 概述 为HTML文档尽早指定字符编码，可以让浏览器立刻开始执行脚本。 细节 HTML文档是作为带有字符编码信息的字节流序列在互联网中传送的。字符编码信息可以在随文档发送的HTTP响应头信息中指定，也可以在文档的HTML标签中指定。浏览器根据字符编码信息将字节流转换为显示在浏览器上的字符。如果不知道如何构造一个页面的字符，浏览器自然也不能正确地渲染页面。绝大部分浏览器在开始执行任何JavaScript代码或者绘制页面之前都要缓冲一定数量的字节流，缓冲的同时它们也要查找相关的字符编码设定（一个值得注意的例外是IE6/7/8）。 不同浏览器需要缓冲的字节流数量不同，另外如果找不到编码设定，各浏览器默认的编码也不同。但是不管哪一种浏览器，如果在已经缓冲了足够的字节流、开始渲染页面之后才发现指定的编码设定与其默认值不同，都会导致重新解析文档并重绘页面。如果编码的变化影响到了外部资源（例如css\js\media），浏览器甚至会重新对资源进行请求。 为了避免这些延迟，对任何超过1k（精确地说是1024字节，这是我们测试过的所有浏览器的最大缓冲限制）的HTML文档，要尽早指定字符编码。 建议 通过HTTP头信息或meta标签指定编码 为HTML文档指定编码设定有几种方式： 服务器端：通过web服务器的配置来指定编码参数，为所有text/html类型的文档指定带有正确编码信息的Content-Type头信息。例如 Content-Type: text/html;charset=UTF-8 客户端：在HTML代码中包含http-equiv=&#34;content-type&#34;的meta标签，并指定字符编码。例如 。 如果可能的话，为你的web服务器做指定字符编码的HTTP头信息配置。某些浏览器（例如Firefox）在执行JavaScript之前会用（比其它浏览器）更短的延迟缓冲来检查头信息中是否指定字符编码。这意味着它们可以跳过对HTML标签的检查，缩短缓冲的字节数和延迟时间。 把meta标签放在head区域的最前面 如果你不能对web服务器配置进行修改，又需要通过meta标签指定编码，要确保你用于指定编码的meta标签是文档中head标签的第一个子元素。浏览器会在文档的前1024字节中寻找字符编码参数，因此为了避免性能损耗，编码参数在文档头部越早出现越好（译注：在IE6以下的版本中，特定情况下，如果该meta标签不是head的第一个子元素，则会被忽略。具体触发情况尚未进行仔细测试，初步估计是与web服务器配置的默认编码或浏览器默认编码有关）。 始终指定文档类型 在浏览器开始检查字符编码设定前，它们必须先检测将被处理的文档是什么类型。如果没有在头信息或meta标签中指定文档类型（content-type），浏览器就会通过很复杂的算法去“嗅探”文档的类型。这个过程会造成额外的延迟，而且还会带来安全漏洞。 务必指定正确的字符编码 你在HTTP头信息或meta标签中指定的字符编码设置一定要和编辑HTML文档时的实际字符编码一致，这非常重要。另外，如果同时通过HTTP头信息和Meta标签两种方式指定了字符编码，它们一定要保持一致。否则浏览器发现两者相互矛盾，会造成页面渲染错误或者为了重绘页面而造成额外的延迟。有关这一点，你可以阅读HTML 4.01规范（英文）中的5.2节：字符编码（英文）。 扩展阅读 如果需要进一步了解content-type以及字符编码设定存在/缺少的不同情况下浏览器行为的细节，可以参阅以下资料（英文）： Page Speed wiki Browser Performance Issues with Charsets Performance Implications of &#34;charset&#34; 相关日志2010-06-09 -- 最近的书单2009-06-22 -- Whatever:hover [...]]]></description>
			<content:encoded><![CDATA[<p>ISD Webteam的大布同学（twitter：<a href="http://twitter.com/tc_bryanzhang">@tc_bryanzhang</a>）在2010年1月翻译了google Page Speed系列中的<a href="http://code.google.com/intl/zh-CN/speed/page-speed/docs/rendering.html">Optimize browser rendering</a>，很是方便了大家。在此基础上，google又有了更新，我且在此把google新增的部分翻译一下，作为对大布同学译稿的补充。</p>
<p>google这篇文章关注的是资源被下载到客户端以后，在浏览器加载、解释、渲染HTML、CSS和JavaScript阶段的性能优化，提出了5个要点：</p>
<ol>
<li><a href="http://www.99css.com/archives/275#UseEfficientCSSSelectors">使用高效率的CSS选择器</a> </li>
<li><a href="http://www.99css.com/archives/275#AvoidCSSExpressions">避免CSS expressions</a> </li>
<li><a href="http://www.99css.com/archives/275#PutCSSInHead">将样式表放在页面顶部</a> </li>
<li><a href="http://www.99css.com/archives/275#SpecifyImageDimensions">指定图像尺寸</a> </li>
<li>尽早指定文档的字符编码 </li>
</ol>
<p><span id="more-1084"></span>
<p>前四点大布同学已经翻译过了，没拜读过的同学可以点击上面的链接到涛哥的博客学习，第五点的翻译如下：</p>
<h4>概述</h4>
<p>为HTML文档尽早指定字符编码，可以让浏览器立刻开始执行脚本。</p>
<h4>细节</h4>
<p>HTML文档是作为带有字符编码信息的字节流序列在互联网中传送的。字符编码信息可以在随文档发送的HTTP响应头信息中指定，也可以在文档的HTML标签中指定。浏览器根据字符编码信息将字节流转换为显示在浏览器上的字符。如果不知道如何构造一个页面的字符，浏览器自然也不能正确地渲染页面。绝大部分浏览器在开始执行任何JavaScript代码或者绘制页面之前都要缓冲一定数量的字节流，缓冲的同时它们也要查找相关的字符编码设定（一个值得注意的例外是IE6/7/8）。</p>
<p>不同浏览器需要缓冲的字节流数量不同，另外如果找不到编码设定，各浏览器默认的编码也不同。但是不管哪一种浏览器，如果在已经缓冲了足够的字节流、开始渲染页面之后才发现指定的编码设定与其默认值不同，都会导致重新解析文档并重绘页面。如果编码的变化影响到了外部资源（例如css\js\media），浏览器甚至会重新对资源进行请求。</p>
<p>为了避免这些延迟，对任何超过1k（精确地说是1024字节，这是我们测试过的所有浏览器的最大缓冲限制）的HTML文档，要尽早指定字符编码。</p>
<h4>建议</h4>
<p><strong>通过HTTP头信息或meta标签指定编码</strong></p>
<dl style="margin-left: 2em">
<dt>为HTML文档指定编码设定有几种方式： </dt>
<dd style="margin-left: 2em">服务器端：通过web服务器的配置来指定编码参数，为所有text/html类型的文档指定带有正确编码信息的Content-Type头信息。例如 <font color="#9bbb59">Content-Type: text/html;charset=UTF-8</font> </dd>
<dd style="margin-left: 2em">客户端：在HTML代码中包含<font color="#9bbb59">http-equiv=&quot;content-type&quot;</font>的meta标签，并指定字符编码。例如 <meta content="text/html;charset=utf-8" http-equiv="Content-Type" />。 </dd>
</dl>
<p>如果可能的话，为你的web服务器做指定字符编码的HTTP头信息配置。某些浏览器（例如Firefox）在执行JavaScript之前会用（比其它浏览器）更短的延迟缓冲来检查头信息中是否指定字符编码。这意味着它们可以跳过对HTML标签的检查，缩短缓冲的字节数和延迟时间。</p>
<p><strong>把meta标签放在head区域的最前面</strong></p>
<p>如果你不能对web服务器配置进行修改，又需要通过meta标签指定编码，要确保你用于指定编码的meta标签是文档中head标签的第一个子元素。浏览器会在文档的前1024字节中寻找字符编码参数，因此为了避免性能损耗，编码参数在文档头部越早出现越好（译注：在IE6以下的版本中，特定情况下，如果该meta标签不是head的第一个子元素，则会被忽略。具体触发情况尚未进行仔细测试，初步估计是与web服务器配置的默认编码或浏览器默认编码有关）。</p>
<p><strong>始终指定文档类型</strong></p>
<p>在浏览器开始检查字符编码设定前，它们必须先检测将被处理的文档是什么类型。如果没有在头信息或meta标签中指定文档类型（content-type），浏览器就会通过很复杂的算法去“嗅探”文档的类型。这个过程会造成额外的延迟，而且还会带来安全漏洞。</p>
<p><strong>务必指定正确的字符编码</strong></p>
<p>你在HTTP头信息或meta标签中指定的字符编码设置一定要和编辑HTML文档时的实际字符编码一致，这非常重要。另外，如果同时通过HTTP头信息和Meta标签两种方式指定了字符编码，它们一定要保持一致。否则浏览器发现两者相互矛盾，会造成页面渲染错误或者为了重绘页面而造成额外的延迟。有关这一点，你可以阅读HTML 4.01规范（英文）中的5.2节：字符编码（英文）。</p>
<p><strong>扩展阅读</strong></p>
<p>如果需要进一步了解content-type以及字符编码设定存在/缺少的不同情况下浏览器行为的细节，可以参阅以下资料（英文）：</p>
<ul>
<li><a href="http://code.google.com/p/page-speed/wiki/SpecifyCharsetEarly" target="_blank">Page Speed wiki</a> </li>
<li><a href="http://zoompf.com/blog/2009/12/browser-performance-issues-with-charsets/" target="_blank">Browser Performance Issues with Charsets</a> </li>
<li><a href="http://www.kylescholz.com/blog/2010/01/performance_implications_of_charset.html" target="_blank">Performance Implications of &quot;charset&quot;</a> </li>
</ul>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2010-06-09 -- <a href="http://ofcss.com/2010/06/09/my-rencent-booklist.html" title="最近的书单">最近的书单</a></li><li>2009-06-22 -- <a href="http://ofcss.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>2011-03-10 -- <a href="http://ofcss.com/2011/03/10/css-border-tricks-with-collapsed-boxes-translation.html" title="CSS边框实现&ldquo;无图化&rdquo;设计【译】">CSS边框实现&ldquo;无图化&rdquo;设计【译】</a></li><li>2010-10-31 -- <a href="http://ofcss.com/2010/10/31/prevent-a-float-drop-in-ie6-translation.html" title="CSS技巧:如何避免IE6中的&quot;浮动下坠&quot;【译】">CSS技巧:如何避免IE6中的&quot;浮动下坠&quot;【译】</a></li><li>2010-10-22 -- <a href="http://ofcss.com/2010/10/22/the-value-of-html-validation-translation.html" title="HTML验证的价值探讨【译】">HTML验证的价值探讨【译】</a></li><li>2010-10-20 -- <a href="http://ofcss.com/2010/10/20/clearfix-reloaded-overflowhidden-demystified-translation.html" title="clearfix改良及overflow:hidden详解【译】">clearfix改良及overflow:hidden详解【译】</a></li><li>2009-12-21 -- <a href="http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>最近的书单</title>
		<link>http://ofcss.com/2010/06/09/my-rencent-booklist.html</link>
		<comments>http://ofcss.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中的这些高级概念，绝对值得一读。 相关日志2011-03-14 -- 对《优化浏览器渲染》的补充【译】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 -- 动态实现指定图片半透明及鼠标事件2012-03-22 -- CssGaga 快速上手指南2011-05-26 -- 深入解析CSS样式层叠权重值]]></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>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2009-12-21 -- <a href="http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-06-22 -- <a href="http://ofcss.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://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2007-03-01 -- <a href="http://ofcss.com/2007/03/01/good-book-for-css-layout.html" title="好书推荐：《别具光芒：DIV+CSS网页布局与美化》">好书推荐：《别具光芒：DIV+CSS网页布局与美化》</a></li><li>2006-04-04 -- <a href="http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2012-03-22 -- <a href="http://ofcss.com/2012/03/22/cssgaga-quick-start.html" title="CssGaga 快速上手指南">CssGaga 快速上手指南</a></li><li>2011-05-26 -- <a href="http://ofcss.com/2011/05/26/css-cascade-specificity.html" title="深入解析CSS样式层叠权重值">深入解析CSS样式层叠权重值</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2010/06/09/my-rencent-booklist.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>前台开发从头说起：理解css盒模型</title>
		<link>http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html</link>
		<comments>http://ofcss.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>  <span id="more-891"></span>
<p>网上有两张著名的图片，分别以2D和3D的形式描述css盒模型：</p>
<p style="text-align: center"><img title="图片1" alt="图片1" src="http://file.wukangrui.com/blog/webcss_13001/1_thumb.gif" width="460" height="262" /></p>
<p style="text-align: center"><a href="http://file.wukangrui.com/blog/webcss_13001/cssbox3d.gif"><img title="cssbox3d" 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 title="c00" alt="c00" src="http://file.wukangrui.com/blog/webcss_13001/c00_thumb.gif" width="14" height="19" /></a> 放入一个高度为30像素，背景色为#f00的块元素，设定图片在Y轴方向不平铺，在x轴方向平铺。结果得到一个类似下图的效果：</p>
<p style="text-align: center"><a href="http://file.wukangrui.com/blog/webcss_13001/c00f33.gif"><img title="c00f33" alt="c00f33" src="http://file.wukangrui.com/blog/webcss_13001/c00f33_thumb.gif" width="104" height="34" /></a> </p>
<p>这是简单的由背景色与背景图组合实现的效果。根据这样的原理，当我们的文档结构有两层时，例如：&lt;a href=”#&quot;&gt;&lt;span&gt;文字&lt;/span&gt;&lt;/a&gt;，我们可以通过由a元素的背景颜色图片和span元素的背景颜色图片组合，从而得到较为复杂的效果，例如：</p>
<p style="text-align: center"><a href="http://file.wukangrui.com/blog/webcss_13001/button.gif"><img title="button" alt="button" src="http://file.wukangrui.com/blog/webcss_13001/button_thumb.gif" width="204" height="40" /></a></p>
<p>这个按钮效果，用纯图片很容易实现，但是用图片实现就会面临一个问题：不通用。如果要通用，应该把文字和背景图片分离开来，同时，由于文字有多有少，因此按钮的宽度要是可变的，但是按钮并不是从左到右完全一致的背景，于是不能使用一张图片进行横向平铺，按照以前的做法，可能会使用一个一行三列的表格，第一个单元格放入左侧的图片，中间的单元格放文字和平铺的背景，右边的单元格放右侧的图片。这种思维传递到了“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 style="text-align: center"><a href="http://file.wukangrui.com/blog/webcss_13001/image.png"><img title="image" 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>用到的背景图片如下：</p>
<p style="text-align: center"><a href="http://file.wukangrui.com/blog/webcss_13001/button_3.gif"><img title="button" alt="button" src="http://file.wukangrui.com/blog/webcss_13001/button_thumb_3.gif" width="200" height="72" /></a>&#160;</p>
<p>这个例子很简单，但是需要对“背景组合”有足够的理解，能够想到应用。而要想到如此应用，首先是对于盒模型中的“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>除了利用display:block让行内元素改变为块元素从而使用盒模型特征外，在浮动的时候，也经常会用到盒模型的一些特征。再举个例子：</p>
<p>使用浮动布局的时候，并列呈现的浮动元素中的第一个如果设置与浮动方向相同的margin，则IE 6下会出现margin加倍的bug（这就是著名的IE6浮动边距加倍bug）。为了解决这个问题，很多人喜欢给一组浮动元素的第一个加上class=”first”，从而可以对这个元素单独应用样式。或者对这一组浮动元素加上display:inline的属性以解决这个bug。</p>
<p>上述两种方式都是没有使用hack选择符或者类似“_margin”这样的非标准属性的很好的hack方式。但是，如果不是非用margin不可，只要使用padding来代替margin，就能解决这个问题。或者采用与浮动方向相反的margin也可以。不需要任何额外的hack。这也是在充分理解盒模型的基础上，由于对这个bug的了解，从而在实现样式的时候直接避开，而不是出现了之后再用额外手段去hack。</p>
<p>对盒模型的理解，除了margin、border、padding、width、height五大属性以及两种背景的应用之外，还要了解父级元素与子元素之间的关系。比如父元素没有设置尺寸，而对子元素设置margin-top属性，在某些浏览器下，本来是想针对父元素的边缘设置margin，结果margin被设置到了父元素之外，造成父元素与外部元素的margin。这种情况，将子元素的margin改成父元素的padding，也可以在不改变表现的情况下实现相同的效果。</p>
<p>要想通过对盒模型特征的充分应用来减少css中的hack使用，或者以更简洁的代码实现更复杂的效果，需要对盒模型不断地尝试和总结。这是《css权威指南》之类的经典巨著也没法教给你的。</p>
<p>只有越理解盒模型，才能越好地利用浮动和定位来实现复杂、精确的布局。关于浮动的问题，下一次我们再一起来了解一下。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-10-13 -- <a href="http://ofcss.com/2009/10/13/misconceptions-about-web-standardization.html" title="关于web标准化的一些误区">关于web标准化的一些误区</a></li><li>2009-06-22 -- <a href="http://ofcss.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://ofcss.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2011-03-12 -- <a href="http://ofcss.com/2011/03/12/flexible-two-column-layout-reloaded.html" title="自适应的多列图文混排改进">自适应的多列图文混排改进</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>前台开发从头说起：谈谈CSS选择符</title>
		<link>http://ofcss.com/2009/12/16/web-developer-about-css-selector.html</link>
		<comments>http://ofcss.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://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-10-13 -- <a href="http://ofcss.com/2009/10/13/misconceptions-about-web-standardization.html" title="关于web标准化的一些误区">关于web标准化的一些误区</a></li><li>2009-06-22 -- <a href="http://ofcss.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://ofcss.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2011-03-12 -- <a href="http://ofcss.com/2011/03/12/flexible-two-column-layout-reloaded.html" title="自适应的多列图文混排改进">自适应的多列图文混排改进</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2009/12/16/web-developer-about-css-selector.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>前台开发从头说起：关于web标准化</title>
		<link>http://ofcss.com/2009/12/15/web-developer-from-web-standard.html</link>
		<comments>http://ofcss.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://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-10-13 -- <a href="http://ofcss.com/2009/10/13/misconceptions-about-web-standardization.html" title="关于web标准化的一些误区">关于web标准化的一些误区</a></li><li>2009-06-22 -- <a href="http://ofcss.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://ofcss.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2011-03-12 -- <a href="http://ofcss.com/2011/03/12/flexible-two-column-layout-reloaded.html" title="自适应的多列图文混排改进">自适应的多列图文混排改进</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2009/12/15/web-developer-from-web-standard.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</title>
		<link>http://ofcss.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html</link>
		<comments>http://ofcss.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html#comments</comments>
		<pubDate>Mon, 22 Jun 2009 15:50:40 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[网页]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/06/22/whatever-hover-pseudo-class-without-javascript.html</guid>
		<description><![CDATA[绝大部分现代浏览器支持 css 中的 :hover 伪类选择器，可以用于所有 html 元素。这很酷，因为这使你可以仅通过 css 来对表格行(&#60;tr&#62;)应用鼠标滑过事件(mouseover)时的特殊效果。然而，万恶的IE，对 :hover 伪类顶多只提供了有限的支持，具体支持的程度要取决于你的IE浏览器的具体版本。 Whatever:hover 是一个小小的脚本，它可以迅速、自动地为IE6，IE7，IE8添加标准的 :hover、:active 和 :focus 伪类支持。第三版引入了 ajax 支持，意味着通过 javascript 动态添加到文档中的任意html元素也同样可以在IE中响应 :hover、:active 和 :focus 样式。 如果你已经对使用 whatever:hover 很熟练，现在只是想下载它，你可以直接跳转到获取最新版本。而对于其它想深入了解它的人，请继续阅读。 使用方法 你只需要将 whatever:hover 链接到 body 元素就可以了。注意这里的 behavior 属性中的 URL 是相对于 html 文件的，而不是像背景图片地址一样是相对于 css 文件的路径。 body { behavior: url(&#34;csshover3.htc&#34;); } 工作原理 所有的浏览器都提供了一些方法，让你用 javascript 查询样式表中定义好的规则或者动态地插入新规则。正常情况下，IE 对所有它不支持的规则返回 “unknown”。例如：一条关于 “div p:first-child” [...]]]></description>
			<content:encoded><![CDATA[<p>绝大部分现代浏览器支持 css 中的 :hover 伪类选择器，可以用于所有 html 元素。这很酷，因为这使你可以仅通过 css 来对表格行(&lt;tr&gt;)应用鼠标滑过事件(mouseover)时的特殊效果。然而，万恶的IE，对 :hover 伪类顶多只提供了有限的支持，具体支持的程度要取决于你的IE浏览器的具体版本。</p>
<p>Whatever:hover 是一个小小的脚本，它可以迅速、自动地为IE6，IE7，IE8添加标准的 :hover、:active 和 :focus 伪类支持。第三版引入了 ajax 支持，意味着通过 javascript 动态添加到文档中的任意html元素也同样可以在IE中响应 :hover、:active 和 :focus 样式。</p>
<p> <span id="more-776"></span>
<p>如果你已经对使用 whatever:hover 很熟练，现在只是想下载它，你可以直接跳转到<a href="#changes" rel="enclosure">获取最新版本</a>。而对于其它想深入了解它的人，请继续阅读。</p>
<h3>使用方法</h3>
<p>你只需要将 whatever:hover 链接到 body 元素就可以了。注意这里的 behavior 属性中的 URL 是相对于 html 文件的，而不是像背景图片地址一样是相对于 css 文件的路径。</p>
<pre class="code"><span style="color: #a31515">body </span>{ <span style="color: red">behavior</span>: <span style="color: blue">url(&quot;csshover3.htc&quot;)</span>; }</pre>
<h3>工作原理</h3>
<p>所有的浏览器都提供了一些方法，让你用 javascript 查询样式表中定义好的规则或者动态地插入新规则。正常情况下，IE 对所有它不支持的规则返回 “unknown”。例如：一条关于 “div p:first-child” 的规则将会被改成 &quot;div p:unknown”， 而一条关于 &quot;p a[href]” 的规则将整体地作为 &quot;unknown&quot; 返回。幸运的是 IE 把 :hover 伪类认为是它支持的样式规则，并且会将它保持原样。</p>
<p>IE 还支持所谓的<a title="Internet Explorer 行为" href="http://msdn.microsoft.com/zh-cn/library/ms531078.aspx" rel="external" target="_blank">行为（behaviors）</a>，不仅包括预定义的功能比如动态加载内容或者持续数据存储，也包括你可以在一个后缀为 .htc 或者 .hta 为的文件中创建的自定义行为。这些行为通过 css 实现与 html 节点关联，并“增强”这些被指定行为中的样式选择器选中的节点。</p>
<p>综上所述，创建一个行为来查找样式表中 IE 不支持的元素，并以一些其它手段“欺骗”影响的到元素让它们应用样式表中关联的样式。这个复杂的操作中包含的步骤大致可以描述为：</p>
<ul>
<li>在所有的样式表中搜索 IE 不支持的 :hover 伪类规则； </li>
<li>插入一条 IE 支持的，例如带 class 名称的新规则； </li>
<li>最后，设置脚本事件来切换目标元素的 class 名称。 </li>
</ul>
<p>通过这种方式，:hover、:active 和 :focus 就可以得到（IE 的）支持了。而作为开发人员，你除了包含这个行为以外不需要做任何事。所有的工作都将自动完成。</p>
<p>与第1版和第2版比较，第3版对动态加入的 html (ajax) 也同样支持。另外还有一个改动是原来第1版和第2版采用的是在页面加载事件中主动搜索影响到的元素，而在第3版中改为借助表达式（<a title="MSDN - 动态属性" href="http://msdn.microsoft.com/zh-cn/library/ms537634.aspx" rel="external" target="_blank">expressions</a>）让节点自己回调。关于这部分你可以阅读带注释的版本获取更多细节。</p>
<h3>示例：菜单效果</h3>
<p>:hover 一个很常见的用途就是用列表创建菜单系统。用这个行为来创建一个两级的菜单系统是再容易不过的事情了。例如，如果你从 <a title="suckerfish dropdown" href="http://www.htmldog.com/articles/suckerfish/example/" rel="external" target="_blank">suckerfish dropdown</a> （一个带有下拉菜单的网页，关于这个页面和效果的描述，参见 <a href="http://www.alistapart.com/articles/dropdowns/" rel="external" target="_blank">A List Apart article</a>）上把 javascript 删除掉了，它仍然能正常工作。</p>
<p>但是多级的菜单需要做不同的处理。这是由于 IE 不支持子选择符 ‘&gt;’，子选择符可以完美地显示下级子菜单，而不是连更深层的菜单一起显示出来。</p>
<pre class="code"><span style="color: #a31515">li:hover &gt; ul </span>{ <span style="color: green">/* 在 IE 下无效 */ </span>}</pre>
<p>有一种可供选择的方法可以只使用简单的子孙选择符来模拟这种行为（主要是针对 IE）。还有种不太成熟的方法是应用多个类定义，但是更简单的方法是利用 CSS 选择符的不同<a href="http://www.w3.org/TR/CSS21/cascade.html#specificity" rel="external" target="_blank">优先级(specificity)</a>.每一条 css 规则都有特定的重要等级，这个等级可以简单地根据一条规则中的不同元素来计算。以元素名称为基准值 “1″，类、伪类和属性选择符重要性（权重）为 “10″，然后元素 id 为 “100″。比如下面的例子。</p>
<pre class="code"><span style="color: #a31515">ul ul </span>{ <span style="color: red">display</span>:<span style="color: blue">none</span>; }
<span style="color: #a31515">li:hover ul </span>{ <span style="color: red">display</span>:<span style="color: blue">block</span>; }</pre>
<p>这样做能够生效的原因，就是选择符的优先级不同。第一条规则只包含两个元素名称，这样它的权重值（优先级）就是2。第二条规则也包含两个元素名称，但是 :hover 伪类的权重值（优先级）是10，所以加起来的值就是12。由于第二条规则比第一条规则优先，因此被鼠标滑过的 li 元素内部的 ul 将被显示。</p>
<p>那么这个对于解决 &gt; 子选择符的问题有什么帮助呢？是这样，如果一条权重值（优先级）为12的规则定义所有的子菜单都要显示，我们只需要创建一条权重值（优先级）大于12的规则来把下一级的菜单隐藏起来。然后，那个菜单又需要另一条优先级更高的规则来显示，一直循环下去。对于3级的导航来说，需要的 css 代码短得让人意外：</p>
<pre class="code"><span style="color: green">/* 2 和 13 */
</span><span style="color: #a31515">ul ul</span>, <span style="color: #a31515">li:hover ul ul </span>{ <span style="color: red">display</span>:<span style="color: blue">none</span>; }
<span style="color: green">/* 12 和 23*/
</span><span style="color: #a31515">li:hover ul</span>, <span style="color: #a31515">li:hover li:hover ul </span>{ <span style="color: red">display</span>:<span style="color: blue">block</span>; }</pre>
<p>这种方式可以无需附加任何类样式实现无限级嵌套菜单（4级或更多级需要需要继续添加更多规则）。</p>
<h3><a name="optimizing"></a>脚本事件的性能优化</h3>
<p>现在还剩下一件事需要考虑。.htc 文件在所有样式表文件中搜索 :hover 规则，并且按照 css 文件的定义对所有它认为需要用脚本处理停留效果的元素附加鼠标滑过和移出事件。为了找出这些(被影响的)元素，<strong>所有</strong>去掉 :hover 伪类选择到的元素以及被 :hover 伪类修饰的元素本身，都会被选择并且进行处理。一条类似这样的规则</p>
<pre class="code"><span style="color: #a31515">#menu li:hover ul </span>{ ... }</pre>
<p>…将会被调整成下面这样来查找所有可能需要响应鼠标滑过事件的元素：</p>
<pre class="code"><span style="color: #a31515">#menu li  </span>{ ... }</pre>
<p>很显然这会选中整个菜单中的每一个 &lt;li&gt; 元素，并对其中一大堆不需要鼠标事件（在当前情况下）的元素附加事件。这个问题可以很轻松地得到解决，我们可以对包含子菜单的列表元素添加一个类样式，比如 &quot;folder&quot;。这样一来，调整（去除:hover）之后的样式规则变成了</p>
<pre class="code"><span style="color: #a31515">#menu li.folder </span>{ ... }</pre>
<p>…可以高效地直接选中那些真正需要事件的元素。缺点是为了改善脚本的性能，你需要添加一个类样式（这个类样式的添加纯粹是为了视觉效果，而且放弃了 li:hover 方式实现菜单的通用性）。但是，从另一个角度考虑的话，也许你反正也要用一个类来把这些列表元素与普通元素区别开来，那就无所谓了。</p>
<p>为了直观地说明上述问题，请查看<a title="the combined example" href="http://www.xs4all.nl/examples/cssmenu.html" rel="external" target="_blank">综合示例</a>。希望你喜欢。</p>
<h3>文件下载及更新说明：</h3>
<p><a name="changes"></a><strong>文件下载:</strong></p>
<p><strong>v3.00.081222 </strong>(:hover, :active 和 :focus)</p>
<p><a href="http://www.xs4all.nl/htc/csshover3.htc" rel="enclosure" target="_blank">下载 (已压缩, 2.5K)</a> | <a href="http://www.xs4all.nl/htc/csshover3-source.htc">下载 (源码, 9K) </a>| <a href="view-source:http://www.xs4all.nl/~peterned/htc/csshover3-source.htc" rel="external" target="_blank">查看</a></p>
<p><strong>v1.42.060206</strong> (:hover 和 :active) <a href="http://www.xs4all.nl/htc/csshover.htc" rel="enclosure" target="_blank">下载</a> | <a href="view-source:http://www.xs4all.nl/~peterned/htc/csshover.htc" rel="external">查看</a></p>
<p><strong>v2.02.060206</strong> (:hover, :active 和 :focus) <a href="http://www.xs4all.nl/htc/csshover2.htc" rel="enclosure" target="_blank">下载</a> | <a href="view-source:http://www.xs4all.nl/~peterned/htc/csshover2.htc" rel="external">查看</a></p>
<p><strong>说明:</strong></p>
<p><em>说明1：如果在使用 whatever:hover 的过程中遇到问题，请 <a href="http://www.xs4all.nl/contact.html" rel="nofollow" target="_blank">让我知道</a>! <img alt=":)" src="http://wukangrui.net/wp-includes/images/smilies/icon_smile.gif" /> 由于第3版比较新，可能会存在一些无法预知的问题。</em></p>
<p><em>说明2：确保你的web服务器把 htc 文件按照 text/x-component 的 mime类型发送。关于这方面的更多信息，可以参阅 Aldo的个人博客。如果你的主机支持 .htaccess 文件，可以添加下面这行代码： </em></p>
<pre class="code"><span style="color: #a31515">AddType text</span>/<span style="color: #a31515">x-component .htc</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><em>说明3：第三版支持在 IE6 以上版本中使用 :hover 和 :active，对 IE7 和 IE8 还支持 :focus。由于表达式（expression)在 IE8 标准模式下不支持，所以 whatever:hover 只在 IE8 的 怪异模式(Quirks Mode) 下运行。实际上在 IE8 标准模式中也根本不需要这个脚本了。 </em></p>
<p><em>说明4：如果使用这个脚本之后网页变慢，请尝试对更加具体的选择符运用 :hover 伪类，比如添加元素名称、使用元素id，或者类名称。例如：&quot;div#someId li.group:hover”, 而不要只用 &quot;.group:hover”。这样能够很大程度上减少搜索和解析时间，并能减少需要应用的事件。请阅读 <a href="#optimizing" rel="tag">性能优化</a> 获得更多信息。</em></p>
<p><em>说明5：第2版也支持 :focus 伪类，仅限于 A、INPUT、和 TEXTAREA元素。但是，由于类似 &quot;input:focus&quot; 这样的选择符被 IE 的样式表对象返回为 &quot;input:unknown&quot;，脚本将基于这些 &quot;unkonwn&quot; 规则来附加获得焦点和失去焦点事件，这个问题同样存在于其它浏览器无法识别的伪类。因此，使用2.0版本的时候，你无法在 IE 中对 A、INPUT和 TEXTAREA 元素应用浏览器无法识别的伪类，因为他们统统都会被处理成获得焦点样式。如果你确实需要这个功能，请使用1.4版或者3.0版。</em></p>
<p>在 <a href="http://www.naarvoren.nl">Naar Voren</a> （一个关于web开发的德语网站）上，有我用德语写的一篇关于用纯css <a href="http://www.naarvoren.nl/artikel/hover.html" rel="external" target="_blank">在菜单系统中使用 :hover</a> 的更详细的文章（德语版）。对于不懂德语的网友，可以查看该文章的<a href="http://www.xs4all.nl/hovercraft.html" rel="external" target="_blank">英文翻译版</a>。</p>
<p>非常感谢 Arnoud Berendsen 和 <a href="http://www.windgazer.nl/">Martin Reurings</a> 提供的创意和支持，感谢 <a href="http://www.eend.nl/log/">Robert Jan Verkade</a> 和 Naar Voren 上的朋友们发表我的文章，还要感谢 <a href="http://www.meyerweb.com/">Eric Meyer</a> 对这个脚本给予支持和在他的书里提到我的这个网页（指 《<a href="http://www.china-pub.com/38007" rel="reference" target="_blank">Eric Meyer谈CSS（卷2）</a>》 第六章》——译者注）。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>作者：<a href="http://www.xs4all.nl/~peterned/" rel="license" target="_blank">peter ned</a> 原文：<a title="whatever:hover" href="http://www.xs4all.nl/~peterned/csshover.html" rel="external" target="_blank">whatever:hover</a></p>
<p>译者：<a title="小李刀刀博客" href="http://wukangrui.net/" rel="license" target="_blank">小李刀刀</a> 首发：<a href="http://wukangrui.net/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" rel="license" target="_blank">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></p>
<p>转载请注明出处。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2010-10-20 -- <a href="http://ofcss.com/2010/10/20/clearfix-reloaded-overflowhidden-demystified-translation.html" title="clearfix改良及overflow:hidden详解【译】">clearfix改良及overflow:hidden详解【译】</a></li><li>2009-12-21 -- <a href="http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2011-03-12 -- <a href="http://ofcss.com/2011/03/12/flexible-two-column-layout-reloaded.html" title="自适应的多列图文混排改进">自适应的多列图文混排改进</a></li><li>2011-03-10 -- <a href="http://ofcss.com/2011/03/10/css-border-tricks-with-collapsed-boxes-translation.html" title="CSS边框实现&ldquo;无图化&rdquo;设计【译】">CSS边框实现&ldquo;无图化&rdquo;设计【译】</a></li><li>2010-10-31 -- <a href="http://ofcss.com/2010/10/31/prevent-a-float-drop-in-ie6-translation.html" title="CSS技巧:如何避免IE6中的&quot;浮动下坠&quot;【译】">CSS技巧:如何避免IE6中的&quot;浮动下坠&quot;【译】</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>简单、通用的JQuery Tab实现</title>
		<link>http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html</link>
		<comments>http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html#comments</comments>
		<pubDate>Mon, 13 Apr 2009 03:35:34 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[网页]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/04/13/portable-interchangeable-jquery-based-tabs.html</guid>
		<description><![CDATA[网页上的空间是寸土寸金，虽然显示器的分辨率越来越大，可是直到今天，网页设计中仍然是以至少1024&#215;768 像素的支持为主，也就是说，每一屏页面只有区区 955&#215;600像素 的安全尺寸可以用而已。于是，为了在有限的空间里容纳更多的内容，滑动门式的标签切换（Tabs）方式越来越受欢迎。通过滑动门技术，可以在同一块页面区域内放置数倍的内容。根据用户的选择来决定显示哪一部分。最近我在实际应用中，逐步完善出一种基于 jQuery，但是比 jQuery UI Tabs 插件更小巧也更通用的简单 Tabs 实现。 最早的滑动门的技术，一般都是结合 onclick 或者 onmouseover 事件传递一个参数给 JS 函数，根据传递的参数来决定显示哪一个标签。比如： function showTabs(n) { var tabsNumber = 3; for (i = 0; i &#60; tabsNumber; i++) { if (i == n) { document.getElementById("tabPanel-" + i).style.display = "block"; } else { document.getElementById("tabPanel-" + i).style.display = "none"; } } } [...]]]></description>
			<content:encoded><![CDATA[<p>网页上的空间是寸土寸金，虽然显示器的分辨率越来越大，可是直到今天，网页设计中仍然是以至少1024&#215;768 像素的支持为主，也就是说，每一屏页面只有区区 955&#215;600像素 的安全尺寸可以用而已。于是，为了在有限的空间里容纳更多的内容，滑动门式的标签切换（Tabs）方式越来越受欢迎。通过滑动门技术，可以在同一块页面区域内放置数倍的内容。根据用户的选择来决定显示哪一部分。最近我在实际应用中，逐步完善出一种基于 <a title="jQuery" rel="nofollow" href="http://jquery.com/" target="_blank">jQuery</a>，但是比 <a title="jQuery" rel="nofollow" href="http://jquery.com/" target="_blank">jQuery</a> UI Tabs 插件更小巧也更通用的简单 Tabs 实现。</p>
<p><span id="more-487"></span>最早的滑动门的技术，一般都是结合 onclick 或者 onmouseover 事件传递一个参数给 JS 函数，根据传递的参数来决定显示哪一个标签。比如：</p>
<pre class="code" style="width: 99.39%; height: 213px;"><span style="color: blue">function </span>showTabs(n) {
  <span style="color: blue">var </span>tabsNumber = 3;
  <span style="color: blue">for </span>(i = 0; i &lt; tabsNumber; i++) {
      <span style="color: blue">if </span>(i == n) {
          document.getElementById(<span style="color: #a31515">"tabPanel-" </span>+ i).style.display = <span style="color: #a31515">"block"</span>;
      } <span style="color: blue">else </span>{
          document.getElementById(<span style="color: #a31515">"tabPanel-" </span>+ i).style.display = <span style="color: #a31515">"none"</span>;
      }
  }
}</pre>
<p>加入有这样的一个函数，就可以在tab的标题按钮中设置 onclick = “showTabs(1)”来设置第二块内容显示，而其它块隐藏。</p>
<p>这种方式最大的缺点是：</p>
<ol>
<li>HTML代码和JS代码混合；</li>
<li>可扩展性差；</li>
</ol>
<p>尽管可以通过window.onload绑定事件等方式来是实现JS代码从HTML中分离，也可以把函数改得更复杂以实现通用性。但是总的来说，还是很难做到一处定义到处引用。</p>
<p>后来随着各种JS类库的出现，更强大的Tabs出现了，最出名的就是jQuery UI中的tabs插件。一旦加载了jQuery框架和jQuery UI插件，那么要在页面中实现Tabs，就变得简单了许多。首先我们的页面中的Tabs代码这样写：</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">="tabs"&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">="#panel-1"&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">="#panel-2"&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;
    &lt;</span><span style="color: #a31515">div </span><span style="color: red">id</span><span style="color: blue">="panel-1"&gt;</span>区域一<span style="color: blue">&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">id</span><span style="color: blue">="panel-2"&gt;</span>区域二<span style="color: blue">&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>注意：这里的代码非常干净，不含任何的JS代码或者与文档结构无关的定义。然后，在head区域，或者在页面任何地方增加一段js代码：</p>
<pre class="code">$(<span style="color: blue">function</span>() {
    $(<span style="color: #a31515">".tabs"</span>).tabs();
});</pre>
<p>就实现了Tabs功能，这行JS代码执行后，上面的HTML代码就会变成：</p>
<pre class="code" style="width: 99.64%; height: 295px;"><span style="color: blue">&lt;</span><span style="color: #a31515">div </span><span style="color: red">class</span><span style="color: blue">="tabs"&gt;
    &lt;</span><span style="color: #a31515">ul </span><span style="color: red">class</span><span style="color: blue">="ui-tabs-nav" </span><span style="color: red">jquery1239647486215</span><span style="color: blue">="2"&gt;
        &lt;</span><span style="color: #a31515">li </span><span style="color: red">class</span><span style="color: blue">="ui-tabs-selected"&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">="#panel-1" </span><span style="color: red">jquery1239647486215</span><span style="color: blue">="8"&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">="#panel-2" </span><span style="color: red">jquery1239647486215</span><span style="color: blue">="9"&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;
        </span>&gt;<span style="color: blue">&lt;/</span><span style="color: #a31515">ul</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">div </span><span style="color: red">id</span><span style="color: blue">="panel-1" </span><span style="color: red">class</span><span style="color: blue">="ui-tabs-panel" </span><span style="color: red">jquery1239647486215</span><span style="color: blue">="4"&gt;
        </span>区域一
    <span style="color: blue">&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">id</span><span style="color: blue">="panel-2" </span><span style="color: red">class</span><span style="color: blue">="ui-tabs-panel ui-tabs-hide" </span><span style="color: red">jquery1239647486215</span><span style="color: blue">="5"&gt;
        </span>区域二
    <span style="color: blue">&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>结合我们自己编写的css，或者jQuery UI 自带的CSS，就可以实现滑动门效果。并且，由于jQuery的强大，我们可以在页面中放置多组滑动门，然后一次性设定。</p>
<p>要说明的是，这个地方由于只启用了jQuery UI 中的 Tabs 插件，因此生成的代码还是比较干净的，只增加了 ui-tabs-xxxx 这几个相关的css类。如果你同时包含了jQuery UI的其它插件，那么即使不启用，也会添加一堆的css定义。而且，<a title="jQuery" rel="nofollow" href="http://jquery.com/" target="_blank">jQuery</a> UI Tabs 还提供了非常强大的控制功能，你可以动态地添加 tab，可以随意更改激活事件，可以定义切换效果，还可以设置默认激活状态和禁用等。</p>
<p>但是我在实际应用中遇到了一些问题，除了 <a title="jQuery" rel="nofollow" href="http://jquery.com/" target="_blank">jQuery</a> UI 自带的js脚本很大，css不符合实际应用需求外，还有一个最大的问题，你可能已经注意到了，在作为导航的标签定义中，每个标签对应哪一个区域是用链接目标来定义的。比如 &lt;a href=”#panel-1&#8243;&gt;标签一&lt;/a&gt;和&lt;div id=”panel-1&#8243;&gt;区域一&lt;/div&gt;对应，如果你的标签和区域没有对应起来，绑定tabs()就不起作用了。</p>
<p>而且，这种方式来带来另一个麻烦，就是当我们需要给标签加上链接的时候，没办法加。即使你将标签的激活事件设置为onmouseover而不是onclick，链接也不能实现，因为链接用于指定目标了。这种需求在我们的实际应用中并不是不存在的。比如：</p>
<p><img style="display: inline; border: 0px;" title="image" src="/attachments/2009/04/image-thumb10.png" border="0" alt="image" /><img style="display: inline; border: 0px;" title="image" src="/attachments/2009/04/image-thumb11.png" border="0" alt="image" /></p>
<p>这两个图片中的tabs标签，都要添加到对应的新闻类别或者论坛板块的链接。这时候 <a title="jQuery" rel="nofollow" href="http://jquery.com/" target="_blank">jQuery</a> UI的默认绑定就带来了麻烦。</p>
<p>其实分析一下，我们在实现滑动门的时候，用以下HTML结构就可以满足需要：</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">="tabs"&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;</span>标签一<span style="color: blue">&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;</span>标签二<span style="color: blue">&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">div</span><span style="color: blue">&gt;</span>区域一<span style="color: blue">&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>区域二<span style="color: blue">&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>借助 <a title="jQuery" rel="nofollow" href="http://jquery.com/" target="_blank">jQuery</a> 库，我们可以通过 $(“.tabs”)找到要实现的标签，然后 .find(“li”) 来找到要添加事件的元素，绑定事件的时候，我们可以通过该元素在$(“.tabs li”)集合中的索引值来明确是哪一个标签被激活，然后对应索引值的panel显示。代码类似这样：</p>
<pre class="code" style="width: 96.14%; height: 360px;"><span style="color: blue">&lt;</span><span style="color: #a31515">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;
    </span>$(<span style="color: blue">function</span>() {
        $(<span style="color: #a31515">".tabs"</span>).find(<span style="color: #a31515">"li"</span>).onmouseover(<span style="color: blue">function</span>(e) {
            <span style="color: blue">if </span>(e.target == <span style="color: blue">this</span>) {
                <span style="color: blue">var </span>tabs = $(<span style="color: blue">this</span>).parent().children(<span style="color: #a31515">"li"</span>);
                <span style="color: blue">var </span>panels = $(<span style="color: blue">this</span>).parent().parent().children(<span style="color: #a31515">"div"</span>);
                <span style="color: blue">var </span>index = $.inArray(<span style="color: blue">this</span>, tabs);
                <span style="color: blue">if </span>(panels.eq(index)[0]) {
                    tabs.removeClass(<span style="color: #a31515">"ui-tabs-selected"</span>)
                        .eq(index).addClass(<span style="color: #a31515">"ui-tabs-selected"</span>);
                    panels.addClass(<span style="color: #a31515">"ui-tabs-hide"</span>)
                        .eq(index).removeClass(<span style="color: #a31515">"ui-tabs-hide"</span>);
                }
            }
        });
    });
<span style="color: blue">&lt;/</span><span style="color: #a31515">script</span><span style="color: blue">&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>这段代码只使用了两个css类来处理，并且，自动判断tabs和panels的对应状态，假如你有4个tab，但是只有前三个启用了，那么你只需要写三个panel就可以，第四个panel不存在，则第四个tab自动不生效。</p>
<p>在实际使用中，会遇到一个问题，一般我们会给tab中的文字加链接，那么当鼠标滑过这个tab的时候，如果指到了文字，那么激发事件的对象有可能是a元素而不是li元素，则事件就不能正确激发。所以我们改进代码如下：</p>
<pre class="code" style="width: 99.41%; height: 362px;"><span style="color: blue">&lt;</span><span style="color: #a31515">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;
    </span>$(<span style="color: blue">function</span>() {
        $(<span style="color: #a31515">".ui-tabs-nav &gt; li &gt; a"</span>)onmouseover(<span style="color: blue">function</span>(e) {
            <span style="color: blue">if </span>(e.target == <span style="color: blue">this</span>) {
                <span style="color: blue">var </span>tabs = $(<span style="color: blue">this</span>).parent().parent().children(<span style="color: #a31515">"li"</span>);
                <span style="color: blue">var </span>panels = $(<span style="color: blue">this</span>).parent().parent().parent().children(<span style="color: #a31515">".ui-tabs-panel"</span>);
                <span style="color: blue">var </span>index = $.inArray(<span style="color: blue">this</span>, tabs);
                <span style="color: blue">if </span>(panels.eq(index)[0]) {
                    tabs.removeClass(<span style="color: #a31515">"ui-tabs-selected"</span>)
                        .eq(index).addClass(<span style="color: #a31515">"ui-tabs-selected"</span>);
                    panels.addClass(<span style="color: #a31515">"ui-tabs-hide"</span>)
                        .eq(index).removeClass(<span style="color: #a31515">"ui-tabs-hide"</span>);
                }
            }
        });
    });
<span style="color: blue">&lt;/</span><span style="color: #a31515">script</span><span style="color: blue">&gt;</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>与此对应的HTML结构是：</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">div</span><span style="color: blue">&gt;
    &lt;</span><span style="color: #a31515">ul </span><span style="color: red">class</span><span style="color: blue">="ui-tabs-nav"&gt;
        &lt;</span><span style="color: #a31515">li </span><span style="color: red">class</span><span style="color: blue">="ui-tabs-selected"&gt;&lt;</span><span style="color: #a31515">a </span><span style="color: red">href</span><span style="color: blue">="/bbs"&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">="/blog"&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;
    &lt;</span><span style="color: #a31515">div </span><span style="color: red">class</span><span style="color: blue">="ui-tabs-panel"&gt;
      </span><span style="color: green">&lt;!--这里调用最新论坛文章--&gt;
    </span><span style="color: blue">&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">="ui-tabs-panel ui-tabs-hide"&gt;
      </span><span style="color: green">&lt;!--这里调用最新博客文章--&gt;
    </span><span style="color: blue">&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>同时，我们有以下的css类定义：</p>
<pre class="code"><span style="color: #a31515">.ui-tabs-nav
</span>{
    <span style="color: green">/*导航容器定义*/
</span>}
<span style="color: #a31515">.ui-tabs-nav li
</span>{
    <span style="color: green">/*默认标签样式*/
</span>}
<span style="color: #a31515">.ui-tabs-nav li.ui-tabs-selected
</span>{
    <span style="color: green">/*激活的标签样式*/
</span>}
<span style="color: #a31515">.ui-tabs-panel
</span>{
    <span style="color: green">/*默认的显示区域样式*/
</span>}
<span style="color: #a31515">.ui-tabs-hide
</span>{
    <span style="color: red">display</span>: <span style="color: blue">none</span>;
}</pre>
<p><a href="http://11011.net/software/vspaste"></a>这样，就可以根据你的需要，结合自己的css，定制不同样式的滑动门了。把相应的js代码放到页面中，那么在页面里任何地方只要你按照HTML结构编写了一段html，这段html就会自动变成滑动门。而不用在每个页面里单独指定特定的selector来应用滑动门的tabs()方法。并且，根据需要给你的滑动门标签添加需要的链接，或者不要链接（href=”#” 或者 href=”javascript:void(0)”）。</p>
<p>这段滑动门代码只要具有jQuery core 就可以正常运行，不需要加载jQuery UI。非常简单，而且很通用，样式上喜欢怎么扩展都可以。</p>
<p>具体效果可以参见 <a title="台海网首页" rel="external" href="http:/www.taihainet.com" target="_blank">http:/www.taihainet.com</a> ， 在 <a title="台海网" rel="external" href="http://www.taihainet.com/" target="_blank">台海网</a> 首页中，我一共应用了四个样式共九组滑动门，代码就只是上面给出的那一段。四个样式列举如下：</p>
<p><img style="display: inline; border: 0px;" title="image" src="/attachments/2009/04/image-thumb12.png" border="0" alt="image" /> <br />
<em>滑动门一：多个搜索表单，暂时只实现两个，后面三个由于没有对应的ui-tabs-panel，自动禁用，但是链接可以点击。</em></p>
<p><img style="display: inline; border: 0px;" title="image" src="/attachments/2009/04/image-thumb13.png" border="0" alt="image" /> <br />
<em>滑动门二：多块商务信息区域，其中第三个由于没有对应的ui-tabs-panel，自动禁用。</em></p>
<p><img style="display: inline; border: 0px;" title="image" src="/attachments/2009/04/image-thumb14.png" border="0" alt="image" /></p>
<p><em>滑动门三：新闻栏目切换，标签中的文字链接到对应的新闻栏目。</em></p>
<p><img style="display: inline; border: 0px;" title="image" src="/attachments/2009/04/image-thumb15.png" border="0" alt="image" /></p>
<p><em>滑动门四：论坛分板块帖子调用。标签中的文字链接到对应的论坛板块。</em></p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-21 -- <a href="http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-06-22 -- <a href="http://ofcss.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>2006-04-04 -- <a href="http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li><li>2006-03-28 -- <a href="http://ofcss.com/2006/03/28/simulate-window-in-center-with-css.html" title="CSS:模拟Windows窗口及DIV居中">CSS:模拟Windows窗口及DIV居中</a></li><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2011-03-12 -- <a href="http://ofcss.com/2011/03/12/flexible-two-column-layout-reloaded.html" title="自适应的多列图文混排改进">自适应的多列图文混排改进</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li><li>2010-10-20 -- <a href="http://ofcss.com/2010/10/20/clearfix-reloaded-overflowhidden-demystified-translation.html" title="clearfix改良及overflow:hidden详解【译】">clearfix改良及overflow:hidden详解【译】</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[翻译]ASP.NET MVC动手实验1-2：创建ASP.NET MVC应用</title>
		<link>http://ofcss.com/2009/04/09/aspnetmvc-hands-on-labs-create-application.html</link>
		<comments>http://ofcss.com/2009/04/09/aspnetmvc-hands-on-labs-create-application.html#comments</comments>
		<pubDate>Thu, 09 Apr 2009 15:08:09 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[动手实验]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/04/09/aspnetmvc-hands-on-labs-create-application.html</guid>
		<description><![CDATA[在这个练习中你将学习如何在 Visual Studio 中创建一个 ASP.NET MVC 应用。并初步了解默认项目结构和一些开发约定。 ASP.NET MVC 框架分为 Model， View 和 Controller 三个部分。模型组件（Model）一般用于维护数据库中的持久数据层的状态。视图组件（View）由控制器挑选并渲染到适当的用户界面。默认状态下， ASP.NET MVC 框架用ASP.NET已有的 ASP.NET 页面（.aspx）、 母版页（.master）以及用户控件（.ascx）等类型来作为浏览器呈现。控制器组件（Controller）组件将用户请求定位到适当的控制器（Controller）行为（Action）和方法（Method），从请求中获取用于行为方法运行的参数值， 并处理行为和方法执行中可能产生的错误。 然后控制器用该请求对应的视图进行渲染。 默认状况下，每个组件存放在 MVC WEB 应用工程的一个独立目录下。 任务1 &#8211; 创建一个 ASP.NET MVC Web 应用工程 在这个任务中你将通过Visual Studio的MVC模板创建和配置一个空的 ASP.NET MVC 应用工程。 打开 Microsoft Visual Studio 2008：依次点击 开始&#124;所有程序&#124;Microsoft Visual Studio 2008&#124;Microsoft Visual Studio 2008. 点击 文件 菜单， 指向 [...]]]></description>
			<content:encoded><![CDATA[<p>在这个练习中你将学习如何在 Visual Studio 中创建一个 ASP.NET MVC 应用。并初步了解默认项目结构和一些开发约定。</p>
<p>ASP.NET MVC 框架分为 Model， View 和 Controller 三个部分。模型组件（Model）一般用于维护数据库中的持久数据层的状态。视图组件（View）由控制器挑选并渲染到适当的用户界面。默认状态下， ASP.NET MVC 框架用ASP.NET已有的 ASP.NET 页面（.aspx）、 母版页（.master）以及用户控件（.ascx）等类型来作为浏览器呈现。控制器组件（Controller）组件将用户请求定位到适当的控制器（Controller）行为（Action）和方法（Method），从请求中获取用于行为方法运行的参数值， 并处理行为和方法执行中可能产生的错误。 然后控制器用该请求对应的视图进行渲染。 默认状况下，每个组件存放在 MVC WEB 应用工程的一个独立目录下。</p>
<p><span id="more-444"></span></p>
<p><strong>任务1 &#8211; 创建一个 ASP.NET MVC Web 应用工程</strong></p>
<p>在这个任务中你将通过Visual Studio的MVC模板创建和配置一个空的 ASP.NET MVC 应用工程。</p>
<ol>
<li>打开 Microsoft Visual Studio 2008：依次点击 <strong>开始</strong>|<strong>所有程序</strong>|<strong>Microsoft Visual Studio 2008</strong>|<strong>Microsoft Visual Studio 2008</strong>.</li>
<li>点击 <strong>文件</strong> 菜单， 指向 <strong>新建</strong>， 然后点击 <strong>项目</strong>。</li>
<li>在 <strong>新建项目</strong> 对话框中，确保右上角选中的版本为 <strong>.NET Framework 3.5</strong>，在 <strong>项目类型</strong> 下选择 <strong>Visual C#</strong>，然后在 <strong>Visual Studio 已安装的模板</strong> 中选择 <strong>ASP.NET MVC Web Application</strong> 类型。你可以设置项目位置为 <strong>你的路径AspNetMvcEx01-CreatingMvcAppbegin </strong>作为项目目录。</li>
<li>修改 <strong>名称</strong> 为 <strong>MvcSampleApp</strong> 然后点击 确定 。 <a href="http://file.wukangrui.com/attachments/2009/04/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="http://file.wukangrui.com/attachments/2009/04/image-thumb.png" border="0" alt="image" width="605" height="484" /> </a><em>图一：创建新项目对话框<br />
</em>在点击 确定 按钮之后，Visual Studio 会问你是否同时创建测试项目（would you like to create a test project）。选择 <strong>Yes</strong>， 输入 <strong>MvcSampleApp.Test</strong> 作为<strong>项目名称</strong>（<strong>Name</strong> of the Project）， 然后点击 <strong>确定</strong>（<strong>OK</strong>）。注：我安装的是Visual Studio 2008 SP1 简体中文版 + ASP.NET MVC 1.0，在我的系统上，创建测试项目的对话框为英文，因此这里加上英文对照。<br />
提示：当你创建一个新的MVC Web应用时， Visual Studio 会为你提供同时创建两个项目的选择，第一个项目是Web项目用来实现你的应用，第二个项目是一个测试项目，你可以在其中为你的MVC组件编写单元测试。<br />
<a href="http://file.wukangrui.com/attachments/2009/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" src="http://file.wukangrui.com/attachments/2009/04/image-thumb2.png" border="0" alt="image" width="552" height="367" /></a><br />
<em>图二：创建 MVC 单元测试项目<br />
</em>提示：测试项目对话框中的 测试框架（Test Framework） 下拉列表现在只有一个 Visual Studio Unit Test，这个列表是可扩展的，在你的机器上安装了其他测试框架的时候，它将会包含其他的测试框架供你选择。由此你可以容易地用你喜欢的单元测试框架来为你的 ASP.NET MVC 应用编写单元测试。</li>
<li>在Visual Studio 中配置站点使用端口 50000。这一步是为了和本动手实验中的后续联系保持一致所必须的。
<ol type="a">
<li>在 <strong>解决方案浏览器</strong> 中，右击 <strong>MvcSampleApp</strong> 项目，并在上下文菜单中选择 <strong>属性</strong> 。</li>
<li>在 <strong>属性</strong> 页中，打开 <strong>Web</strong> 标签。</li>
<li>In the <strong>Servers</strong> section select <strong>Specific Port</strong>. 在 <strong>服务器</strong> 设置项下面，选择 <strong>使用Visual Studio开发服务器</strong>，并选中 <strong>特定端口</strong> 。</li>
<li>设置端口号为 <strong>50000</strong> 。</li>
<li>按下 <strong>Ctr + S</strong> 保存所做的改动。</li>
</ol>
<p><a href="http://file.wukangrui.com/attachments/2009/04/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="http://file.wukangrui.com/attachments/2009/04/image-thumb3.png" border="0" alt="image" width="635" height="480" /></a><br />
<em>图三：配置本地测试属性</em></li>
</ol>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-04-13 -- <a href="http://ofcss.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://ofcss.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>2009-07-08 -- <a href="http://ofcss.com/2009/07/08/asp-net-mvc-best-practices-part-4.html" title="ASP.NET MVC 最佳实践（四）">ASP.NET MVC 最佳实践（四）</a></li><li>2009-07-07 -- <a href="http://ofcss.com/2009/07/07/asp-net-mvc-best-practices-part-3.html" title="ASP.NET MVC 最佳实践（三）">ASP.NET MVC 最佳实践（三）</a></li><li>2009-07-01 -- <a href="http://ofcss.com/2009/07/01/asp-net-mvc-best-practices-part-2.html" title="ASP.NET MVC 最佳实践（二）">ASP.NET MVC 最佳实践（二）</a></li><li>2009-06-28 -- <a href="http://ofcss.com/2009/06/28/asp-net-mvc-best-practices-part-1.html" title="ASP.NET MVC 最佳实践（一）">ASP.NET MVC 最佳实践（一）</a></li><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2009-06-22 -- <a href="http://ofcss.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-30 -- <a href="http://ofcss.com/2009/04/30/solution-for-js-intellisense-error.html" title="VS2008 中 JS IntelliSense出错的解决">VS2008 中 JS IntelliSense出错的解决</a></li><li>2011-03-10 -- <a href="http://ofcss.com/2011/03/10/css-border-tricks-with-collapsed-boxes-translation.html" title="CSS边框实现&ldquo;无图化&rdquo;设计【译】">CSS边框实现&ldquo;无图化&rdquo;设计【译】</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2009/04/09/aspnetmvc-hands-on-labs-create-application.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Google AjaxLib API托管的js库</title>
		<link>http://ofcss.com/2009/04/05/use-google-ajaxlib-api.html</link>
		<comments>http://ofcss.com/2009/04/05/use-google-ajaxlib-api.html#comments</comments>
		<pubDate>Sun, 05 Apr 2009 23:53:42 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://wukangrui.net/2009/04/05/use-google-ajaxlib-api.html</guid>
		<description><![CDATA[本文简要介绍Google AjaxLib API，并以jQuery为例说明如何在自己的网页中引入由Google提供个CDN托管的jQuery库。]]></description>
			<content:encoded><![CDATA[<blockquote><p>本文简要介绍Google AjaxLib API，并以jQuery为例说明如何在自己的网页中引入由Google提供个CDN托管的jQuery库。</p></blockquote>
<p align="center">－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>现在很多人都已经开始习惯于基于各种各样的JS库来编写自己的Javascript，其中尤其以jQuery最多。别的不说，有了jQuery，至少让我们控制页面元素更加方便快捷，让我们在编写js的时候不需要过多地考虑浏览器特性问题了。</p>
<p><span id="more-435"></span></p>
<p>但是jQuery功能越强大，它本身的文件也越大。虽然如今的互联网带宽是越来越宽，速度是越来越快。但是做网页的却一个个越来越在意自己的页面大小、图片大小、css大小、js大小。其实相对于服务器的运行效率、机房带宽和线路品质，通过优化js、css和图片文件能挤出来的几百k尺寸的下载量，在下载速度的提高上实在是太有限了。不过话说回来，做开发的做设计的，就是要有这样的精神，才不会让自己的作品像微软的操作系统一样，越来越庞大。从15张软盘到半张CD，到一张CD，直到两张CD，最后一张DVD……</p>
<p>在我们的js中，最大的一般还是js库，毕竟具体的功能实现只需要写一点点代码而已。但是js库里那么多用到的没用到的东西，还是有点份量的。我们又想用，又嫌它大。怎么办呢？拆成很多个吧，多一个js还多一个并发连接呢…… 幸好，google挺够意思，号称“永久提供”常见js库，google的服务器和线路品质那自然是不在话下的。即提高了下载速度又减少了自己服务器的并发连接数。不用就是傻子了。</p>
<p>用起来也很简单，直接在网页里引用google服务器上的相关js文件就可以了。不过，如果引用多个js，就要插入多段的script。现在像我这样代码能少一个字算一个字的人不少。google也提供了相应的办法，那就是google load。我们只需要在页面里引用一个js文件，就可以根据需要实时加载用到的js库了。 首先在页头部分加入以下这行代码：</p>
<pre class="code" style="width: 96.07%; height: 21px;"><span style="color: blue">&lt;</span><span style="color: #a31515">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript" </span><span style="color: red">src</span><span style="color: blue">="http://www.google.com/jsapi"&gt;&lt;/</span><span style="color: #a31515">script</span><span style="color: blue">&gt;</span></pre>
<p> </p>
<p>这就足够了，google提供了以下这些js框架/库的API：</p>
<ul>
<li><a href="http://wukangrui.net/documentation/index.html#jquery">jQuery</a></li>
<li><a href="http://wukangrui.net/documentation/index.html#jqueryUI">jQuery UI</a></li>
<li><a href="http://wukangrui.net/documentation/index.html#prototype">Prototype</a></li>
<li><a href="http://wukangrui.net/documentation/index.html#script_aculo_us">script.aculo.us</a></li>
<li><a href="http://wukangrui.net/documentation/index.html#mootools">MooTools</a></li>
<li><a href="http://wukangrui.net/documentation/index.html#dojo">Dojo</a></li>
</ul>
<p> </p>
<p>而且google的API中包括这些js框架/库的所有正式发布版。你可以根据自己的需要来选择。以jQuery为例，我们可以这样使用：</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;
    </span><span style="color: green">//&lt;![CDATA[
    //加载jQuery 1.3.2
    </span>google.load(<span style="color: #a31515">"jquery"</span>, <span style="color: #a31515">"1.3.2"</span>);
    <span style="color: green">//]]&gt;
</span><span style="color: blue">&lt;/</span><span style="color: #a31515">script</span><span style="color: blue">&gt;</span></pre>
<p>这样我们就从google的最近的CDN镜像上加载了jQuery 1.3.2版的js库，接下来就可以正常写js代码了。不过，即使是google的CDN镜像，下载也毕竟是需要时间的，万一代码库还没有下载完而浏览器已经解释到了下面的代码了怎么办？我们可以设定在js库加载完以后才开始执行js：</p>
<pre class="code"><span style="color: blue">&lt;</span><span style="color: #a31515">script </span><span style="color: red">type</span><span style="color: blue">="text/javascript"&gt;
    </span><span style="color: green">//&lt;![CDATA[
    //加载jQuery 1.3.2
    </span>google.load(<span style="color: #a31515">"jquery"</span>, <span style="color: #a31515">"1.3.2"</span>);
    <span style="color: green">//加载完成后执行代码
     </span>google.setOnLoadCallback(<span style="color: blue">function</span>() {
        $(<span style="color: #a31515">"body"</span>).html(<span style="color: #a31515">"Hello World!"</span>);
    });
    <span style="color: green">//]]&gt;
</span><span style="color: blue">&lt;/</span><span style="color: #a31515">script</span><span style="color: blue">&gt;</span></pre>
<p>更多有关google jsapi的相关介绍和文档，可以参考： <a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/">google AJAX 库 API</a> 。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2010-06-09 -- <a href="http://ofcss.com/2010/06/09/my-rencent-booklist.html" title="最近的书单">最近的书单</a></li><li>2009-12-21 -- <a href="http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-06-22 -- <a href="http://ofcss.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-05-23 -- <a href="http://ofcss.com/2009/05/23/google-chrome-in-windows7-x64.html" title="windows 7 x64 上的Google Chrome">windows 7 x64 上的Google Chrome</a></li><li>2009-04-09 -- <a href="http://ofcss.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>2006-04-16 -- <a href="http://ofcss.com/2006/04/16/special-use-of-css.html" title="CSS居然可以这样用">CSS居然可以这样用</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2009/04/05/use-google-ajaxlib-api.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>动态实现指定图片半透明及鼠标事件</title>
		<link>http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html</link>
		<comments>http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html#comments</comments>
		<pubDate>Tue, 04 Apr 2006 03:35:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[网页]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=205</guid>
		<description><![CDATA[说明：在不改变HTML代码的前提下，通过CSS和JavaScript，对指定的图片实现半透明效果。并为该图片添加鼠标滑过和滑出特效。 具体实现： 1.假设我们要操作的图片放置在一个id=&#34;imgbox&#34;的div容器中。如下面的代码： &#60;div id=&#34;imgbox&#34; style=&#34;width:700px;margin:auto;&#34;&#62;&#60;img src=&#34;/images/logof.gif&#34;&#62;&#60;/div&#62; 2.首先，在css中增加两个类定义，为了避免影响到其它图片，最好是用选择限定符加以限定。如下代码： #imgbox img.low{-moz-opacity:0.5;filter:alpha(opacity=50);cursor:hand;}#imgbox img.high{-moz-opacity:1;filter:alpha(opacity=100);cursor:hand;} 3.然后在网页的&#60;head&#62;区域增加JavaScript，JavaScript将在页面载入完成之后，为我们指定的图片添加半透明效果和鼠标事件： &#60;script language=&#34;JavaScript&#34; type=&#34;text/javascript&#34;&#62;window.onload = function() {&#160;var imgNode = document.getElementById(&#34;imgbox&#34;).getElementsByTagName(&#34;img&#34;)[0];&#160;imgNode.setAttribute(&#34;class&#34;,&#34;low&#34;);&#160;imgNode.className = &#34;low&#34;;&#160;imgNode.onmouseover = function(){&#160;&#160;this.setAttribute(&#34;class&#34;,&#34;high&#34;);&#160;&#160;this.className = &#34;high&#34;;&#160;}&#160;imgNode.onmouseout = function(){&#160;&#160;this.setAttribute(&#34;class&#34;,&#34;low&#34;);&#160;&#160;this.className = &#34;low&#34;;&#160;}}&#60;/script&#62; 补充说明： 在上面的JavaScript中，设置图片的class属性的时候，同时使用了两种方式： imgNode.setAttribute(&#34;class&#34;,&#34;low&#34;);imgNode.className = &#34;low&#34;; 第一种方式是针对IE以外的浏览器，按理说设置class属性对所有的浏览器都是有效的。但是IE比较有个性，它通过元素的className来定义class属性。这是IE不符合规范的地方，但是我们不得不考虑到IE占据的广大市场。所以，同时使用两种方式，从而达到跨浏览器兼容的效果。 适合多图片调用的修改 当时做的时候是针对单张图片的情况做的。如果要用于调用的多图片，可以把JS代码做如下修改： &#60;script language=&#34;JavaScript&#34; type=&#34;text/javascript&#34;&#62;window.onload = function() {&#160;&#160;&#160; var imgNodes = document.getElementById(&#34;imgbox&#34;).getElementsByTagName(&#34;img&#34;);&#160;&#160;&#160; for (var i=0; i&#60;imgNodes.length; i++ ){&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<div style="FONT-SIZE: 12px">
<p>说明：在不改变HTML代码的前提下，通过CSS和JavaScript，对指定的图片实现半透明效果。并为该图片添加鼠标滑过和滑出特效。</p>
<p>具体实现：</p>
<p>1.假设我们要操作的图片放置在一个id=&quot;imgbox&quot;的div容器中。如下面的代码：</p>
<div class="HtmlCode">
<div class="Code">&lt;div id=&quot;imgbox&quot; style=&quot;width:700px;margin:auto;&quot;&gt;&lt;img src=&quot;/images/logof.gif&quot;&gt;&lt;/div&gt;</div>
</div>
<p>2.首先，在css中增加两个类定义，为了避免影响到其它图片，最好是用选择限定符加以限定。如下代码：</p>
<div class="HtmlCode">
<div class="Code">#imgbox img.low{-moz-opacity:0.5;filter:alpha(opacity=50);cursor:hand;}<br />#imgbox img.high{-moz-opacity:1;filter:alpha(opacity=100);cursor:hand;}</div>
</div>
<p>3.然后在网页的&lt;head&gt;区域增加JavaScript，JavaScript将在页面载入完成之后，为我们指定的图片添加半透明效果和鼠标事件：</p>
<div class="HtmlCode">
<div class="Code">&lt;script language=&quot;JavaScript&quot; type=&quot;text/javascript&quot;&gt;<br />window.onload = function() {<br />&nbsp;var imgNode = document.getElementById(&quot;imgbox&quot;).getElementsByTagName(&quot;img&quot;)[0];<br />&nbsp;imgNode.setAttribute(&quot;class&quot;,&quot;low&quot;);<br />&nbsp;imgNode.className = &quot;low&quot;;<br />&nbsp;imgNode.onmouseover = function(){<br />&nbsp;&nbsp;this.setAttribute(&quot;class&quot;,&quot;high&quot;);<br />&nbsp;&nbsp;this.className = &quot;high&quot;;<br />&nbsp;}<br />&nbsp;imgNode.onmouseout = function(){<br />&nbsp;&nbsp;this.setAttribute(&quot;class&quot;,&quot;low&quot;);<br />&nbsp;&nbsp;this.className = &quot;low&quot;;<br />&nbsp;}<br />}<br />&lt;/script&gt;</div>
</div>
<p>补充说明：</p>
<p>在上面的JavaScript中，设置图片的class属性的时候，同时使用了两种方式：</p>
<div class="HtmlCode">
<div class="Code">imgNode.setAttribute(&quot;class&quot;,&quot;low&quot;);<br />imgNode.className = &quot;low&quot;;</div>
</div>
<p>第一种方式是针对IE以外的浏览器，按理说设置class属性对所有的浏览器都是有效的。但是IE比较有个性，它通过元素的className来定义class属性。这是IE不符合规范的地方，但是我们不得不考虑到IE占据的广大市场。所以，同时使用两种方式，从而达到跨浏览器兼容的效果。</p>
<p><span class="bold"><strong>适合多图片调用的修改</strong></span></p>
<div style="FONT-SIZE: 12px">
<p>当时做的时候是针对单张图片的情况做的。如果要用于调用的多图片，可以把JS代码做如下修改：</p>
<div class="quote">
<div>
<div class="Code">&lt;script language=&quot;JavaScript&quot; type=&quot;text/javascript&quot;&gt;<br />window.onload = function() {<br />&nbsp;&nbsp;&nbsp; var imgNodes = document.getElementById(&quot;imgbox&quot;).getElementsByTagName(&quot;img&quot;);<br />&nbsp;&nbsp;&nbsp; for (var i=0; i&lt;imgNodes.length; i++ ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var imgNode = imgNodes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.setAttribute(&quot;class&quot;,&quot;low&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.className = &quot;low&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.onmouseover = function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setAttribute(&quot;class&quot;,&quot;high&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.className = &quot;high&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.onmouseout = function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setAttribute(&quot;class&quot;,&quot;low&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.className = &quot;low&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />&lt;/script&gt;</div>
<p>再做改进：改为当图片加载完毕就产生效果：</p>
<p>首先定义函数：</p>
<div class="HtmlCode">
<div class="Code">&lt;script language=&quot;JavaScript&quot; type=&quot;text/javascript&quot;&gt;<br />function transpic() {<br />&nbsp;&nbsp;&nbsp; var imgNodes = document.getElementById(&quot;imgbox&quot;).getElementsByTagName(&quot;img&quot;);<br />&nbsp;&nbsp;&nbsp; for (var i=0; i&lt;imgNodes.length; i++ ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var imgNode = imgNodes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.setAttribute(&quot;class&quot;,&quot;low&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.className = &quot;low&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.onmouseover = function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setAttribute(&quot;class&quot;,&quot;high&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.className = &quot;high&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgNode.onmouseout = function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setAttribute(&quot;class&quot;,&quot;low&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.className = &quot;low&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />&lt;/script&gt;</div>
</div>
<p>然后在图片调用代码的后面调用此函数（例如）：</p>
<div class="HtmlCode">
<div class="Code">
<p>&lt;div id=&quot;imgbox&quot; style=&quot;width:700px;margin:auto;&quot;&gt;&lt;img src=&quot;/images/logof.gif&quot;&gt;&lt;/div&gt;<br />&lt;script type=&quot;text/javascript&quot; language=&quot;JavaScript&quot;&gt;transpic();&lt;/script&gt;</p>
</div>
</div>
</div>
</div>
</div>
</div>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2009-12-21 -- <a href="http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-06-22 -- <a href="http://ofcss.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://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2011-03-14 -- <a href="http://ofcss.com/2011/03/14/browser-rendering-optimizer-translation-extra.html" title="对《优化浏览器渲染》的补充【译】">对《优化浏览器渲染》的补充【译】</a></li><li>2011-03-12 -- <a href="http://ofcss.com/2011/03/12/flexible-two-column-layout-reloaded.html" title="自适应的多列图文混排改进">自适应的多列图文混排改进</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li><li>2010-10-20 -- <a href="http://ofcss.com/2010/10/20/clearfix-reloaded-overflowhidden-demystified-translation.html" title="clearfix改良及overflow:hidden详解【译】">clearfix改良及overflow:hidden详解【译】</a></li><li>2010-06-09 -- <a href="http://ofcss.com/2010/06/09/my-rencent-booklist.html" title="最近的书单">最近的书单</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

