<?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>JS Mix</title>
	<atom:link href="http://www.jsmix.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jsmix.com</link>
	<description>不会做蛋炒饭的小提琴手不是好程序员</description>
	<lastBuildDate>Sat, 23 Jul 2011 08:22:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>使用 js 处理 html entities</title>
		<link>http://www.jsmix.com/javascript/htmlentities.html</link>
		<comments>http://www.jsmix.com/javascript/htmlentities.html#comments</comments>
		<pubDate>Sat, 09 Jul 2011 20:38:14 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2314</guid>
		<description><![CDATA[有的时候我们可能不得不使用 js 来处理 html entities，例如把 &#38;gt; 这样的内容转化成 &#62; 符号，或者是相反的操作。如果你不幸遇到了这样的需求，下面的内容也许会有所帮助。 unescapeHtmlEntities 的实现非常简单，创建一个节点元素，然后将字符串写入这个元素的 innerHTML 属性，最后返回这个元素的文本内容。调用下面的函数时传参'&#38;gt;'，得到的结果将会是'&#62;' function unescapeHtmlEntities(str) { var tempEle = document.createElement(&#34;div&#34;); tempEle.innerHTML = str; var result = tempEle.childNodes[0].nodeValue; return result; } escapeHtmlEntities 的过程刚好相反，创建元素，插入文本节点，读出元素的 innerHTML 时，得到字符的 entity。调用下面的函数时传参'&#62;'，得到的结果将会是'&#38;gt;' function escapeHtmlEntities(str) { var tempEle = document.createElement(&#34;div&#34;); tempText = document.createTextNode(str); tempEle.appendChild(tempText); var result = tempEle.innerHTML; return result; } alert(escapeHtmlEntities(&#039;&#62;&#039;)); // [...]]]></description>
			<content:encoded><![CDATA[<p>有的时候我们可能不得不使用 js 来处理 html entities，例如把 <strong>&amp;gt;</strong> 这样的内容转化成 <strong>&gt;</strong> 符号，或者是相反的操作。如果你不幸遇到了这样的需求，下面的内容也许会有所帮助。</p>
<p>unescapeHtmlEntities 的实现非常简单，创建一个节点元素，然后将字符串写入这个元素的 innerHTML 属性，最后返回这个元素的文本内容。调用下面的函数时传参<strong>'&amp;gt;'</strong>，得到的结果将会是<strong>'&gt;'</strong></p>
<pre class="sh_javascript sh_sourceCode">
function unescapeHtmlEntities(str) {
var tempEle = document.createElement(&quot;div&quot;);
tempEle.innerHTML = str;
var result = tempEle.childNodes[0].nodeValue;
return result;
}
</pre><span id="more-2314"></span>
<p>escapeHtmlEntities 的过程刚好相反，创建元素，插入文本节点，读出元素的 innerHTML 时，得到字符的 entity。调用下面的函数时传参<strong>'&gt;'</strong>，得到的结果将会是<strong>'&amp;gt;'</strong></p>
<pre class="sh_javascript sh_sourceCode">
function escapeHtmlEntities(str) {
var tempEle = document.createElement(&quot;div&quot;);
tempText = document.createTextNode(str);
tempEle.appendChild(tempText);
var result = tempEle.innerHTML;
return result;
}

alert(escapeHtmlEntities(&#039;&gt;&#039;));  // result : &gt;
</pre>
<p>如果使用 jQuery，这个两个函数可以一句话搞定：</p>
<pre class="sh_javascript sh_sourceCode">
function unescapeHtmlEntities(str) {
    return $(&#039;&lt;div /&gt;&#039;).html(str).text();
}
</pre>

<pre class="sh_javascript sh_sourceCode">
function escapeHtmlEntities(str){
    return $(&#039;&lt;div /&gt;&#039;).text(str).html();
}
</pre>
<p><strong>尽管如此，对于 html entities 的处理并不推荐在行为层中进行。</strong>事实上模板、后端语言更能更好地进行工作，例如 PHP 的 htmlentities :</p>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/javascript/htmlentities.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>一段巧妙判断IE浏览器版本的js代码</title>
		<link>http://www.jsmix.com/javascript/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html</link>
		<comments>http://www.jsmix.com/javascript/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html#comments</comments>
		<pubDate>Wed, 27 Apr 2011 13:40:37 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2297</guid>
		<description><![CDATA[转自：www.joy-studio.com 下面这段代码使用IE可以识别html注释的特性，可以准确的判断IE浏览器的版本号，没有使用诸多怪异的测力检测方法，超级简洁。 原作者的代码地址在这里，我做了一点小改动，文中有注释，可以到这里运行测试。 /** * ie equals one of false&#124;6&#124;7&#124;8&#124;9 values, ie5 is fucked down. * Based on the method: https://gist.github.com/527683 */ var ie = function () { var v = 4, //原作者的此处代码是3，考虑了IE5的情况，我改为4。 div = document.createElement(&#039;div&#039;), i = div.getElementsByTagName(&#039;i&#039;); do { div.innerHTML = &#039;&#60;!--[if gt IE &#039; + (++v) + &#039;]&#62;&#60;i&#62;&#60;/i&#62;&#60;![endif]--&#62;&#039;; } while (i[0]); return [...]]]></description>
			<content:encoded><![CDATA[<p>转自：<a href="http://www.joy-studio.com/frontend-develop/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html" class="link_external">www.joy-studio.com</a></p>
<p>下面这段代码使用IE可以识别html注释的特性，可以准确的判断IE浏览器的版本号，没有使用诸多怪异的测力检测方法，超级简洁。
原作者的代码地址在<a href="https://gist.github.com/527683" class="link_external">这里</a>，我做了一点小改动，文中有注释，可以到<a href="http://jsfiddle.net/Doomin/df8Hw/" class="link_external">这里</a>运行测试。</p>
<pre class="sh_javascript sh_sourceCode">
/**
 * ie equals one of false|6|7|8|9 values, ie5 is fucked down.
 * Based on the method: https://gist.github.com/527683
 */
var ie = function () {
    var v = 4, //原作者的此处代码是3，考虑了IE5的情况，我改为4。
        div = document.createElement(&#039;div&#039;),
        i = div.getElementsByTagName(&#039;i&#039;);
    do {
        div.innerHTML = &#039;&lt;!--[if gt IE &#039; + (++v) + &#039;]&gt;&lt;i&gt;&lt;/i&gt;&lt;![endif]--&gt;&#039;;
    } while (i[0]);
    return v &gt; 5 ? v : false; //如果不是IE，之前返回undefined，现改为返回false。
}();
</pre>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/javascript/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Layout Gala --- 40 个 CSS 布局</title>
		<link>http://www.jsmix.com/css/layout-gala-same-markup-css-layout.html</link>
		<comments>http://www.jsmix.com/css/layout-gala-same-markup-css-layout.html#comments</comments>
		<pubDate>Mon, 28 Mar 2011 10:09:10 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Layout]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2254</guid>
		<description><![CDATA[这套布局模板来自于html.it，总计 40 个，覆盖流体、固定宽度、两列、三列等等各种常见的布局形式。最让人称道的是，这 40 个模板采用了完全一致的 HTML 结构(based on the same markup)，并严格遵循了“重要内容优先加载”的原则(页面的content部分)，HTML 与 CSS 部分均能通过 W3C 验证，同时在 IE/win 5.0+, Opera 8.5+, Firefox 1.5+ 和 Safari 2+都有非常好的兼容性。它使用的 HTML 如下： &#60;div id=&#34;container&#34;&#62; &#60;div id=&#34;header&#34;&#62;Header&#60;/div&#62; &#60;div id=&#34;wrapper&#34;&#62; &#60;div id=&#34;content&#34;&#62;Content&#60;/div&#62; &#60;/div&#62; &#60;div id=&#34;navigation&#34;&#62;Navigation&#60;/div&#62; &#60;div id=&#34;extra&#34;&#62;Extra stuff&#60;/div&#62; &#60;div id=&#34;footer&#34;&#62;Footer&#60;/div&#62; &#60;/div&#62; 以三列流动布局为例，其 CSS 代码如下： div#header{position:relative} div#header h1{height:80px;line-height:80px;margin:0; padding-left:10px;background: #EEE;color: #79B30B} div#header a{position:absolute;right:0;top:23px} [...]]]></description>
			<content:encoded><![CDATA[<p>这套布局模板来自于<a href="http://blog.html.it/layoutgala/" class="link_external">html.it</a>，总计 40 个，覆盖流体、固定宽度、两列、三列等等各种常见的布局形式。最让人称道的是，这 40 个模板采用了完全一致的 HTML 结构(based on the same markup)，并严格遵循了“重要内容优先加载”的原则(页面的content部分)，HTML 与 CSS 部分均能通过 W3C 验证，同时在 IE/win 5.0+, Opera 8.5+, Firefox 1.5+ 和 Safari 2+都有非常好的兼容性。它使用的 <strong>HTML</strong> 如下：</p><span id="more-2254"></span>
<pre class="sh_xml sh_sourceCode">
&lt;div id=&quot;container&quot;&gt;
  &lt;div id=&quot;header&quot;&gt;Header&lt;/div&gt;
  &lt;div id=&quot;wrapper&quot;&gt;
    &lt;div id=&quot;content&quot;&gt;Content&lt;/div&gt;
  &lt;/div&gt;
  &lt;div id=&quot;navigation&quot;&gt;Navigation&lt;/div&gt;
  &lt;div id=&quot;extra&quot;&gt;Extra stuff&lt;/div&gt;
  &lt;div id=&quot;footer&quot;&gt;Footer&lt;/div&gt;
&lt;/div&gt;  
</pre>
<p>以三列流动布局为例，其 <strong>CSS</strong> 代码如下：</p>
<pre class="sh_css sh_sourceCode">
div#header{position:relative}
div#header h1{height:80px;line-height:80px;margin:0;
padding-left:10px;background: #EEE;color: #79B30B}
div#header a{position:absolute;right:0;top:23px}
div#content p{line-height:1.4}
div#navigation{background:#B9CAFF}
div#extra{background:#FF8539}
div#footer{background: #333;color: #FFF}
div#footer p{margin:0;padding:5px 10px}
div#footer a{display:inline;padding:0;color: #C6D5FD}

div#wrapper{float:left;width:100%}
div#content{margin-right: 50%}
div#navigation{float:left;width:25%;margin-left:-50%}
div#extra{float:left;width:25%;margin-left:-25%}
div#footer{clear:left;width:100%}
</pre>
<p>本例采用浮动加负 margin 的方法实现，在这套模板中，多采用这种方式。结构清晰，代码简洁，有很多值得学习与借鉴的地方。有兴趣的朋友可以猛点下面的链接，或者下载全套模板的 zip 包。</p>
<p><a href="http://blog.html.it/layoutgala/" class="link_demo" rel="800|600">LayoutGala</a>
<a href="http://blog.html.it/layoutgala/allLayouts.zip" class="link_download">打包下载</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/css/layout-gala-same-markup-css-layout.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Firebug Console 与命令行全集</title>
		<link>http://www.jsmix.com/tools/firebug-console-api-and-command-line-api.html</link>
		<comments>http://www.jsmix.com/tools/firebug-console-api-and-command-line-api.html#comments</comments>
		<pubDate>Thu, 17 Mar 2011 14:25:35 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[工具箱]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2223</guid>
		<description><![CDATA[Console API 当打开 firebug (也包括 Chrome 等浏览器的自带调试工具)，window 下面会注册一个叫做 console 的对象，它提供多种方法向控制台输出信息，供开发人员调试使用。下面是这些方法的一个简单介绍，适时地运用它们，对于提高开发效率很有帮助。 console.log(object[, object, ...]) 使用频率最高的一条语句：向控制台输出一条消息。支持 C 语言 printf 式的格式化输出。当然，也可以不使用格式化输出来达到同样的目的。下面两行代码执行的结果是相同的： console.log(&#34;The %s jumped over %d tall buildings&#34;, animal, count); console.log(&#34;The&#34;, animal, &#34;jumped over&#34;, count, &#34;tall buildings&#34;); console.debug(object[, object, ...]) 向控制台输出一条信息，它包括一个指向该行代码位置的超链接。 console.info(object[, object, ...]) 向控制台输出一条信息，该信息包含一个表示“信息”的图标，和指向该行代码位置的超链接。 console.warn(object[, object, ...]) 同 info。区别是图标与样式不同。 console.error(object[, object, ...]) 同 info。区别是图标与样式不同。error 实际上和 throw new [...]]]></description>
			<content:encoded><![CDATA[<h3>Console API</h3>
<p>当打开 firebug (也包括 Chrome 等浏览器的自带调试工具)，window 下面会注册一个叫做  console 的对象，它提供多种方法向控制台输出信息，供开发人员调试使用。下面是这些方法的一个简单介绍，适时地运用它们，对于提高开发效率很有帮助。</p>
<h6>console.log(object[, object, ...])</h6>
<p>使用频率最高的一条语句：向控制台输出一条消息。支持 C 语言 printf 式的格式化输出。当然，也可以不使用格式化输出来达到同样的目的。下面两行代码执行的结果是相同的：</p>
<pre class="sh_css sh_sourceCode">
console.log(&quot;The %s jumped over %d tall buildings&quot;, animal, count);
console.log(&quot;The&quot;, animal, &quot;jumped over&quot;, count, &quot;tall buildings&quot;);
</pre>
<span id="more-2223"></span>
<h6>console.debug(object[, object, ...])</h6>
<p>向控制台输出一条信息，它包括一个指向该行代码位置的超链接。</p>

<h6>console.info(object[, object, ...])</h6>
<p>向控制台输出一条信息，该信息包含一个表示“信息”的图标，和指向该行代码位置的超链接。</p>

<h6>console.warn(object[, object, ...])</h6>
<p>同 info。区别是图标与样式不同。</p>

<h6>console.error(object[, object, ...])</h6>
<p>同 info。区别是图标与样式不同。error 实际上和 throw new Error() 产生的效果相同，使用该语句时会向浏览器抛出一个 js 异常。</p>

<h6>console.assert(expression[, object, ...])</h6>
<p>断言，测试一条表达式是否为真，不为真时将抛出异常（断言失败）。</p>

<h6>console.dir(object)</h6>
<p>输出一个对象的全部属性（输出结果类似于 DOM 面板中的样式）。</p>

<h6>console.dirxml(node)</h6>
<p>输出一个 HTML 或者 XML 元素的结构树，点击结构树上面的节点进入到 HTML 面板。</p>

<h6>console.trace()</h6>
<p>输出 Javascript 执行时的堆栈追踪。</p>

<h6>console.group(object[, object, ...])</h6>
<p>输出消息的同时打开一个嵌套块，用以缩进输出的内容。调用 console.groupEnd() 用以结束这个块的输出。</p>

<h6>console.groupCollapsed()</h6>
<p>同 console.group(); 区别在于嵌套块默认是收起的。</p>

<h6>console.time(name)</h6>
<p>计时器，当调用 console.timeEnd(name);并传递相同的 name 为参数时，计时停止，并输出执行两条语句之间代码所消耗的时间（毫秒）。</p>

<h6>console.profile([title])</h6>
<p>与 profileEnd() 结合使用，用来做性能测试，与 console 面板上 profile 按钮的功能完全相同。</p>

<h6>console.count([title])</h6>
<p>输出该行代码被执行的次数，参数 title 将在输出时作为输出结果的前缀使用。</p>

<h6>console.clear()</h6>
<p>清空控制台</p>

<h3 class="p_t20">命令行</h3>
<p>控制台的输出面板右边，是控制台的输入面板（Chrome 调试工具对应为下方），在这里除了可以运行常规的 javascript 代码，还内置了相当数量的命令行可以辅助我们的调试工作，下面是一些常用命令行的简单介绍：</p>

<h6>$(id)</h6>
<p>返回一个给定 id 的元素。</p>

<h6>$$(selector)</h6>
<p>返回给定的 css 选择器匹配到的一组元素。</p>

<h6>$x(xpath)</h6>
<p>返回给定的 XPath 表达式匹配到的一组元素。</p>

<h6>$0</h6>
<p>在 HTML 面板中选中的元素。</p>

<h6>$1</h6>
<p>上一次在 HTML 面板中选中的元素。</p>

<h6>$n(index)</h6>
<p>访问最近 5 个被选中过的元素，index 的范围： 0 - 4。</p>

<h6>dir(object)</h6>
<p>同 console.dir(object)。</p>

<h6>dirxml(node)</h6>
<p>同 console.dirxml(node)。</p>

<h6>clear()</h6>
<p>同 console.clear()。</p>

<h6>inspect(object[, tabName])()</h6>
<p>在合适的（或一个指定的） tab 中检视一个对象。</p>

<h6>keys(object)</h6>
<p>返回一个对象的所有属性的键。</p>

<h6>values(object)</h6>
<p>返回一个对象的所有属性的值。</p>

<h6>debug(fn)</h6>
<p>在函数第一行添加一个断点，使用 undebug(fn) 移除断点。</p>

<h6>monitor(fn)</h6>
<p>开启一个函数的调用日志，使用 unmonitor(fn) 关闭该功能。非常有用的一个命令，但是它似乎并没有很好地工作。</p>

<h6>monitorEvents(object[, types])</h6>
<p>开启一个元素的某个事件（或所有事件）被触发时的日志记录。用例如下：</p>
<pre class="sh_css sh_sourceCode">
monitorEvents($0,[&#039;click&#039;])
</pre>
<p>上面的命令行被执行后，将开启当前在 HTML 面板中被选中元素的 click 事件监控，一旦这个元素的 click 事件被触发，事件对象将会在控制台输出。如果不指定第二个参数，将对所有事件进行记录。</p>

<h6>profile([title])</h6>
<p>同 console.profile([title])</p>

<h3>参考资料</h3>
<ul>
<li><a href="http://getfirebug.com/wiki/index.php/Command_Line_API" class="link_external">Firebug wiki --- Command Line API</a></li>
<li><a href="http://getfirebug.com/wiki/index.php/Console_API" class="link_external">Firebug wiki --- Console API</a></li>
</ul>











]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/tools/firebug-console-api-and-command-line-api.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>无通信的图像旋转</title>
		<link>http://www.jsmix.com/javascript/image-rotate-without-correspondence.html</link>
		<comments>http://www.jsmix.com/javascript/image-rotate-without-correspondence.html#comments</comments>
		<pubDate>Tue, 15 Feb 2011 14:08:22 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2151</guid>
		<description><![CDATA[图像的旋转是目前的 web 应用程序中比较常见的一种操作。曾经在做这样的程序时，思路比较狭窄，总是认为扔给服务器端处理比较稳妥。这种方法大致的过程是这样的：当用户点击一种旋转方向，立即发出一个 Ajax 请求，告诉后端要旋转的图像和旋转的角度，再由后端通过一定的工具(如 PHP 的 GD 库)生成新的图像再进行存储并向浏览器返回新的图像地址，这时使用 JavaScript 对图像的 src 属性进行更新即可。这个过程对于前端来说非常的简单，它大概像下面这样： $.ajax({ url : &#039;url.php&#039;, type : &#039;GET&#039;, data : { degree : 90, imageId : id }, success : function(src){ image.src = src; } }); 尽管可以在前端缓存每个已经旋转过的角度的图像地址，但是当旋转到新的角度时，仍然需要发出 Ajax 请求，用户需要一个等待的过程，服务器也需要对图像进行处理和存储，还要考虑才适当的时候删除掉这些“过程中”的图像，非常的麻烦。事实上，利用 canvas 就可以轻易的实现这样的功能，而对于不支持 canvas 的 IE ，则可以使用滤镜来达到同样的目的，对于这个操作而言，IE 的滤镜甚至较 canvas 更为简单。最重要的是，由于是纯前端的行为，用户几乎无需等待就可以看到效果，也没有建立任何 HTTP 请求，不会对服务器端产生任何影响。 下面我们就来一步步实现纯前端方式的图像旋转，首先是 IE，在 IE [...]]]></description>
			<content:encoded><![CDATA[<p>图像的旋转是目前的 web 应用程序中比较常见的一种操作。曾经在做这样的程序时，思路比较狭窄，总是认为扔给服务器端处理比较稳妥。这种方法大致的过程是这样的：当用户点击一种旋转方向，立即发出一个 Ajax 请求，告诉后端要旋转的图像和旋转的角度，再由后端通过一定的工具(如 PHP 的 GD 库)生成新的图像再进行存储并向浏览器返回新的图像地址，这时使用 JavaScript 对图像的 src 属性进行更新即可。这个过程对于前端来说非常的简单，它大概像下面这样：</p><span id="more-2151"></span>
<pre class="sh_javascript sh_sourceCode">
$.ajax({
	url : &#039;url.php&#039;,
	type : &#039;GET&#039;,
	data : {
		degree : 90,
		imageId : id
	},
	success : function(src){
		image.src = src;
	}
});
</pre>
<p>尽管可以在前端缓存每个已经旋转过的角度的图像地址，但是当旋转到新的角度时，仍然需要发出 Ajax 请求，用户需要一个等待的过程，服务器也需要对图像进行处理和存储，还要考虑才适当的时候删除掉这些“过程中”的图像，非常的麻烦。事实上，利用 canvas 就可以轻易的实现这样的功能，而对于不支持 canvas 的 IE ，则可以使用滤镜来达到同样的目的，对于这个操作而言，IE 的滤镜甚至较 canvas 更为简单。最重要的是，由于是纯前端的行为，用户几乎无需等待就可以看到效果，也没有建立任何 HTTP 请求，不会对服务器端产生任何影响。</p>
<p>下面我们就来一步步实现纯前端方式的图像旋转，首先是 IE，在 IE 中通过 BasicImage 滤镜 的 rotate 属性值来设置图像的旋转角度，根据微软的文档，这个值只能设置为 0、1、2、3，分别表示 0度，90度，180度和270度四个角度的旋转，假定我们已经获取到了图像对象为 image，旋转的角度为 degree，那么具体的代码就非常简单了：</p>
<pre class="sh_javascript sh_sourceCode">
image.style.filter = &#039;progid:DXImageTransform.Microsoft.BasicImage(rotation=&#039;+degree/90+&#039;)&#039;;
</pre>
<p>其他浏览器中的情况要稍微复杂一点，需要借助于 Canvas，使用其 rotate 方法旋转 Canvas，使用其 drawImage 方法在 Canvas 上绘制图像。rotate 方法非常简单，它接受一个参数，即旋转的弧度数，注意这里是弧度而不是角度，如果还记得高中数学的话，弧度与角度的转换公式应该并不陌生：</p>
<pre class="sh_javascript sh_sourceCode">
var radian = degree * Math.PI / 180;
/** 弧度 = 角度 * π / 180 **/
</pre>
<p>drawImage 方法的参数比较多，但我们这里指使用其中前三个参数：图像对象，绘制起点的 x 坐标，绘制起点的 y 坐标。在调用这些方法之前，我们需要为 img 元素 追加一个 canvas：</p>
<pre class="sh_xml sh_sourceCode">
&lt;img src=&quot;img_rotate.jpg&quot; alt=&quot;football&quot; id=&quot;rotate_demo&quot; /&gt;
&lt;canvas id=&quot;image_canvas&quot;&gt;&lt;/canvas&gt;
</pre>
<p>接下来在 JavaScript 中获取到这两个元素，然后使用刚才介绍的两个方法根据不同的角度对图像和 canvas 进行处理：</p>
<pre class="sh_javascript sh_sourceCode">
var image = document.getElementById(&quot;rotate_demo&quot;);
var canvas = document.getElementById(&quot;image_canvas&quot;);
var ctx = canvas.getContext(&#039;2d&#039;);
var width = image.width, height = image.height, x = 0, y = 0;
switch(degree){
     case 90:
          width = image.height;
          height = image.width;
          y = image.height * (-1);
          break;
     case 180:
          x = image.width * (-1);
          y = image.height * (-1);
          break;
     case 270:
          width = image.height;
          height = image.width;
          x = image.width * (-1);
          break;
}

canvas.setAttribute(&#039;width&#039;, width);
canvas.setAttribute(&#039;height&#039;, height);
ctx.rotate(degree * Math.PI / 180);
ctx.drawImage(image, x, y);
image.style.display = &quot;none&quot;;
</pre>
<p>上面的代码看起来比较多，实际上核心方法只有刚才讲到的 rotate 和 drawImage，但是需要注意的，当画布旋转的时候，画布的宽高可能会发生反转，绘制的坐标也可能会反转，所以我们对 degree 进行了 switch ，具体处理在不同的角度下的反转情况，最后将原始图像隐藏，使用绘制好的 canvas 来显示。</p>
<p>纯前端旋转图像的主要过程就是这样的，剩下的问题是通过下面的函数来判断具体让浏览器使用 canvas 还是使用滤镜：</p>
<pre class="sh_javascript sh_sourceCode">
function supportCanvas(){
	return !!document.createElement(&#039;canvas&#039;).getContext;
}
</pre>
<p>将上面的代码套在一个函数中，并稍加改造，在外面加上一个按钮，即可循环旋转图像，下面是本文 Demo 的完整代码。html：</p>
<pre class="sh_xml sh_sourceCode">
&lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;旋转&quot; id=&quot;rorate_button&quot;/&gt;&lt;/p&gt;
&lt;img src=&quot;img_rotate.jpg&quot; alt=&quot;football&quot; id=&quot;rotate_demo&quot;/&gt;
&lt;canvas id=&quot;image_canvas&quot;&gt;&lt;/canvas&gt;
</pre>
<p>JavaScript：</p>
<pre class="sh_javascript sh_sourceCode">
// canvas 能力检测
var supportCanvas = !!document.createElement(&#039;canvas&#039;).getContext;

// 主函数
function imageRotate(degree,image,canvasId){
	if(!supportCanvas){
		image.style.filter = &#039;progid:DXImageTransform.Microsoft.BasicImage(rotation=&#039;+degree/90+&#039;)&#039;;
	}else{
		var canvas = document.getElementById(canvasId);
		var ctx = canvas.getContext(&#039;2d&#039;);
		var width = image.width, height = image.height, x = 0, y = 0;
		switch(degree){
		     case 90:
		          width = image.height;
		          height = image.width;
		          y = image.height * (-1);
		          break;
		     case 180:
		          x = image.width * (-1);
		          y = image.height * (-1);
		          break;
		     case 270:
		          width = image.height;
		          height = image.width;
		          x = image.width * (-1);
		          break;
		}
		canvas.setAttribute(&#039;width&#039;, width);
		canvas.setAttribute(&#039;height&#039;, height);
		ctx.rotate(degree * Math.PI / 180);
		ctx.drawImage(image, x, y);
		image.style.display = &quot;none&quot;;
	}
}

// 初始角度与事件绑定
var degree = 0;
var image = document.getElementById(&quot;rotate_demo&quot;);
document.getElementById(&quot;rorate_button&quot;).onclick = function(){
	degree += 90;
	degree = degree === 360 ? 0 : degree;
	imageRotate(degree,image,&#039;image_canvas&#039;);
};
</pre>



<p><input type="button" value="旋转图像" id="rorate_button" class="w80"/></p>
<p><img src="http://www.jsmix.com/wp-content/uploads/2011/02/img_demo.jpg" id="rotate_demo" alt="image rotate" title="image rotate" width="480" height="360" class="alignnone size-full wp-image-2166" /><canvas id="image_canvas"></canvas></p>


<h3>参考资料：</h3>
<ul>
<li><a class="link_external" href="http://msdn.microsoft.com/en-us/library/bb554293%28v=vs.85%29.aspx">MSDN ---- Rotation Property</a></li>
<li><a class="link_external" href="https://developer.mozilla.org/en/Canvas_tutorial/Using_images">MDC --- Using images</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/javascript/image-rotate-without-correspondence.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>无阻塞加载外部脚本</title>
		<link>http://www.jsmix.com/javascript/how-to-load-external-scripts-without-blocking.html</link>
		<comments>http://www.jsmix.com/javascript/how-to-load-external-scripts-without-blocking.html#comments</comments>
		<pubDate>Tue, 28 Dec 2010 17:47:37 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[性能优化]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2125</guid>
		<description><![CDATA[什么是脚本阻塞？ 浏览器在加载外部脚本时，不会进行其他内容的加载和渲染工作，相当于此时浏览器处于一种“停滞”状态，直至该外部脚本完全加载，并执行完成。这样的设计具有其合理性和必须性，每一个脚本都有可能对页面元素进行操作，同时相互之间可能存在依赖性，最简单的例子如使用 jQuery 这样的库，基于 jQuery 的脚本必须在 jQuery 完全下载并执行完成建立 jQuery 对象后，其他的代码才有生效的可能。由此看来，脚本按顺序执行时必需的，但是没有更好的理由表示他们需要按顺序单个加载。这样的做法严重影响了页面的性能，当页面含有较多的外部脚本，可以非常明显的感觉到浏览器被脚本阻塞而处于这种”停滞“状态。下面的一些方法将帮助我们并行下载外部脚本。 1. 使用 Ajax 加载脚本 jQuery 的情况非常简单，只需要建立这个连接到脚本文件，当加载完成，代码便会执行。 $.ajax({ url : &#34;a.js&#34;, type : &#34;GET&#34; }); 原生 javascript 的情况稍微复杂一些，主要区别在于需要手动触发脚本。当然，在开始加载脚本之前，首先创建一个函数来获取通用的 xhr 对象： function getXhr() { xhr = false; // branch for native XMLHttpRequest object if(window.XMLHttpRequest &#38;&#38; !(window.ActiveXObject)) { try { xhr = new XMLHttpRequest(); } catch(e) { xhr [...]]]></description>
			<content:encoded><![CDATA[<h3>什么是脚本阻塞？</h3>
<p>浏览器在加载外部脚本时，不会进行其他内容的加载和渲染工作，相当于此时浏览器处于一种“停滞”状态，直至该外部脚本完全加载，并执行完成。这样的设计具有其合理性和必须性，每一个脚本都有可能对页面元素进行操作，同时相互之间可能存在依赖性，最简单的例子如使用 jQuery 这样的库，基于 jQuery 的脚本必须在 jQuery 完全下载并执行完成建立 jQuery 对象后，其他的代码才有生效的可能。由此看来，脚本按顺序执行时必需的，但是没有更好的理由表示他们需要按顺序单个加载。这样的做法严重影响了页面的性能，当页面含有较多的外部脚本，可以非常明显的感觉到浏览器被脚本阻塞而处于这种”停滞“状态。下面的一些方法将帮助我们并行下载外部脚本。</p><span id="more-2125"></span>
<h3>1. 使用 Ajax 加载脚本</h3>
<p>jQuery 的情况非常简单，只需要建立这个连接到脚本文件，当加载完成，代码便会执行。</p>
<pre class="sh_javascript sh_sourceCode">
    $.ajax({
        url : &quot;a.js&quot;,
        type : &quot;GET&quot;
    });
</pre>
<p>原生 javascript 的情况稍微复杂一些，主要区别在于需要手动触发脚本。当然，在开始加载脚本之前，首先创建一个函数来获取通用的 xhr 对象：</p>
<pre class="sh_javascript sh_sourceCode">
	function getXhr() {
		xhr = false;
	    // branch for native XMLHttpRequest object
	    if(window.XMLHttpRequest &amp;&amp; !(window.ActiveXObject)) {
	    	try {
				xhr = new XMLHttpRequest();
	        } catch(e) {
				xhr = false;
	        }
	    // branch for IE/Windows ActiveX version
	    } else if(window.ActiveXObject) {
	       	try {
	        	xhr = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);
	      	} catch(e) {
	        	try {
	          		xhr = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
	        	} catch(e) {
	          		xhr = false;
	        	}
			}
	    }
		return xhr;
	}
</pre>
<p>在原生 javascript 中，第一种让脚本执行的办法是调用 eval() 函数：</p>
<pre class="sh_javascript sh_sourceCode">
	var xhr = getXhr();
	xhr.onreadystatechange = function(){
		if(xhr.readyState == 4 &amp;&amp; xhr.status == 200){
			eval(xhr.responseText);    //执行代码
		}
	}
	xhr.open(&quot;GET&quot;,&quot;a.js&quot;,true);
	xhr.send(null);
</pre>
<p>另一个让脚本运行的方法是向页面追加元素：</p>
<pre class="sh_javascript sh_sourceCode">
	var xhr = getXhr();
	xhr.onreadystatechange = function(){
		if(xhr.readyState == 4 &amp;&amp; xhr.status == 200){
			var script = document.createElement(&quot;script&quot;);
			var head = document.getElementsByTagName(&quot;head&quot;)[0];
			script.text = xhr.responseText;
			head.appendChild(script);
		}
	}
	xhr.open(&quot;GET&quot;,&quot;a.js&quot;,true);
	xhr.send(null);
</pre>
<p><strong>无论是使用 jQuery，还是原生 javascript 两种方法（eval 和 追加 script 元素）中的任何一种，由于 Ajax 的同源策略，脚本只能从当前域中获取。</strong></p>
<h3>2. 向页面添加带 scr 属性的 script 元素</h3>
<p>这种方法看似和直接在页面引用 script 类似，但是一个微小的区别是，使用这种方法加载脚本，不会阻塞浏览器加载和渲染其他内容，这正是我们需要的。</p>
<pre class="sh_javascript sh_sourceCode">
	var script = document.createElement(&quot;script&quot;);
	var head = document.getElementsByTagName(&quot;head&quot;)[0];
	script.src = &quot;a.js&quot;;
	head.appendChild(script);
</pre>
<p><strong>脚本加载完成后自动运行，获取跨域的脚本在这种方法中是被允许的。</strong></p>
<h3>3. script 的 defer 属性</h3>
<p>defer 是 HTML4 中定义的 script 标签的一个属性，当浏览器检查到 script 中包含 defer 属性，这意味着告诉了浏览器，这个脚本是安全的，它不会对其他脚本造成影响，那么浏览器会<strong>并行下载该脚本</strong>，这个属性在 <a href="http://www.w3school.com.cn/tags/att_script_defer.asp" class="link_external">W3C School</a>中文版的解释如下：</p>
<pre lang="text">
如果您的脚本不会改变文档的内容，可将 defer 属性加入到 &lt;script&gt; 标签中，
以便加快处理文档的速度。因为浏览器知道它将能够安全地读取文档的剩余部分而不用执行脚本，
它将推迟对脚本的解释，直到文档已经显示给用户为止。
</pre>
<p>defer 是所有方法中最简便的，但是遗憾的是，只有 IE 支持这一属性。</p>
<pre class="sh_xml sh_sourceCode">
    &lt;script type=&quot;text/javascript&quot; src=&quot;a.js&quot; defer=&quot;defer&quot;&gt;&lt;/script&gt;
</pre>
<p><strong>Note: </strong>IE 8 是最早支持脚本并行下载的浏览器，之后 Firefox 等浏览器在新版本中也开始进行支持，到目前为止，较新版本的浏览器都是并行加载外部脚本文件，而无需进行额外的处理。本文中的方法则适用于所有的浏览器，当然也包括 IE6 和 IE7，同时，这些方法也适用于动态加载 js 的需要。</p>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/javascript/how-to-load-external-scripts-without-blocking.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CSS 性能优化技巧</title>
		<link>http://www.jsmix.com/css/performance-optimization-css.html</link>
		<comments>http://www.jsmix.com/css/performance-optimization-css.html#comments</comments>
		<pubDate>Fri, 10 Dec 2010 15:51:59 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[性能优化]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2053</guid>
		<description><![CDATA[作为指导浏览器如何渲染页面样式的部分，CSS 的性能对页面整体性能的影响是巨大的。在这篇文章中，我们共同来讨论如何对 CSS 进行优化，实际上，其中所有的手法都并不复杂，关键在于多在实战中实施，并深刻了解优化与未经优化的差异。另外，在这个过程中合理利用一些工具能够对我们产生莫大的帮助。Google 的 Page Speed和 Yahoo 的YSlow都是不错的选择，两者均是基于 Firebug 的插件。在这篇文章中，我们主要使用到的是 Page Speed 进行演示。 1. 合理使用 CSS Sprite 和 DataURI CSS Sprite 相信大家已经非常熟悉了，把 CSS 中用作背景的图片拼合成一张图，然后通过 background-position 来设定显示的具体位置。这种手法对于减少 HTTP 请求数非常地见效，但是并不是所有的图片都适合做成 Sprite，例如一个需要平铺的背景。另外，CSS Sprite 的另一个问题是难以维护与更新，试想修改一堆小图拼成的大图，肯定比修改单个小图片费劲得多，所以在拼合成大图前，精心的设计是不可缺少的一个环节。DataURI是一种将小文件嵌入文档的方案，一个例子如下： body { background: url(data:image/gif;base64,gif图片编码); } DataURI 的主要目的同样是为了减少 HTTP 请求数量，但事实上使用这项技术需要非常的谨慎，DataURI 有足够的缺点让开发者放弃它，首先，浏览器需要较普通图片数倍数十倍的开销将编码转成图片并呈现出来；其次，编码的图片无法被重复使用，这意味着在一个页面中，想要多次使用该图片，就需要将编码多次copy；最后，上面的方式对于 IE6/7 并不适用，为了全面兼容，需要为他们添加 Hack，这意味着需要双倍的代码量，真是得不偿失。 2. 压缩 CSS 与使用简码书写 CSS 这两个技巧的目的在于使 CSS 文件变得更小。压缩 CSS 是去掉对开发人员有用而对浏览器无用的空格符，甚至是换行符，对于此项工作，推荐使用 [...]]]></description>
			<content:encoded><![CDATA[<p>作为指导浏览器如何渲染页面样式的部分，CSS 的性能对页面整体性能的影响是巨大的。在这篇文章中，我们共同来讨论如何对 CSS 进行优化，实际上，其中所有的手法都并不复杂，关键在于多在实战中实施，并深刻了解优化与未经优化的差异。另外，在这个过程中合理利用一些工具能够对我们产生莫大的帮助。Google 的 <a href="http://code.google.com/speed/page-speed/download.html" class="link_external">Page Speed</a>和 Yahoo 的<a href="http://developer.yahoo.com/yslow/" class="link_external">YSlow</a>都是不错的选择，两者均是基于 Firebug 的插件。在这篇文章中，我们主要使用到的是 Page Speed 进行演示。</p>
<h3>1. 合理使用 CSS Sprite 和 DataURI</h3><span id="more-2053"></span>
<p><strong>CSS Sprite</strong> 相信大家已经非常熟悉了，把 CSS 中用作背景的图片拼合成一张图，然后通过 background-position 来设定显示的具体位置。这种手法对于减少 HTTP 请求数非常地见效，但是并不是所有的图片都适合做成 Sprite，例如一个需要平铺的背景。另外，CSS Sprite 的另一个问题是难以维护与更新，试想修改一堆小图拼成的大图，肯定比修改单个小图片费劲得多，所以在拼合成大图前，精心的设计是不可缺少的一个环节。<strong>DataURI</strong>是一种将小文件嵌入文档的方案，一个例子如下：</p>
<pre class="sh_css sh_sourceCode">
    body {
            background: url(data:image/gif;base64,gif图片编码);
    }
</pre>
<p>DataURI 的主要目的同样是为了减少 HTTP 请求数量，但事实上使用这项技术需要非常的谨慎，DataURI 有足够的缺点让开发者放弃它，首先，浏览器需要较普通图片数倍数十倍的开销将编码转成图片并呈现出来；其次，编码的图片无法被重复使用，这意味着在一个页面中，想要多次使用该图片，就需要将编码多次copy；最后，上面的方式对于 IE6/7 并不适用，为了全面兼容，需要为他们添加 Hack，这意味着需要双倍的代码量，真是得不偿失。</p>
<h3>2. 压缩 CSS 与使用简码书写 CSS</h3>
<p>这两个技巧的目的在于使 CSS 文件变得更小。压缩 CSS 是去掉对开发人员有用而对浏览器无用的空格符，甚至是换行符，对于此项工作，推荐使用 YUI 的 <a href="http://developer.yahoo.com/yui/compressor/" class="link_external">Compressor</a>，这是一个命令行模式的 JAVA 小程序，适合于将其添加到你的自动部署流程中。它的使用非常的简单，下面的一行命令行将压缩 a.css 并输出到 a.min.css</p>
<pre class="sh_sourceCode">
    java -jar yuicompressor.jar a.css -o a.min.css
</pre>
<p>事实上 YUI compressor 真正强大的地方在于对 javascript 的压缩，有兴趣的朋友可以去看看文档。下面这张图片展示了压缩前的 a.css 和压缩后的 a.min.css 的对比，可以看到，YUI compressor 去掉了所有不需要的空格符和换行符，压缩率约为 37%（视情况而定）</p>
<p><img src="http://www.jsmix.com/wp-content/uploads/2010/12/YUI-compressor.png" alt="YUI-compressor 压缩前后对比" title="YUI-compressor 压缩前后对比" width="630" height="331" class="alignnone size-full wp-image-2086" /></p>
<p>有的朋友可能因为种种原因，并不具备自动化部署的条件，那么使用 YUI compressor 可能就稍显麻烦了，这种情况推荐使用前面说到的 Page Speed，如果你的 CSS 文件未经压缩，Page Speed 将会在 minify css 项给出一个红色的警告，展开选项，可以看到 Google 已经为你准备好了压缩版本，可以选择查看或者另存，非常的方便。（如下图）</p>
<p><img src="http://www.jsmix.com/wp-content/uploads/2010/12/page-speed-css-min.png" alt="Minifying CSS --- Page Speed" title="Minifying CSS --- Page Speed" width="630" height="163" class="alignnone size-full wp-image-2090" /></p>
<p>关于 CSS 简码的书写，则非常简单了，非常多的属性都可以使用简写来表示，如果这种写法成为习惯，你会发现减小 CSS 文件大小是多么顺其自然的事:</p>
<pre class="sh_css sh_sourceCode">
    body {
        background:url(images/bg.png) repeat #369 center center;
        padding:5px 10px;
        margin:5px 10px;
        font:bold 18px Arial;
        border:1px solid #ccc;
    }
</pre>
<h3>3. 使用效率更高的选择器</h3>
<p>很多开发者都有 HTML 洁癖，甚至不愿意给元素标记更多的 id 或 class，但这带来的副作用就是在 css 中使用的选择器过于复杂：</p>
<pre class="sh_css sh_sourceCode">
    #nav li a {...}
    #footerWrapper #footer .column p {...}
    ul &gt; li &gt; a {...}
    form#login {...}
</pre>
<p>上面的例子都是效率比较低下的选择器，大量使用低效选择器将会对页面渲染造成性能影响。事实上，Google 推荐我们使用更为简洁的选择器，用 id 或 class 直接指向元素，后代选择器当然是非常好用的，但是最好不要超过2层。如果你使用的选择器有不合乎 Google 推荐的情况，在 Page Speed 中会有具体的提示，展开 Use efficient CSS selectors 项，每一个低效的选择器都被按严重程度罗列出来。</p>
<p><img src="http://www.jsmix.com/wp-content/uploads/2010/12/page-speed-css-selector.png" alt="page-speed css 选择器优化" title="page-speed css 选择器优化" width="630" height="328" class="alignnone size-full wp-image-2107" /></p>
<h3>4. 避免使用滤镜和表达式</h3>
<p>这一条是仅针对 IE 而言，IE 浏览器可以解释 CSS 中的 filter 和 expression ，尽管它们在有的时候非常有用，但是副作用也是不得不考虑的。例如，当我们使用 filter 引用一个透明 png 图片时，这个图片的加载会阻塞浏览器，此时浏览器不会做其他任何操作，包括加载其他资源和渲染页面；另外，当这个 png 图片被加载之后，无法像其他图片一样被缓存，这意味着每次页面的刷新都会重新请求并下载该图片。而使用 expression 会大大降低渲染页面的效率也是众所周知的事情。最后多说一句， expression 对于 IE8 来说，只在兼容模式(compatibility mode)下有效。</p>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/css/performance-optimization-css.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>@font-face和其他字体替换方案</title>
		<link>http://www.jsmix.com/css/font.html</link>
		<comments>http://www.jsmix.com/css/font.html#comments</comments>
		<pubDate>Fri, 26 Nov 2010 11:38:39 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=2013</guid>
		<description><![CDATA[漂亮的字体，是设计师的法宝，但是在 WEB 设计中，这一法宝几乎失效，某种自定义字体往往因为用户的电脑中没有预制该字体而无法以想要的方式呈现。本文将提供一些关于此问题的解决方案，在权衡利弊之后，相信总有一款适合运用于你的项目中。 使用图像替换 这是一种最为常见的方式，我们常常把设计图中自定义字体的部分切成图片，然后在页面中引用该图片，或者在 CSS 中通过背景图的方式，将图片嵌入到某个元素中。 h1{ width : 200px; height : 50px; background : url(logo.png) no-repeat; } 这种方式非常快速简单，并且具有很好的浏览器兼容性，但是它的缺点也非常突出，它无法被重用，难以维护，当图像使用得过多时，还会严重地影响到页面的加载速度。 @font-face @font-face 是 W3C CSS Fonts Module的一部分，它允许开发者在页面中使用自定义字体，而无论用户的计算机中是否已安装了这种字体。定义和使用一个字体的语法非常简单： @font-face { font-family : dolmen; src : local(&#34;dolmen&#34;), url(dolmen.ttf); } body{ font-family : dolmen } font-family : 定义一个字体名字，以便在以后使用。 src : 使用 url 定义字体文件的远程路径，或者使用 local 定义用户计算机中的字体名。 下面一行文本就是使用这种技术的例子： Hello @font-face [...]]]></description>
			<content:encoded><![CDATA[<p>漂亮的字体，是设计师的法宝，但是在 WEB 设计中，这一法宝几乎失效，某种<em>自定义字体</em>往往因为用户的电脑中没有预制该字体而无法以想要的方式呈现。本文将提供一些关于此问题的解决方案，在权衡利弊之后，相信总有一款适合运用于你的项目中。</p>
<h3>使用图像替换</h3>
<p>这是一种最为常见的方式，我们常常把设计图中自定义字体的部分切成图片，然后在页面中引用该图片，或者在 CSS 中通过背景图的方式，将图片嵌入到某个元素中。</p>
<pre class="sh_css sh_sourceCode">
h1{
    width : 200px;
    height : 50px;
    background : url(logo.png) no-repeat;
}
</pre><span id="more-2013"></span>
<p>这种方式非常快速简单，并且具有很好的浏览器兼容性，但是它的缺点也非常突出，它无法被重用，难以维护，当图像使用得过多时，还会严重地影响到页面的加载速度。</p>
<h3>@font-face</h3>
<p>@font-face 是 <a href="http://www.w3.org/TR/css3-fonts/#the-font-face-rule" class="link_external">W3C CSS Fonts Module</a>的一部分，它允许开发者在页面中使用自定义字体，而无论用户的计算机中是否已安装了这种字体。定义和使用一个字体的语法非常简单：</p>
<pre class="sh_css sh_sourceCode">
@font-face {  
	font-family : dolmen;  
	src : local(&quot;dolmen&quot;), 
	url(dolmen.ttf); 
}
body{
    font-family : dolmen
}
</pre>
<p><strong>font-family : </strong>定义一个字体名字，以便在以后使用。<br />
<strong>src : </strong>使用 url 定义字体文件的远程路径，或者使用 local 定义用户计算机中的字体名。<br /></p>
<p>下面一行文本就是使用这种技术的例子：</p>
<p class="font-face t_center">Hello @font-face</p>
<p>@font-face 在所有的现代浏览器中都得到了支持，微软甚至早在 IE 4 的时代就开始使用这项技术，但是不同的浏览器支持的字体类型却有所差异，IE 之外的浏览器都支持 TrueType 和 OpenType 字体类型，而 IE 则只支持 Embedded OpenType 类型，所以上面的例子在 IE 中不会有任何特别的地方。从 Firefox 3.6 开始，新增加了对 <a href="https://developer.mozilla.org/en/About_WOFF" class="link_external">WOFF</a> 字体的支持。</p>
<h3>sIFR</h3>
<p><a href="http://www.mikeindustries.com/blog/sifr" class="link_external">sIFR</a>是非常有名的一款字体替换组件，它使用 Flash 来替换页面上的文本，并通过 JavaScript 来控制。下面是一段使用 sIFR 定义字体，并使用自定义字体替换页面中 H1 元素文本的示例代码：</p>
<pre class="sh_javascript sh_sourceCode">
var cochin = {
  src: &#039;cochin.swf&#039;
};

sIFR.activate(cochin);

sIFR.replace(cochin, {
  selector: &#039;h1&#039;
});
</pre>
<p>众所周知的，Flash 对浏览器的开销非常惊人，尽管 sIFR 的开发人员已经尽可能地优化导出的 Flash，但是仍然不推荐使用这种技术在页面中替换太多的内容，通常替换 5 个以内的标题被认为是合理的，超出这个范围，页面性能大幅下降，可能让用户难以忍受。</p>
<h3>Typeface.js</h3>
<p>虽然名声远远不如 sIFR ，但是 <a href="http://typeface.neocracy.org/" class="link_external">Typeface</a>似乎有更好的前景，它不再使用 Flash，而是采用 JavaScript 绘制矢量图形的方式来替换文本。它的使用同样简单：</p>
<pre class="sh_xml sh_sourceCode">
&lt;script src=&quot;typeface-0.14.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;helvetiker_regular.typeface.js&quot;&gt;&lt;/script&gt;

&lt;div class=&quot;typeface-js&quot; style=&quot;font-family: Helvetiker&quot;&gt;
	Text here in Helvetiker font...
&lt;/div&gt;
</pre>
<p>Typeface.js 广泛地支持各种浏览器，并且在性能上更加出色，但是在 IE 6/7 中，矢量图形的绘制性能比较差，使用 Typeface.js 时，仍然需要有所节制。</p>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/css/font.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CSS 颜色值全面解析</title>
		<link>http://www.jsmix.com/css/color-value.html</link>
		<comments>http://www.jsmix.com/css/color-value.html#comments</comments>
		<pubDate>Sat, 20 Nov 2010 14:59:42 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=1942</guid>
		<description><![CDATA[颜色值在 CSS 中应用得非常广泛，例如 color, background, border, box-shadow 等属性都接受颜色作为属性值。但是当 CSS 发展至今，颜色值的设置也变得多样化，在浏览器兼容问题的催化下，很多人对颜色值的设置越来越迷惑。本文列举了到目前为止 CSS 中颜色值设置的所有可用项，详细阅读全文，你也许会考虑以前的书写习惯是不是应该改一改了。 SVG颜色关键词 W3C定义了一组SVG的颜色列表，同样是 CSS 颜色模块所指定的颜色，他们是一些指向特定颜色的单词，例如常见的 white, black ,red 等等。下面是其中的一部分，鼠标移动到这些色块上面，将会呈现出它们所对应的名称。 &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; !! &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>颜色值在 CSS 中应用得非常广泛，例如 color, background, border, box-shadow 等属性都接受颜色作为属性值。但是当 CSS 发展至今，颜色值的设置也变得多样化，在浏览器兼容问题的催化下，很多人对颜色值的设置越来越迷惑。本文列举了到目前为止 CSS 中颜色值设置的所有可用项，详细阅读全文，你也许会考虑以前的书写习惯是不是应该改一改了。</p>
<h3>SVG颜色关键词</h3>
<p>W3C定义了一组SVG的颜色列表，同样是 CSS 颜色模块所指定的颜色，他们是一些指向特定颜色的单词，例如常见的 white, black ,red 等等。下面是其中的一部分，鼠标移动到这些色块上面，将会呈现出它们所对应的名称。</p><span id="more-1942"></span>
<p style="line-height: 1.8em; font-family: monospace; cursor: help; overflow: hidden; text-shadow: -1px -1px white;"><span title="White" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% white;">&nbsp;&nbsp;</span> <span title="WhiteSmoke" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% WhiteSmoke;">&nbsp;&nbsp;</span> <span title="Snow" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Snow;">&nbsp;&nbsp;</span> <span title="MistyRose" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MistyRose;">&nbsp;&nbsp;</span> <span title="Seashell" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Seashell;">&nbsp;&nbsp;</span> <span title="Linen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Linen;">&nbsp;&nbsp;</span> <span title="AntiqueWhite" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% AntiqueWhite;">&nbsp;&nbsp;</span> <span title="BlanchedAlmond" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% BlanchedAlmond;">&nbsp;&nbsp;</span> <span title="PapayaWhip" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% PapayaWhip;">&nbsp;&nbsp;</span> <span title="OldLace" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% OldLace;">&nbsp;&nbsp;</span> <span title="FloralWhite" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% FloralWhite;">&nbsp;&nbsp;</span> <span title="Cornsilk" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Cornsilk;">&nbsp;&nbsp;</span> <span title="LemonChiffon" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LemonChiffon;">&nbsp;&nbsp;</span> <span title="Beige" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Beige;">&nbsp;&nbsp;</span> <span title="LightGoldenrodYellow" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightGoldenrodYellow;">&nbsp;&nbsp;</span> <span title="Ivory" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Ivory;">&nbsp;&nbsp;</span> <span title="LightYellow" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightYellow;">&nbsp;&nbsp;</span> <span title="Honeydew" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Honeydew;">&nbsp;&nbsp;</span> <span title="MintCream" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MintCream;">&nbsp;&nbsp;</span> <span title="Azure" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Azure;">&nbsp;&nbsp;</span> <span title="LightCyan" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightCyan;">&nbsp;&nbsp;</span> <span title="AliceBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% AliceBlue;">&nbsp;&nbsp;</span> <span title="Lavender" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Lavender;">&nbsp;&nbsp;</span> <span title="GhostWhite" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% GhostWhite;">&nbsp;&nbsp;</span> <span title="LavenderBlush" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LavenderBlush;">&nbsp;&nbsp;</span> <span title="Gainsboro" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Gainsboro;">&nbsp;&nbsp;</span> <span title="LightGray" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightGray;">!!</span> <span title="LightGrey" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightGrey;">&nbsp;&nbsp;</span> <span title="PeachPuff" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% PeachPuff;">&nbsp;&nbsp;</span> <span title="Bisque" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Bisque;">&nbsp;&nbsp;</span> <span title="NavajoWhite" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% NavajoWhite;">&nbsp;&nbsp;</span> <span title="Moccasin" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Moccasin;">&nbsp;&nbsp;</span> <span title="Wheat" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Wheat;">&nbsp;&nbsp;</span> <span title="PaleGoldenrod" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% PaleGoldenrod;">&nbsp;&nbsp;</span> <span title="PaleTurquoise" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% PaleTurquoise;">&nbsp;&nbsp;</span> <span title="Pink" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Pink;">&nbsp;&nbsp;</span> <span title="LightPink" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightPink;">&nbsp;&nbsp;</span> <span title="Silver" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Silver;">&nbsp;&nbsp;</span> <span title="LightCoral" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightCoral;">&nbsp;&nbsp;</span> <span title="Salmon" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Salmon;">&nbsp;&nbsp;</span> <span title="LightSalmon" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightSalmon;">&nbsp;&nbsp;</span> <span title="BurlyWood" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% BurlyWood;">&nbsp;&nbsp;</span> <span title="Khaki" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Khaki;">&nbsp;&nbsp;</span> <span title="LightGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightGreen;">&nbsp;&nbsp;</span> <span title="PaleGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% PaleGreen;">&nbsp;&nbsp;</span> <span title="Aquamarine" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Aquamarine;">&nbsp;&nbsp;</span> <span title="PowderBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% PowderBlue;">&nbsp;&nbsp;</span> <span title="LightBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightBlue;">&nbsp;&nbsp;</span> <span title="SkyBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SkyBlue;">&nbsp;&nbsp;</span> <span title="LightSkyBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightSkyBlue;">&nbsp;&nbsp;</span> <span title="LightSteelBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightSteelBlue;">&nbsp;&nbsp;</span> <span title="Thistle" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Thistle;">&nbsp;&nbsp;</span> <span title="Plum" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Plum;">&nbsp;&nbsp;</span> <span title="Violet" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Violet;">&nbsp;&nbsp;</span> <span title="HotPink" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% HotPink;">&nbsp;&nbsp;</span> <span title="DarkGray" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkGray;">&nbsp;&nbsp;</span> <span title="DarkGrey" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkGrey;">!!</span> <span title="RosyBrown" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% RosyBrown;">&nbsp;&nbsp;</span> <span title="Tomato" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Tomato;">&nbsp;&nbsp;</span> <span title="DarkSalmon" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkSalmon;">&nbsp;&nbsp;</span> <span title="Coral" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Coral;">&nbsp;&nbsp;</span> <span title="SandyBrown" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SandyBrown;">&nbsp;&nbsp;</span> <span title="Tan" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Tan;">&nbsp;&nbsp;</span> <span title="DarkSeaGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkSeaGreen;">&nbsp;&nbsp;</span> <span title="MediumAquamarine" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumAquamarine;">&nbsp;&nbsp;</span> <span title="CornflowerBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% CornflowerBlue;">&nbsp;&nbsp;</span> <span title="MediumSlateBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumSlateBlue;">&nbsp;&nbsp;</span> <span title="MediumPurple" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumPurple;">&nbsp;&nbsp;</span> <span title="Orchid" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Orchid;">&nbsp;&nbsp;</span> <span title="PaleVioletRed" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% PaleVioletRed;">&nbsp;&nbsp;</span> <span title="Gray" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Gray;">&nbsp;&nbsp;</span> <span title="Grey" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Grey;">!!</span> <span title="IndianRed" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% IndianRed;">&nbsp;&nbsp;</span> <span title="Red" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% red;">&nbsp;&nbsp;</span> <span title="OrangeRed" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Orangered;">&nbsp;&nbsp;</span> <span title="Peru" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Peru;">&nbsp;&nbsp;</span> <span title="DarkOrange" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkOrange;">&nbsp;&nbsp;</span> <span title="Orange" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Orange;">&nbsp;&nbsp;</span> <span title="Gold" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% gold;">&nbsp;&nbsp;</span> <span title="DarkKhaki" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% darkkhaki;">&nbsp;&nbsp;</span> <span title="Yellow" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% yellow;">&nbsp;&nbsp;</span> <span title="YellowGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% yellowgreen;">&nbsp;&nbsp;</span> <span title="GreenYellow" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% greenyellow;">&nbsp;&nbsp;</span> <span title="Chartreuse" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Chartreuse;">&nbsp;&nbsp;</span> <span title="LimeGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LimeGreen;">&nbsp;&nbsp;</span> <span title="Lime" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% lime;">&nbsp;&nbsp;</span> <span title="SpringGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SpringGreen;">&nbsp;&nbsp;</span> <span title="Turquoise" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Turquoise;">&nbsp;&nbsp;</span> <span title="MediumTurquoise" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumTurquoise;">&nbsp;&nbsp;</span> <span title="Cyan" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% cyan;">&nbsp;&nbsp;</span> <span title="Aqua" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% aqua;">&nbsp;&nbsp;</span> <span title="CadetBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% CadetBlue;">&nbsp;&nbsp;</span> <span title="DeepSkyBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DeepSkyBlue;">&nbsp;&nbsp;</span> <span title="DodgerBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DodgerBlue;">&nbsp;&nbsp;</span> <span title="LightSlateGray" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightSlateGray;">&nbsp;&nbsp;</span> <span title="LightSlateGrey" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightSlateGrey;">!!</span> <span title="SlateGray" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SlateGray;">&nbsp;&nbsp;</span> <span title="SlateGrey" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SlateGrey;">!!</span> <span title="RoyalBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% RoyalBlue;">&nbsp;&nbsp;</span> <span title="Blue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Blue;">&nbsp;&nbsp;</span> <span title="SlateBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SlateBlue;">&nbsp;&nbsp;</span> <span title="BlueViolet" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% BlueViolet;">&nbsp;&nbsp;</span> <span title="MediumOrchid" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumOrchid;">&nbsp;&nbsp;</span> <span title="Magenta" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% magenta;">&nbsp;&nbsp;</span> <span title="Fuchsia" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% fuchsia;">&nbsp;&nbsp;</span> <span title="DeepPink" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% deeppink;">&nbsp;&nbsp;</span> <span title="DimGray" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% dimgray;">&nbsp;&nbsp;</span> <span title="Brown" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% brown;">&nbsp;&nbsp;</span> <span title="FireBrick" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% FireBrick;">&nbsp;&nbsp;</span> <span title="Sienna" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Sienna;">&nbsp;&nbsp;</span> <span title="Chocolate" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Chocolate;">&nbsp;&nbsp;</span> <span title="Goldenrod" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% Goldenrod;">&nbsp;&nbsp;</span> <span title="LawnGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LawnGreen;">&nbsp;&nbsp;</span> <span title="MediumSeaGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumSeaGreen;">&nbsp;&nbsp;</span> <span title="MediumSpringGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumSpringGreen;">&nbsp;&nbsp;</span> <span title="LightSeaGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% LightSeaGreen;">&nbsp;&nbsp;</span> <span title="DarkTurquoise" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkTurquoise;">&nbsp;&nbsp;</span> <span title="SteelBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SteelBlue;">&nbsp;&nbsp;</span> <span title="MediumBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumBlue;">&nbsp;&nbsp;</span> <span title="DarkOrchid" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkOrchid;">&nbsp;&nbsp;</span> <span title="DarkViolet" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkViolet;">&nbsp;&nbsp;</span> <span title="MediumVioletRed" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MediumVioletRed;">&nbsp;&nbsp;</span> <span title="Crimson" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% crimson;">&nbsp;&nbsp;</span> <span title="SaddleBrown" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SaddleBrown;">&nbsp;&nbsp;</span> <span title="DarkGoldenrod" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% darkGoldenrod;">&nbsp;&nbsp;</span> <span title="OliveDrab" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% OliveDrab;">&nbsp;&nbsp;</span> <span title="DarkOliveGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkOliveGreen;">&nbsp;&nbsp;</span> <span title="ForestGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% ForestGreen;">&nbsp;&nbsp;</span> <span title="SeaGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% SeaGreen;">&nbsp;&nbsp;</span> <span title="DarkSlateBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkSlateBlue;">&nbsp;&nbsp;</span> <span title="DarkRed" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkRed;">&nbsp;&nbsp;</span> <span title="Maroon" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% maroon;">&nbsp;&nbsp;</span> <span title="Olive" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% olive;">&nbsp;&nbsp;</span> <span title="Green" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% green;">&nbsp;&nbsp;</span> <span title="DarkSlateGray" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkSlateGray;">&nbsp;&nbsp;</span> <span title="DarkSlateGrey" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkSlateGrey;">!!</span> <span title="DarkCyan" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkCyan;">&nbsp;&nbsp;</span> <span title="Teal" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% teal;">&nbsp;&nbsp;</span> <span title="MidnightBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% MidnightBlue;">&nbsp;&nbsp;</span> <span title="DarkBlue" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkBlue;">&nbsp;&nbsp;</span> <span title="Navy" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% navy;">&nbsp;&nbsp;</span> <span title="Indigo" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% indigo;">&nbsp;&nbsp;</span> <span title="DarkMagenta" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkMagenta;">&nbsp;&nbsp;</span> <span title="Purple" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% purple;">&nbsp;&nbsp;</span> <span title="DarkGreen" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% DarkGreen;">&nbsp;&nbsp;</span> <span title="Black" style="border-style: solid; border-color: -moz-use-text-color; border-width: 1px 0pt 0pt 1px; background: none repeat scroll 0% 0% black;">&nbsp;&nbsp;</span></p>
<p>事实上我个人更倾向于在某些时候使用颜色关键词来代码颜色编码，原因在于关键词更适合于人类阅读。在<a href="http://www.w3.org/TR/css3-color/#svg-color" class="link_external">W3C Color Module</a>详细地罗列了所有的颜色关键词，以及它们所分别对应的十六进位和十进位编码。他们有很好的浏览器兼容性，<strong>唯一值得注意的是，灰色在 IE8 之前的版本中使用的是 gray 表示，所以与灰色相关的颜色关键词在 IE6/7 稍有不同，它们在上面色块中以两个惊叹号标识出来。</strong></p>
<h3>currentColor 关键字</h3>
<p>currentColor 用来表示与当前元素的 color 属性相同的值，当然这个 color 属性可以使被继承下来的，下面是一个例子：</p>
<pre class="sh_xml sh_sourceCode">
	&lt;div style=&quot; color : darkred &quot; &gt;
		I&#039;m dark red.
		&lt;div style=&quot; border-top:3px solid currentcolor; &quot;&gt;
			My border top is dark red, too.
		&lt;/div&gt;
	&lt;/div&gt;
</pre>
	<div style="color:darkred;margin-bottom:20px">
		I'm dark red.
		<div style="border-top:3px solid currentcolor;">
			My border top is dark red, too.
		</div>
	</div>
<h3>transparent 关键字</h3>
<p><strong>使用 transparent 表示完全透明</strong>，在 CSS1 中，它只能在 background 属性中使用，CSS2中，添加到了 border 属性，而在 CSS3 中，transparent 能够在任何可以写颜色的属性中被使用。</p>
<h3>使用 RGB 色彩模式</h3>
<p><strong>以 RGB 标记颜色，即描述一个颜色中红色R，绿色G，蓝色B 的强度值</strong>。当使用这种模式表示颜色时，有以下2种方式可选：<br /><strong>1. 十六进制标记法</strong><br /><strong>2.函数式标记法</strong></p>
<p>当使用十六进制标记法的时候，可以采用简写的方式，同时该方法对大小写不敏感，下面的几个例子定义的都是完全相同的颜色。</p>
<pre class="sh_css sh_sourceCode">
element {
     color : #f03;
     color : #F03;
     color : #ff0033;
     color : #FF0033;
}
</pre>
<p>在函数式标记法中，可以使用十进制整数或者百分比来表示，但是主要注意的是，两者不能混用，例如在用百分比表示一组颜色，那么请使用0%来代替0</p>
<pre class="sh_css sh_sourceCode">
element {
    color : rgb(255,0,51);
    color : rgb(255, 0, 51);
    color : rgb(100%, 0%, 20%);
    color : rgb(100%, 0, 20%);  /* 错误的写法，整数和百分比方式不能混用*/
}
</pre>
<h3>RGBa</h3>
<p>RGBa 是扩展了 alpha 通道，即扩展了透明度的 RGB 色彩模式，其中的 a 定义了该颜色的透明度。下面的代码标记了一个元素的 color 属性为透明度是 10 的红色。</p>
<pre class="sh_css sh_sourceCode">
element {
     color : rgba(255,0,0,0.1);
}
</pre>
<h3>使用 HSL 色彩模式</h3>
<p>HSL 是完全不同于 RGB 的色彩模式，H -> hue, S -> saturation, L -> lum 分别描述的一个颜色的色调，饱和度，明度，正因为如此，HSL 与 RGB 相比，它的优势在于，人们可以大致的猜测这个颜色的情况。H 代表了一个色环上的一个角度，这个色环从红色开始，最后再回到红色，所以 0 和 360 都代表了红色，而 S 和 L 都是用百分比来表示，这不难理解。</p>
<pre class="sh_css sh_sourceCode">
element {
     hsl(30, 100%,50%);
}
</pre>
<h3>HSLa</h3>
<p>与 RGBa 相同，HSLa 是在 HSL 模式上扩展了对透明度的支持。</p>
<pre class="sh_css sh_sourceCode">
element {
    hsla(240,100%,50%, 0.4);
}
</pre>
<h3>浏览器兼容性</h3>
<p>到目前为止，你也许发现了，上面所列举的一些内容在实施到某些浏览器中不会产生任何效果。事实上，关于色彩这一模块，在不同的浏览器中存在着较大的差异，特别是 IE 家族。下面的表格列举了不同的值在不同浏览器（核心）与不同版本的兼容情况。</p>
<table class="standard-table">
<tbody> <tr> <th>Browser</th> <th><code>#RRGGBB</code></th> <th><code>rgb</code></th> <th><code>hsl</code></th> <th><code>rgba</code></th> <th><code>hsla</code></th> <th><code>currentColor</code></th> <th><code>transparent</code></th> </tr> <tr> <td>IE</td> <td>3.0</td> <td>4.0</td> <td>---</td> <td>---</td> <td>---</td> <td>---</td> <td>[*]</td> </tr> <tr> <td>Gecko</td> <td>1.0</td> <td>1.0</td> <td>1.5</td> <td>1.9</td> <td>1.9</td> <td>1.8</td> <td>1.9</td> </tr> <tr> <td>Opera</td> <td>3.5</td> <td>3.5</td> <td>9.5</td> <td>10.0</td> <td>10.0</td> <td>9.5</td> <td>10.0</td> </tr> <tr> <td>WebKit</td> <td>85</td> <td>85</td> <td>525</td> <td>525</td> <td>525</td> <td>528</td> <td>525</td> </tr> </tbody>
</table>
<p>[*]  IE 7-8 的 transparent 属性只能被应用于 background 和 border 属性</p>
<p>更多资料：<a href="http://www.w3.org/TR/css3-color/" class="link_external">W3C --- CSS Color Module Level 3</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/css/color-value.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>修改历史：History 详解</title>
		<link>http://www.jsmix.com/html5/introduction-to-history.html</link>
		<comments>http://www.jsmix.com/html5/introduction-to-history.html#comments</comments>
		<pubDate>Wed, 17 Nov 2010 06:49:55 +0000</pubDate>
		<dc:creator>坚强的小展</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.jsmix.com/?p=1884</guid>
		<description><![CDATA[Ajax 为人之所诟病的一个地方便是状态无法被添加到历史记录中，这意味着用户不能像常规方式一样通过浏览器提供的“前进”和“后退”按钮回退或前进到某一个状态。值得庆幸的是，在 HTML5 的规范中，History 对象被改造得足够强大，并提供了丰富的接口，这次的改变使得开发者可以自由地向 History 中插入、修改状态。目前这些接口在 Chrome, Safari 以及 Firefox 4 中已经得到了完整的支持。在这篇文章中，我们将对 History 对象进行全面的了解。 首先有必要来回顾一下我们已经熟悉的有关 History 的操作，它们主要包括：back(), forward(), and go(index) 这三个方法。 退回到上一个页面： window.history.back(); 前进到下一个页面： window.history.forward(); 以当前页面为基准，向前、向后跳转： window.history.go(1); 另外，History 对象的 length 属性，保存了当前历史记录的条数： window.history.length; pushState 和 replaceState 在 W3C 的 History 接口规范中，新引入了 pushState 和 replaceState 方法，这两个方法，使得向历史记录主动添加和修改条目成为了现实。pushState 用于向 history 添加当前页面的记录，而 replaceState 和 pushState 的用法完全一样，唯一的区别就是它用于修改当前页面在 history 中的记录，所以在详细的了解 pushState [...]]]></description>
			<content:encoded><![CDATA[<p id="post-header">Ajax 为人之所诟病的一个地方便是状态无法被添加到历史记录中，这意味着用户不能像常规方式一样通过浏览器提供的“前进”和“后退”按钮回退或前进到某一个状态。值得庆幸的是，在 HTML5 的规范中，History 对象被改造得足够强大，并提供了丰富的接口，这次的改变使得开发者可以自由地向 History 中插入、修改状态。目前这些接口在 Chrome, Safari 以及 Firefox 4 中已经得到了完整的支持。在这篇文章中，我们将对 History 对象进行全面的了解。</p>
<p>首先有必要来回顾一下我们已经熟悉的有关 History 的操作，它们主要包括：back(), forward(), and go(index) 这三个方法。</p>
<h6>退回到上一个页面：</h6>
<pre class="sh_javascript sh_sourceCode">
    window.history.back();
</pre><span id="more-1884"></span>
<h6>前进到下一个页面：</h6>
<pre class="sh_javascript sh_sourceCode">
    window.history.forward();
</pre>
<h6>以当前页面为基准，向前、向后跳转：</h6>
<pre class="sh_javascript sh_sourceCode">
    window.history.go(1);
</pre>
<p>另外，History 对象的 length 属性，保存了当前历史记录的条数：</p>
<pre class="sh_javascript sh_sourceCode">
    window.history.length;
</pre>
<h3>pushState 和 replaceState</h3>
<p>在 W3C 的 History 接口规范中，新引入了 <strong>pushState</strong> 和 <strong>replaceState</strong> 方法，这两个方法，使得向历史记录主动添加和修改条目成为了现实。pushState 用于向 history <strong>添加</strong>当前页面的记录，而 replaceState 和 pushState 的用法完全一样，唯一的区别就是它用于<strong>修改</strong>当前页面在 history 中的记录，所以在详细的了解 pushState 方法后，将不再赘述关于 replaceState 的具体情况。</p>
<p>pushState 接受三个参数，它们分别是，一个 <strong>state 对象</strong>，<strong>标题</strong>，以及 <strong>URL</strong> ，其中 URL 为可选参数，标题暂时被浏览器忽略而未作处理，为防止今后浏览器做出修改，将标题传递为空字符串是安全的做法。这里的 state 是一个 JavaScript 对象，它用以存储关于你所要插入到历史记录的条目的相关信息。事实上，在 Firefox4 中，该对象的大小被限制在 640k 之内，如果需要存储更多的数据，请使用 <a href="http://www.jsmix.com/html5/sessionstorage.html">sessionStorage</a> 或者 <a href="http://www.jsmix.com/html5/localstorage.html">localStorage</a></p>
<pre class="sh_javascript sh_sourceCode">
    var stateObj = {
        user : &quot;Peter&quot;,
        age : 30
    };
    history.pushState(stateObj, &quot;&quot;, &quot;sample.html&quot;);
</pre>
<p>点击下面这个按钮，将向 history 插入当前页面的记录，注意此时地址栏和后退按钮的变化。</p>
<p><input type="button" value=" Push State " id="push" /></p>
<p><strong>PS.</strong>值得注意的是，pushState 所带来地址栏的变化，不会触发 hash 的跳转效果，哪怕是新的地址仅仅是在旧的地址后面追加了 hash 值。另外，参数 url 可以是任何地址，外部的，甚至是不存在的，浏览器不会在 push 的时候去检查这个链接，它所做的仅仅是将这个地址添加到历史记录中。</p>]]></content:encoded>
			<wfw:commentRss>http://www.jsmix.com/html5/introduction-to-history.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

