<?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>刘钢 - 我是UED &#187; 前端</title>
	<atom:link href="http://www.iamued.com/tag/%e5%89%8d%e7%ab%af/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iamued.com</link>
	<description>http://www.IamUED.com</description>
	<lastBuildDate>Wed, 28 Jul 2010 12:58:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>太NB了：Google Docs Ctrl + C 技术浅析</title>
		<link>http://www.iamued.com/qianduan/1612.html</link>
		<comments>http://www.iamued.com/qianduan/1612.html#comments</comments>
		<pubDate>Tue, 27 Jul 2010 09:52:29 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[复制]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1612</guid>
		<description><![CDATA[从玉伯那里转来的，Goole非常NB
用 google docs 打开 pdf 文件，选中文本：

表面上没有任何有趣的地方。但仔细一看，会发现选区的颜色是浅蓝色，而不是默认蓝。第一直觉是是有什么特殊的 CSS 属性，立马 firebug:

不看不知道，一看真蹊跷。selection-highlight 是选区，选区下面是一张图片 page-image!
于是立刻发现一个非常牛逼的特性：Ctrl + C 可以复制图片中的文字！
google 太强悍了，好在前端代码都是开源的，下面简单分析下。
首先数据在哪呢，这个比较容易找到，在 firebug 里有一个请求返回的数据如下：
&#60;?xml version="1.0" encoding="UTF-8"?&#62;

&#60;pdf2xml&#62;
&#60;meta name="Creator" content="Adobe Acrobat 8.1 Combine Files"/&#62;
&#60;meta name="Producer" content="Adobe Acrobat 8.1"/&#62;
&#60;meta name="CreationDate" content="20100316080708-04'00'"/&#62;
&#60;page t="0" l="0" w="612" h="773"&#62;
 &#60;text l="188" t="754" w="237" h="11" p="188,24,214,15,232,37,271,
7,280,39,322,7,330,11,344,24,370,23,395,20,418,7"&#62;
Please post comments or corrections to the Author Online forum at&#60;/text&#62;
...
有了这份数据，就可以根据选区得到对应的文本。
接下来的问题是，如何将文本放到剪贴板里？第一反应是用 flash 实现，但感觉 google 不会这么做。禁用掉 flash [...]]]></description>
			<content:encoded><![CDATA[<p>从<a href="http://lifesinger.org/blog/2010/07/goog-docs-copy-tech/">玉伯</a>那里转来的，Goole非常NB<br />
用 google docs 打开 pdf 文件，选中文本：<br />
<img src="http://www.iamued.com/wp-content/uploads/auto_save_image/2010/07/175239CWS.png" alt="" width="429" height="171" /></p>
<p>表面上没有任何有趣的地方。但仔细一看，会发现选区的颜色是浅蓝色，而不是默认蓝。第一直觉是是有什么特殊的 CSS 属性，立马 firebug:<br />
<img src="http://www.iamued.com/wp-content/uploads/auto_save_image/2010/07/175243Tbx.png" alt="" width="526" height="324" /></p>
<p>不看不知道，一看真蹊跷。<code>selection-highlight</code> 是选区，选区下面是一张图片 <code>page-image</code>!<br />
于是立刻发现一个非常牛逼的特性：<strong><code>Ctrl + C</code> 可以复制图片中的文字！</strong></p>
<p>google 太强悍了，好在前端代码都是开源的，下面简单分析下。</p>
<p>首先数据在哪呢，这个比较容易找到，在 firebug 里有一个请求返回的数据如下：</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;pdf2xml&gt;
&lt;meta name="Creator" content="Adobe Acrobat 8.1 Combine Files"/&gt;
&lt;meta name="Producer" content="Adobe Acrobat 8.1"/&gt;
&lt;meta name="CreationDate" content="20100316080708-04'00'"/&gt;
&lt;page t="0" l="0" w="612" h="773"&gt;
 &lt;text l="188" t="754" w="237" h="11" p="188,24,214,15,232,37,271,
7,280,39,322,7,330,11,344,24,370,23,395,20,418,7"&gt;
Please post comments or corrections to the Author Online forum at&lt;/text&gt;
...</pre>
<p>有了这份数据，就可以根据选区得到对应的文本。</p>
<p>接下来的问题是，如何将文本放到剪贴板里？第一反应是用 flash 实现，但感觉 google 不会这么做。禁用掉 flash 插件后，功能正常，这说明是用 js 实现的。</p>
<p>通过 Profile 工具 + Fiddler + 肉眼识别 + 运气，终于定位到了关键代码：</p>
<pre>n.am = function(a) {
    if (! (!this.k.Ca &amp;&amp; Mr(this, a))) {
        ac &amp;&amp; this.lf.focus();
        this.lf.select();
        Nr(this, a)
    }
};</pre>
<p>只要注释掉上面的代码，<code>Ctrl + C</code> 复制功能就无效。<code>focus</code> 和 <code>select</code> 为我们提供了进一步线索，在 HTML 里，发现了秘密：<br />
<img src="http://www.iamued.com/wp-content/uploads/auto_save_image/2010/07/175246JOL.png" alt="" width="514" height="50" /></p>
<p>到此真相大白：当用户按下 <code>Ctrl + C</code> 时，js 会注入事件，首先根据坐标从数据里取出对应文本，然后将文本赋值给 textarea, 并将其激活和选中。这样，就和用户选中 textarea 的内容，再按下 <code>Ctrl + C</code> 的效果是一样了。</p>
<p>强悍的 google, 技术创新无处不在！</p>
<p>注意：利用 textarea 只能复制纯文本，如果想复制富文本，可以借鉴 google docs 编辑 Word 文档时的处理方式：采用 iframe 充当临时容器，有兴趣的可以进一步研究。</p>
<p>简单演示：<a href="http://lifesinger.github.com/lab/2010/goog-docs-copy-demo.html">goog-docs-copy-demo.html</a></p>
<p>发现这个秘密后，最近在疯狂搞编辑的牛人<a href="http://yiminghe.javaeye.com/">承玉</a>（欢迎搞编辑器的其他牛人加盟）立刻想到了各大站长们非常喜爱的功能：<a href="http://yiminghe.javaeye.com/blog/722264">附带警告信息的禁止copy</a>. 据说，能成功复制的，都不是“人”。</p>
<p>我的尝试是：点击按钮，复制指定文本到 Clipboard 里。应用场景是点击按钮复制证件号码等。尝试代码大家可以看上面 demo 页面源码中的注释。事件可以正常模拟并分发出去，但复制操作惨兮兮地失败了。感觉原因在于浏览器安全限制，对于触发的异步 <code>Ctrl + C</code>, 浏览器会限制其功能。</p>
<p>Google 的产品里有很多秘密，真诱人，创意无限！</p>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1382.html" title="即拷即用动画函数：透明度渐变、位置移动、尺寸变化">即拷即用动画函数：透明度渐变、位置移动、尺寸变化</a></li><li><a href="http://www.iamued.com/qianduan/1010.html" title="[原创]用JS控制显示子菜单个数 自动下拉">[原创]用JS控制显示子菜单个数 自动下拉</a></li><li><a href="http://www.iamued.com/qianduan/600.html" title="offsetLeft and offsetTop gives wrong coords in IE ">offsetLeft and offsetTop gives wrong coords in IE </a></li><li><a href="http://www.iamued.com/qianduan/1450.html" title="讨论闭包传入参数：window &#038; undefined">讨论闭包传入参数：window &#038; undefined</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1612.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>判断 iframe 是否加载完成的完美方法</title>
		<link>http://www.iamued.com/qianduan/1486.html</link>
		<comments>http://www.iamued.com/qianduan/1486.html#comments</comments>
		<pubDate>Tue, 22 Jun 2010 02:51:57 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[iframe加载]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1486</guid>
		<description><![CDATA[今天正好需要判断iframe加载完成 正好找到怿飞同学的这篇文章 方法很完美

var iframe = document.createElement(&#34;iframe&#34;);
iframe.src = &#34;http://www.planabc.net&#34;;

if (!/*@cc_on!@*/0) { //if not IE
    iframe.onload = function(){
        alert(&#34;Local iframe is now loaded.&#34;);
    };
} else {
    iframe.onreadystatechange = function(){
        if (iframe.readyState == &#34;complete&#34;){
            alert(&#34;Local iframe is now loaded.&#34;);
        }
    [...]]]></description>
			<content:encoded><![CDATA[<p>今天正好需要判断iframe加载完成 正好找到<a rel="about" href="http://www.planabc.net/about/">怿飞</a>同学的这篇文章 方法很完美</p>
<pre class="brush: jscript;">
var iframe = document.createElement(&quot;iframe&quot;);
iframe.src = &quot;http://www.planabc.net&quot;;

if (!/*@cc_on!@*/0) { //if not IE
    iframe.onload = function(){
        alert(&quot;Local iframe is now loaded.&quot;);
    };
} else {
    iframe.onreadystatechange = function(){
        if (iframe.readyState == &quot;complete&quot;){
            alert(&quot;Local iframe is now loaded.&quot;);
        }
    };
}

document.body.appendChild(iframe);
</pre>
<p>最近， <a title="NCZOnline" href="http://www.nczonline.net/" target="_blank">Nicholas C. Zakas</a> 文章<a title="Iframes, onload, and document.domain" href="http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/" target="_blank">《Iframes, onload, and document.domain》</a>的评论中 Christopher 提供了一个新的判断方法（很完美）：</p>
<pre class="brush: jscript;">
var iframe = document.createElement(&quot;iframe&quot;);
iframe.src = &quot;http://www.planabc.net&quot;;

if (iframe.attachEvent){
    iframe.attachEvent(&quot;onload&quot;, function(){
        alert(&quot;Local iframe is now loaded.&quot;);
    });
} else {
    iframe.onload = function(){
        alert(&quot;Local iframe is now loaded.&quot;);
    };
}

document.body.appendChild(iframe);
</pre>
<p>几点补充说明：</p>
<ol>
<li><a title="onload Event (BODY, FRAME, FRAMESET, ...)&lt;br /&gt;" href="http://msdn.microsoft.com/en-us/library/cc197055(VS.85).aspx" target="_blank">IE 支持 iframe 的 onload 事件</a>，不过是隐形的，需要通过 attachEvent 来注册。</li>
<li>第二种方法比第一种方法更完美，因为 readystatechange 事件相对于 load 事件有一些潜在的问题。</li>
</ol>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1382.html" title="即拷即用动画函数：透明度渐变、位置移动、尺寸变化">即拷即用动画函数：透明度渐变、位置移动、尺寸变化</a></li><li><a href="http://www.iamued.com/qianduan/1010.html" title="[原创]用JS控制显示子菜单个数 自动下拉">[原创]用JS控制显示子菜单个数 自动下拉</a></li><li><a href="http://www.iamued.com/qianduan/600.html" title="offsetLeft and offsetTop gives wrong coords in IE ">offsetLeft and offsetTop gives wrong coords in IE </a></li><li><a href="http://www.iamued.com/qianduan/1450.html" title="讨论闭包传入参数：window &#038; undefined">讨论闭包传入参数：window &#038; undefined</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1486.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>即拷即用动画函数：透明度渐变、位置移动、尺寸变化</title>
		<link>http://www.iamued.com/qianduan/1382.html</link>
		<comments>http://www.iamued.com/qianduan/1382.html#comments</comments>
		<pubDate>Wed, 31 Mar 2010 02:31:22 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[位置]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[动画函数]]></category>
		<category><![CDATA[尺寸]]></category>
		<category><![CDATA[透明度]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1382</guid>
		<description><![CDATA[首先感谢一下 51js的 abeet 同学 给我们提取出这么简洁的函数
和大家分享一下吧 查看Demo
这三个函数适用于以下情况
1、在做前端页面时，只需要简单的动画效果，不想引入整个动画类，使用本函数。
2、在写js类时，需要用到简单的动画，为了降低藕合性，使用本函数。
使用方法如下：

var fade = function(element, transparency, speed, callback){……}
透明度渐变：transparency:透明度 0(全透)-100(不透)；speed:速度1-100，默认为1
例&#60;input onclick=&#34;fade('testDiv', 40)&#34; type=&#34;button&#34; value=&#34;透明度变化&#34; /&#62;

var move = function(element, position, speed, callback){……}
//移动到指定位置，position:移动到指定left及top 格式{left:120, top:340}或{left:120}或{top:340}；speed:速度 1-100，默认为10
例&#60;input onclick=&#34;move('testDiv', {top:400})&#34; type=&#34;button&#34; value=&#34;垂直移动&#34; /&#62;

var resize = function(element, size, speed, callback){……}
//长宽渐变：size:要改变到的尺寸 格式 {width:400, height:250}或{width:400}或{height:250}；speed:速度 1-100，默认为10
例&#60;input onclick=&#34;resize('testDiv', {height:300})&#34; type=&#34;button&#34; value=&#34;改变高度&#34; /&#62;

核心代码分析
1、获取一个元素的透明度
如果是IE浏览器，则攻取最终样式的滤镜filter的值，再通过正则表达式获取到透明度滤镜alpha的值，如果不存在透明度滤镜值，则透明度为100。
如果是非IE浏览器，那么可以获取最终样式的opacity属性，

function getOpacity(elem){
var alpha;
if(navigator.userAgent.toLowerCase().indexOf('msie') != -1){
alpha=elem.currentStyle.filter.indexOf(&#34;opacity=&#34;) &#38;gt;= 0?(parseFloat( elem.currentStyle.filter.match(/opacity=([^)]*)/)[1] )) [...]]]></description>
			<content:encoded><![CDATA[<p>首先感谢一下 51js的 abeet 同学 给我们提取出这么简洁的函数<br />
和大家分享一下吧 <a href="http://www.iamued.com/demo/AmFun/Amfun.htm" target="_blank">查看Demo</a><br />
<strong>这三个函数适用于以下情况<br />
</strong>1、在做前端页面时，只需要简单的动画效果，不想引入整个动画类，使用本函数。<br />
2、在写js类时，需要用到简单的动画，为了降低藕合性，使用本函数。</p>
<p>使用方法如下：</p>
<pre class="brush: jscript;">
var fade = function(element, transparency, speed, callback){……}
透明度渐变：transparency:透明度 0(全透)-100(不透)；speed:速度1-100，默认为1
例&lt;input onclick=&quot;fade('testDiv', 40)&quot; type=&quot;button&quot; value=&quot;透明度变化&quot; /&gt;

var move = function(element, position, speed, callback){……}
//移动到指定位置，position:移动到指定left及top 格式{left:120, top:340}或{left:120}或{top:340}；speed:速度 1-100，默认为10
例&lt;input onclick=&quot;move('testDiv', {top:400})&quot; type=&quot;button&quot; value=&quot;垂直移动&quot; /&gt;

var resize = function(element, size, speed, callback){……}
//长宽渐变：size:要改变到的尺寸 格式 {width:400, height:250}或{width:400}或{height:250}；speed:速度 1-100，默认为10
例&lt;input onclick=&quot;resize('testDiv', {height:300})&quot; type=&quot;button&quot; value=&quot;改变高度&quot; /&gt;
</pre>
<p><strong>核心代码分析<br />
1、获取一个元素的透明度</strong><br />
如果是IE浏览器，则攻取最终样式的滤镜filter的值，再通过正则表达式获取到透明度滤镜alpha的值，如果不存在透明度滤镜值，则透明度为100。<br />
如果是非IE浏览器，那么可以获取最终样式的opacity属性，</p>
<pre class="brush: jscript;">
function getOpacity(elem){
var alpha;
if(navigator.userAgent.toLowerCase().indexOf('msie') != -1){
alpha=elem.currentStyle.filter.indexOf(&quot;opacity=&quot;) &amp;gt;= 0?(parseFloat( elem.currentStyle.filter.match(/opacity=([^)]*)/)[1] )) + '':
'100';
}else{
alpha=100*elem.ownerDocument.defaultView.getComputedStyle(elem,null)['opacity'];
}
return alpha;
};
</pre>
<p><strong>2、设置透明度</strong><br />
这个就简单了，不用管浏览器，通通的设置opacity及filter，<br />
element.style.opacity = start / 100;<br />
element.style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;;<br />
实际上这儿我偷了个懒，真正无懈可击的写法，应该是判断一下是否IE浏览器，因为在一些情况下可能使用多个滤镜，这时应该用正则替换alpha滤镜的值，而不是直接设置style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;;</p>
<p><strong>3、element.offsetWidth、element.offsetHeight与element.style.width、element.style.height的关系</strong><br />
只有在IE的border-content式盒模型情况下，这两个值才是相等的，即elementoffsetWidth==element.style.width+element.style.paddingLeft+element.style.paddingRight+element.style.borderLeftWidth+element.style.borderRightWidth<br />
而我认为border-content式盒模型是符合修改元素尺寸时的心理预期的，对非border-content式盒模型情况下要作一个尺寸的修正。<br />
在其它情况下应该对该值加以修正</p>
<pre class="brush: jscript;">
if(!(navigator.userAgent.toLowerCase().indexOf('msie') != -1&amp;&amp;document.compatMode == 'BackCompat')){
//除了ie下border-content式盒模型情况外，需要对size加以修正
var CStyle=document.defaultView?document.defaultView.getComputedStyle(element,null):element.currentStyle;
if(typeof(size.width)=='number'){
size.width=size.width-CStyle.paddingLeft.replace(/D/g,'')-CStyle.paddingRight.replace(/D/g,'');
}
if(typeof(size.height)=='number'){
size.height=size.height-CStyle.paddingTop.replace(/D/g,'')-CStyle.paddingBottom.replace(/D/g,'');
}
}
</pre>
<p>有人认为以上的修正中默认了padding值的单位是px并且为整数，是不对的，<br />
实际上经由我在ie及firefox下的测试，引用最终样式的padding值，必然是整数，并以px为单位。</p>
<p><strong>4、关于把三个函数合并成一个通用动画函数</strong><br />
以上三个函数的主要逻辑都是一样的：<br />
通过setInterval每隔一定时间修改元素的style属性，以达到动画效果。<br />
所以，把三个函数合并成一个函数是可以的<br />
只是需要在修改特定的属性时出于兼容性，必须作些处理，<br />
因为不同的属性其值类型及单位不一样，不同浏览器下也有区别<br />
如透明度 在非ie下为小数，在ie下是一个特别的滤镜设置<br />
如颜色 一般是用16进制，并有#号前缀<br />
预计这个通用的动画函数的参数会有点多，接口类下<br />
function animator(element, interval, start, end, style, speed, tmp, callback){……}<br />
说明<br />
function animator(元素或元素ID, 计时器句柄,起始值,目标值,需修改的属性, 步进值(增量),值转换过滤方法(用于修改非普通递增递减形的数据，比如16进制颜色递增、前缀符号后缀单位修正), 回调函数)<br />
function animator(&#8216;testdiv&#8217;,'bgcolor&#8217;,'#336699&#8242;,&#8217;#aabbcc&#8217;,'backgroundColor&#8217;,2,changeColor,callback)<br />
颜色修改方法示例（仅供参考，未测试）</p>
<pre class="brush: jscript;">
changeColor=function(start,end,speed){
var _10to16 = function(color){
function tmp(index){
var tmp = color[index].toString(16);
return tmp.length == 1 ? &quot;0&quot; + tmp : tmp;
};
return &quot;#&quot; + tmp(0) + tmp(1) + tmp(2);
};
var x16to10 = function(color){
if(!/^#[0-9A-Fa-f]{3,6}$/i.test(color))retun color;
function tmp(index){
return color.charAt(index);
};
color = color.substring(1);
if(color.length == 3)
color = tmp(0) + tmp(0) + tmp(1) + tmp(1) + tmp(2) + tmp(2);
return [parseInt(tmp(0) + tmp(1), 16), parseInt(tmp(2) + tmp(3), 16), parseInt(tmp(4) + tmp(5), 16)];
};
var color = x16to10(start),
var end = x16to10(end),
var index = 3;
while(index--)
color[index] = color[index] &lt; end[index] ? min(color[index] + speed, end[index]) : max(color[index] - speed, end[index]);
reutn color;
}
</pre>
<p>原文见：<a href="http://bbs.51js.com/viewthread.php?tid=86901">http://bbs.51js.com/viewthread.php?tid=86901</a></p>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1010.html" title="[原创]用JS控制显示子菜单个数 自动下拉">[原创]用JS控制显示子菜单个数 自动下拉</a></li><li><a href="http://www.iamued.com/qianduan/600.html" title="offsetLeft and offsetTop gives wrong coords in IE ">offsetLeft and offsetTop gives wrong coords in IE </a></li><li><a href="http://www.iamued.com/qianduan/1450.html" title="讨论闭包传入参数：window &#038; undefined">讨论闭包传入参数：window &#038; undefined</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1382.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>第六期WEB标准化交流会 会后总结 By 刘钢</title>
		<link>http://www.iamued.com/qianduan/1369.html</link>
		<comments>http://www.iamued.com/qianduan/1369.html#comments</comments>
		<pubDate>Sat, 27 Mar 2010 19:49:43 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[页面实现]]></category>
		<category><![CDATA[W3Ctech]]></category>
		<category><![CDATA[交流]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[总结]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1369</guid>
		<description><![CDATA[今天去参加了第六期WEB标准化交流会，重复下话题：前端开发在研发流程中与其他岗位协作效率的提升 做个小总结 
先感谢一下北京腾讯给我们提供了场地，水，和公仔，今天听了很多“大虾”们的分享，感受颇深
就说一下小公司前端开发在研发中如何更好的协作吧 
今天会议上几个突出的词：“流程”，“沟通”，“专业“，“吃饭喝酒”：） 
那我就分别说一下自己的见解
1.“流程”，存在即是合理的，社会所必须承受的，就像高房价一样，很多时候“流程”被我们吹捧的就像一个神一样，貌似能解决一切问题，而实际上我认为，流程只是一个比较虚的东西，什么是流程？就是一种大家认可的协作方式，在中小企业里我认为无流程就是最好的流程 
2.“沟通”，为什么沟通？怎样沟通？今天腾讯的页面组leader说得好：“沟通就是情商，情商会从你的绩效考评里反映出来”，什么意思呢？也就是“强制沟通”，我认同这个观点，有效的沟通能够大大提升我们的效率，以及信息不对称等问题，我也希望所有的前端朋友们，一定要学会使用“沟通”这个武器，很多时候他能解决你技能所解决不了的问题 
3.“专业”，专业是什么？kejun兄补充的好-“专业就是饭碗”，我们要提升自身专业度，在研发流程中承担更多的职能，现在有多少公司里，后端不做一些“前端”的活呢？这也可能目前前端开发是“解耦”的最好途径 
4.“吃饭喝酒”，同事间朋友间，需要有一些私下的沟通与了解，适当的有些活动，能够在工作配合上更加的顺畅，当然了吃饭喝酒只是其中之一，更多的在轻松地环境下交流交流，增进一下友谊,本次讨论会后聚餐共16人哦：） 
kejun在最后公布了之前出的html面试题的答案 有兴趣的 移步这里
http://www.iamued.com/qianduan/1373.html
最后借用一张崔凯发的合影结尾吧：） 
您可能还关注的？第四期 WEB标准化交流会 参会总结太NB了：Google Docs Ctrl + C 技术浅析WEB标准化交流会第九期：前端工程师的知识收集与管理判断 iframe 是否加载完成的完美方法WEB标准化交流会第七期-人人都是&#8221;架构&#8221;师]]></description>
			<content:encoded><![CDATA[<p>今天去参加了第六期<a href="http://www.w3ctech.com">WEB标准化交流会</a>，重复下话题：<strong>前端开发在研发流程中与其他岗位协作效率的提升 做个小总结</strong> </p>
<p>先感谢一下<a href="http://www.qq.com">北京腾讯</a>给我们提供了场地，水，和公仔，今天听了很多“大虾”们的分享，感受颇深<br />
就说一下小公司前端开发在研发中如何更好的协作吧 </p>
<p>今天会议上几个突出的词：“<strong>流程</strong>”，“<strong>沟通</strong>”，“<strong>专业</strong>“，“<strong>吃饭喝酒</strong>”：） </p>
<p>那我就分别说一下自己的见解<br />
1.“<strong>流程</strong>”，存在即是合理的，社会所必须承受的，就像高房价一样，很多时候“流程”被我们吹捧的就像一个神一样，貌似能解决一切问题，而实际上我认为，流程只是一个比较虚的东西，什么是流程？就是一种大家认可的协作方式，在中小企业里我认为无流程就是最好的流程 </p>
<p>2.“<strong>沟通</strong>”，为什么沟通？怎样沟通？今天腾讯的页面组leader说得好：“沟通就是情商，情商会从你的绩效考评里反映出来”，什么意思呢？也就是“强制沟通”，我认同这个观点，有效的沟通能够大大提升我们的效率，以及信息不对称等问题，我也希望所有的前端朋友们，一定要学会使用“沟通”这个武器，很多时候他能解决你技能所解决不了的问题 </p>
<p>3.“<strong>专业</strong>”，专业是什么？<a href="http://www.hikejun.com">kejun</a>兄补充的好-“<strong>专业就是饭碗</strong>”，我们要提升自身专业度，在研发流程中承担更多的职能，现在有多少公司里，后端不做一些“前端”的活呢？这也可能目前前端开发是“<strong>解耦</strong>”的最好途径 </p>
<p>4.“<strong>吃饭喝酒</strong>”，同事间朋友间，需要有一些私下的沟通与了解，适当的有些活动，能够在工作配合上更加的顺畅，当然了吃饭喝酒只是其中之一，更多的在轻松地环境下交流交流，增进一下友谊,<strong><span style="color: #ff0000;">本次讨论会后聚餐共16人哦：）</span></strong> </p>
<p><strong><span style="color: #ff0000;"><a href="http://www.iamued.com/qianduan/1373.html">kejun在最后公布了之前出的html面试题的答案 有兴趣的 移步这里</a><br />
<a href="http://www.iamued.com/qianduan/1373.html">http://www.iamued.com/qianduan/1373.html</a></span></strong></p>
<p><strong><span style="color: #ff0000;">最后借用一张<a href="http://www.uicss.cn">崔凯</a>发的合影结尾吧：）</span></strong> </p>
<div id="attachment_1371" class="wp-caption alignleft" style="width: 310px"><a href="http://www.iamued.com/wp-content/uploads/2010/03/DSC_0175.jpg" target="_blank"><img class="size-medium wp-image-1371   " title="点击放大" src="http://www.iamued.com/wp-content/uploads/2010/03/DSC_0175-300x144.jpg" alt="" width="300" height="144" /></a><p class="wp-caption-text">第六期WEB标准化交流会合影{点击放大}</p></div>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1251.html" title="第四期 WEB标准化交流会 参会总结">第四期 WEB标准化交流会 参会总结</a></li><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1492.html" title="WEB标准化交流会第九期：前端工程师的知识收集与管理">WEB标准化交流会第九期：前端工程师的知识收集与管理</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1434.html" title="WEB标准化交流会第七期-人人都是&#8221;架构&#8221;师">WEB标准化交流会第七期-人人都是&#8221;架构&#8221;师</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1369.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>kejun的HTML面试题答案揭晓</title>
		<link>http://www.iamued.com/qianduan/1373.html</link>
		<comments>http://www.iamued.com/qianduan/1373.html#comments</comments>
		<pubDate>Sat, 27 Mar 2010 19:47:11 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[页面实现]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[交流会]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[面试题]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1373</guid>
		<description><![CDATA[有这么一段HTML，请挑毛病：
&#60;P&#62;&#38;nbsp;&#38;nbsp;哥写的不是HTML，是寂寞。&#60;br&#62;&#60;br&#62;&#38;nbsp;&#38;nbsp;我说：&#60;br&#62;不要迷恋哥，哥只是一个传说
这是原来雅虎一道笔试题（文字变了变），用了很多年了，还没有一个人完全答对过。
下周（3.27）交流会上我会公布答案  点击查看第六期WEB标准化交流会 总结
＝＝＝＝＝＝＝＝＝＝＝＝＝＝ 解答部分 ================
出这道题的动机是，太多人觉得HTML太简单，但它恰恰又是前端开发中最基础最重要的部分。HTML结构设计的合不合理，直接影响到代码易不易维护，灵不灵活，同时事关网页性能，协作效率。碰到不少人认为前端开发就是javascript开发，大错特错啊。javascript, html, css这三个前端开发的基础支柱，性质完全不同又紧密关联，对它们的正确理解，合理应用是专业与非专业的区别。有些后端工程师可以写出很漂亮的JS，但他们真的不懂怎么合理的把js, html, css结合起来应用。对html的准确把握，不像学一般的编程语言那样，而是建立在丰富实践经验和体会的基础上，是前端的工程师的基本功。
这不是一道较真题或是装逼题，正经一道“画鸡蛋”的题（引自http://twitter.com/RageCarrier/status/10712084993）考的是基本功。代码如其人，对一行代码的理解足以反映出他的前端开发素养。
言归正传。这道题的考点：
考点1：html和 xhtml的区别
这行代码在html 4.01 strict下是完全正确的，在xhtml 1.0 strict下是错误一堆的。所以明显是一个考点。在xhtml下所有标签是闭合的，p,br需要闭合, 标签不允许大写，P要小写。同时nbsp和br必须包含在容器里。html下这些都不是错。p在html里是可选闭合标签，是可以不用闭合的。
这个考点告诉你xhtml是多么苛刻。这是基本考点，答对，你能拿到60分。
考点2：考样式分离
用nbsp控制缩进是不合理的。应该用CSS干这事。所以应该删掉nbsp
考点3：合理使用标签
br是强制折行标签，p是段落。原题用连续的br制造两个段落的效果，效果是达到了，但显然用的不合理，段落间距后期无法再控制。正确的做法是用两个p表现两个段落。“我说”后面是正常的文字折行用br是合理的。
上面全答对，你就能拿到100分。
对原题改进的结果：
html 4.01:
&#60;p&#62;哥写的不是HTML，是寂寞。&#60;p&#62;我说：&#60;br&#62; 不要迷恋哥，哥只是一个传说
xhtml 1.0:
&#60;p&#62;哥写的不是HTML，是寂寞。&#60;/p&#62;&#60;p&#62;我说：&#60;br /&#62; 不要迷恋哥，哥只是一个传说&#60;/p&#62;
加分：合理的用语义化标签
在前面的基础上合理的用语义化标签，对内容进行必要的标记，是加分的。但过度的使用标签，就画蛇添足了。如“我说”的话，可以用q标签标注。
&#60;p&#62;哥写的不是HTML，是寂寞。
&#60;p&#62;我说：&#60;br&#62; &#60;q&#62;不要迷恋哥，哥只是一个传说&#60;/q&#62;
我觉得这就够了，如果再进一步，“我”用cite标注，“HTML” 用abbr或acronym标注（至于再讨论abbr和acronym的区别就太较真了），也OK。再复杂就没必要了。
&#60;p&#62; 哥写的不是&#60;abbr title=”Hyper Text Markup Language”&#62;HTML&#60;/abbr&#62;，是寂寞。
&#60;p&#62;&#60;cite&#62; 我&#60;/cite&#62;说：&#60;br&#62; &#60;q&#62;不要迷恋哥，哥只是一个传说&#60;/q&#62;
转自kejun的blog：http://hikejun.com/blog/?p=548
您可能还关注的？太NB了：Google Docs Ctrl + C 技术浅析6-27 互联网那点事聚会—北京站判断 iframe 是否加载完成的完美方法即拷即用动画函数：透明度渐变、位置移动、尺寸变化第六期WEB标准化交流会 会后总结 By 刘钢]]></description>
			<content:encoded><![CDATA[<p><strong>有这么一段HTML，请挑毛病：</strong></p>
<p>&lt;P&gt;&amp;nbsp;&amp;nbsp;哥写的不是HTML，是寂寞。&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;我说：&lt;br&gt;不要迷恋哥，哥只是一个传说</p>
<p>这是原来雅虎一道笔试题（文字变了变），用了很多年了，还没有一个人完全答对过。<br />
下周（3.27）交流会上我会公布答案<span style="text-decoration: underline;"><span style="color: #810081;">  点击查看第六期WEB标准化交流会 总结</span></span></p>
<p><strong>＝＝＝＝＝＝＝＝＝＝＝＝＝＝ 解答部分 ================</strong></p>
<p>出这道题的动机是，太多人觉得HTML太简单，但它恰恰又是前端开发中最基础最重要的部分。HTML结构设计的合不合理，直接影响到代码易不易维护，灵不灵活，同时事关网页性能，协作效率。碰到不少人认为前端开发就是javascript开发，大错特错啊。javascript, html, css这三个前端开发的基础支柱，性质完全不同又紧密关联，对它们的正确理解，合理应用是专业与非专业的区别。有些后端工程师可以写出很漂亮的JS，但他们真的不懂怎么合理的把js, html, css结合起来应用。对html的准确把握，不像学一般的编程语言那样，而是建立在丰富实践经验和体会的基础上，是前端的工程师的基本功。</p>
<p>这不是一道较真题或是装逼题，正经一道“画鸡蛋”的题（引自<a href="http://twitter.com/RageCarrier/status/10712084993">http://twitter.com/RageCarrier/status/10712084993</a>）考的是基本功。代码如其人，对一行代码的理解足以反映出他的前端开发素养。</p>
<p>言归正传。这道题的考点：</p>
<p><strong>考点1：html和 xhtml的区别</strong><br />
这行代码在html 4.01 strict下是完全正确的，在xhtml 1.0 strict下是错误一堆的。所以明显是一个考点。在xhtml下所有标签是闭合的，p,br需要闭合, 标签不允许大写，P要小写。同时nbsp和br必须包含在容器里。html下这些都不是错。p在html里是可选闭合标签，是可以不用闭合的。</p>
<p>这个考点告诉你xhtml是多么苛刻。这是基本考点，答对，你能拿到60分。</p>
<p><strong>考点2：考样式分离<br />
</strong>用nbsp控制缩进是不合理的。应该用CSS干这事。所以应该删掉nbsp</p>
<p><strong>考点3：合理使用标签</strong><br />
br是强制折行标签，p是段落。原题用连续的br制造两个段落的效果，效果是达到了，但显然用的不合理，段落间距后期无法再控制。正确的做法是用两个p表现两个段落。“我说”后面是正常的文字折行用br是合理的。</p>
<p>上面全答对，你就能拿到100分。</p>
<p><strong>对原题改进的结果：</strong><br />
<span style="color: #ff0000;">html 4.01:<br />
&lt;p&gt;哥写的不是HTML，是寂寞。&lt;p&gt;我说：&lt;br&gt; 不要迷恋哥，哥只是一个传说</span></p>
<p><span style="color: #008000;">xhtml 1.0:<br />
&lt;p&gt;哥写的不是HTML，是寂寞。&lt;/p&gt;&lt;p&gt;我说：&lt;br /&gt; 不要迷恋哥，哥只是一个传说&lt;/p&gt;</span></p>
<p><strong>加分：合理的用语义化标签</strong><br />
在前面的基础上合理的用语义化标签，对内容进行必要的标记，是加分的。但过度的使用标签，就画蛇添足了。如“我说”的话，可以用q标签标注。</p>
<p><span style="color: #008000;">&lt;p&gt;哥写的不是HTML，是寂寞。<br />
&lt;p&gt;我说：&lt;br&gt; &lt;q&gt;不要迷恋哥，哥只是一个传说&lt;/q&gt;</span></p>
<p>我觉得这就够了，如果再进一步，“我”用cite标注，“HTML” 用abbr或acronym标注（至于再讨论abbr和acronym的区别就太较真了），也OK。再复杂就没必要了。</p>
<p><span style="color: #333399;">&lt;p&gt; 哥写的不是&lt;abbr title=”Hyper Text Markup Language”&gt;HTML&lt;/abbr&gt;，是寂寞。<br />
&lt;p&gt;&lt;cite&gt; 我&lt;/cite&gt;说：&lt;br&gt; &lt;q&gt;不要迷恋哥，哥只是一个传说&lt;/q&gt;</span></p>
<p>转自kejun的blog：<a href="http://hikejun.com/blog/?p=548">http://hikejun.com/blog/?p=548</a></p>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/product/1501.html" title="6-27 互联网那点事聚会—北京站">6-27 互联网那点事聚会—北京站</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1382.html" title="即拷即用动画函数：透明度渐变、位置移动、尺寸变化">即拷即用动画函数：透明度渐变、位置移动、尺寸变化</a></li><li><a href="http://www.iamued.com/qianduan/1369.html" title="第六期WEB标准化交流会 会后总结 By 刘钢">第六期WEB标准化交流会 会后总结 By 刘钢</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1373.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>第四期 WEB标准化交流会 参会总结</title>
		<link>http://www.iamued.com/qianduan/1251.html</link>
		<comments>http://www.iamued.com/qianduan/1251.html#comments</comments>
		<pubDate>Sun, 31 Jan 2010 08:10:14 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[页面实现]]></category>
		<category><![CDATA[W3Ctech]]></category>
		<category><![CDATA[交流]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1251</guid>
		<description><![CDATA[昨天参加了第四期 WEB标准化交流会 将收获总结下
讨论会地点是在Sina的一号会议室 感谢sina的友情赞助 到场的嘉宾还有 豆瓣：张克军 百度：月影 新浪：赵立元 和火狐中国的同学
这是我第一次参加这个会议 貌似目前前端的会议也不是很多 昨天对于W3CTech会议还有一个重要的意义 就是北京 上海 广州 三个地方同时在开 也象征着 前端工程师的规模 和地位 越发的重要了,也更期待着下次的会议 与大家一起交流~共同进步
说说具体的吧：昨天的话题分为2个阶段 1.javascript 2.html5+CSS3
总结一下：
第一个阶段 由几位嘉宾先讲了一下 我听得有些糊涂 可能昨天的话题范围太广了 不过收益颇深
我比较统一kejun的观点 无论自己写的js库，第三方的库，主要都是从那几方面入手
1.DOM标准 提供一些标准的DOM操作功能[event,选择器,等等……]
2.ajax支持，FX（一些效果）支持
3.通用的一些widgets
那么现在我们所缺乏的 也就是JS的组织 与管理 ;月影讲的百度有啊在写的js库 也是更多的像这方面靠拢
[YUI3 已经有一些依赖机制 等方便我们管理自己的JS]
第二个阶段：可能HTML5+CSS3离我们真的很近 但是离用户却有些远的原因吧 话题交集在浏览器上面了
目前IE系列浏览器没有对HTML5和CSS3的支持 而在目前的情况 IE的市场占有率确实&#62;50%的
所以话题最终结论可想而知
1.针对自己所处的行业与用户群来适当的进行一些尝试
2.可以用渐进增强的方式 为高级浏览器用户 提供更好的体验
3.作为专业的前端工程师 我们必须去学习与研究新的技术
再上几句会议上经典的：
你该换家公司为中国互联网做贡献了！
前端工程师的价值不在于切页面,也不在于极快地切页面
你用IE6！你全家都用IE6！
用IE收手续费 用其他浏览器优惠！
前端不可以挣钱　但可以省钱！
您可能还关注的？第六期WEB标准化交流会 会后总结 By 刘钢太NB了：Google Docs Ctrl + C 技术浅析WEB标准化交流会第九期：前端工程师的知识收集与管理判断 iframe 是否加载完成的完美方法WEB标准化交流会第七期-人人都是&#8221;架构&#8221;师]]></description>
			<content:encoded><![CDATA[<p><span>昨天参加了第四期 <a href="http://www.w3ctech.com/">WEB标准化交流会 </a>将收获总结下<br />
</span>讨论会地点是在Sina的一号会议室 感谢sina的友情赞助 到场的嘉宾还有 豆瓣：<a href="http://hikejun.com">张克军</a> 百度：<a href="http://www.silverna.org/blog/">月影</a> 新浪：赵立元 和火狐中国的同学<br />
这是我第一次参加这个会议 貌似目前前端的会议也不是很多 昨天对于W3CTech会议还有一个重要的意义 就是北京 上海 广州 三个地方同时在开 也象征着 前端工程师的规模 和地位 越发的重要了,也更期待着下次的会议 与大家一起交流~共同进步</p>
<p>说说具体的吧：昨天的话题分为2个阶段 1.javascript 2.html5+CSS3</p>
<p>总结一下：<br />
<strong>第一个阶段</strong> 由几位嘉宾先讲了一下 我听得有些糊涂 可能昨天的话题范围太广了 不过收益颇深<br />
我比较统一kejun的观点 无论自己写的js库，第三方的库，主要都是从那几方面入手<br />
1.DOM标准 提供一些标准的DOM操作功能[event,选择器,等等……]<br />
2.ajax支持，FX（一些效果）支持<br />
3.通用的一些widgets<br />
那么现在我们所缺乏的 也就是JS的组织 与管理 ;月影讲的百度有啊在写的js库 也是更多的像这方面靠拢<br />
[YUI3 已经有一些依赖机制 等方便我们管理自己的JS]</p>
<p><strong>第二个阶段：</strong>可能HTML5+CSS3离我们真的很近 但是离用户却有些远的原因吧 话题交集在浏览器上面了</p>
<p>目前IE系列浏览器没有对HTML5和CSS3的支持 而在目前的情况 IE的市场占有率确实&gt;50%的<br />
所以话题最终结论可想而知<br />
1.针对自己所处的行业与用户群来适当的进行一些尝试<br />
2.可以用渐进增强的方式 为高级浏览器用户 提供更好的体验<br />
3.作为专业的前端工程师 我们必须去学习与研究新的技术</p>
<p><strong>再上几句会议上经典的：</strong><br />
你该换家公司为中国互联网做贡献了！<br />
前端工程师的价值不在于切页面,也不在于极快地切页面<br />
你用IE6！你全家都用IE6！<br />
用IE收手续费 用其他浏览器优惠！<br />
前端不可以挣钱　但可以省钱！</p>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1369.html" title="第六期WEB标准化交流会 会后总结 By 刘钢">第六期WEB标准化交流会 会后总结 By 刘钢</a></li><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1492.html" title="WEB标准化交流会第九期：前端工程师的知识收集与管理">WEB标准化交流会第九期：前端工程师的知识收集与管理</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1434.html" title="WEB标准化交流会第七期-人人都是&#8221;架构&#8221;师">WEB标准化交流会第七期-人人都是&#8221;架构&#8221;师</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1251.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Zen Coding初体验 确实爽</title>
		<link>http://www.iamued.com/qianduan/1246.html</link>
		<comments>http://www.iamued.com/qianduan/1246.html#comments</comments>
		<pubDate>Thu, 28 Jan 2010 12:21:33 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[页面实现]]></category>
		<category><![CDATA[zen coding]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[工具]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1246</guid>
		<description><![CDATA[一直听说Zen Coding 最近一直在研究前端最合适的IDE 所以也索性尝试了一下
ZenCoding项目地址：http://code.google.com/p/zen-coding/
先说环境 我是在MyEclipse &#62; aptana 下面安装的Zen Coding
安装方法不难 建立一个项目 新建一个文件夹叫 script 然后把Zen Coding拷贝进去就可以了
Aptana/Eclipse
由于Aptana本身就是基于Eclipse的，所以，Zen  Coding也是支持Eclipse的，只是需要一个EclipseMonkey插件的支持，Aptana已经封装了这个插件，所以如果你使用 Aptana，下面的第一步可以跳过。

通过更新网站安装EclipseMonkey: http://download.eclipse.org/technology/dash/update(如 果你使用Aptana，可跳过这一步)
在你的当前工作去创建一个顶级的项目，给它命名，比如，就叫zencoding
在新创建的项目中创建scripts文件夹
解压缩下载的ZIP插件包到该文件夹。项目结构看起来就像这样:
安装之后，Aptana的菜单栏中的“脚本(Script)”菜单中将会出现Zen coding相关子菜单

注意事项：

Aptana版的官方插件是基于MAC机的，如果你用的是Windows，需要手动更改快捷键(在每个文件头部的注释片段中更改)
官方的文件编码有点儿乱，修改官方js的时候，请注意编码问题，修改不当会造成相关功能的丢失

试用了一下发现确实很爽
具体的看下面介绍

做一个简单的Demo
html:xxs
div#header&#62;div#logo.left+ul#menu&#62;li*5&#62;a

两行代码下去 生成的结果

&#60;/p&#62;
&#60;p&#62;&#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.1//EN&#34; &#34;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&#34;&#62;&#60;/p&#62;
&#60;p&#62;&#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34; xml:lang=&#34;en&#34;&#62;&#60;/p&#62;
&#60;p&#62;&#60;head&#62;&#60;/p&#62;
&#60;p&#62;	&#60;title&#62;&#60;/title&#62;&#60;/p&#62;
&#60;p&#62;	&#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html;charset=UTF-8&#34; /&#62;&#60;/p&#62;
&#60;p&#62;&#60;/head&#62;&#60;/p&#62;
&#60;p&#62;&#60;body&#62;&#60;/p&#62;
&#60;div id=&#34;header&#34;&#62;
&#60;div id=&#34;logo&#34; class=&#34;left&#34;&#62;&#60;/div&#62;
&#60;ul id=&#34;menu&#34;&#62;
&#60;li&#62;&#60;a href=&#34;&#34;&#62;&#60;/a&#62;&#60;/li&#62;
&#60;li&#62;&#60;a href=&#34;&#34;&#62;&#60;/a&#62;&#60;/li&#62;
&#60;li&#62;&#60;a href=&#34;&#34;&#62;&#60;/a&#62;&#60;/li&#62;
&#60;li&#62;&#60;a href=&#34;&#34;&#62;&#60;/a&#62;&#60;/li&#62;
&#60;li&#62;&#60;a href=&#34;&#34;&#62;&#60;/a&#62;&#60;/li&#62;
&#60;/ul&#62;
&#60;/div&#62;
&#60;p&#62;&#60;/body&#62;&#60;/p&#62;
&#60;p&#62;&#60;/html&#62;&#60;/p&#62;
&#60;p&#62;

方便快捷 下面介绍一下选择符用法
这里是一个支持的属性和操作符的列表：
    * E
      元素名称(div, p);
   [...]]]></description>
			<content:encoded><![CDATA[<p>一直听说Zen Coding 最近一直在研究前端最合适的IDE 所以也索性尝试了一下</p>
<p>ZenCoding项目地址：http://code.google.com/p/zen-coding/</p>
<p>先说环境 我是在MyEclipse &gt; aptana 下面安装的Zen Coding</p>
<p>安装方法不难 建立一个项目 新建一个文件夹叫 script 然后把Zen Coding拷贝进去就可以了</p>
<h4>Aptana/Eclipse</h4>
<p>由于Aptana本身就是基于Eclipse的，所以，Zen  Coding也是支持Eclipse的，只是需要一个EclipseMonkey插件的支持，Aptana已经封装了这个插件，所以如果你使用 Aptana，下面的第一步可以跳过。</p>
<ol>
<li>通过更新网站安装EclipseMonkey: <a rel="nofollow" href="http://download.eclipse.org/technology/dash/update">http://download.eclipse.org/technology/dash/update</a>(如 果你使用Aptana，可跳过这一步)</li>
<li>在你的当前工作去创建一个顶级的项目，给它命名，比如，就叫<strong>zencoding</strong></li>
<li>在新创建的项目中创建<strong>scripts</strong>文件夹</li>
<li>解压缩下载的ZIP插件包到该文件夹。项目结构看起来就像这样:<img src="http://www.iamued.com/wp-content/uploads/auto_save_image/2010/01/094710Plh.png" alt="" /></li>
<li>安装之后，Aptana的菜单栏中的“脚本(Script)”菜单中将会出现Zen coding相关子菜单</li>
</ol>
<p>注意事项：</p>
<ul>
<li>Aptana版的官方插件是基于MAC机的，如果你用的是Windows，需要手动更改快捷键(在每个文件头部的注释片段中更改)</li>
<li>官方的文件编码有点儿乱，修改官方js的时候，请注意<strong>编码问题</strong>，修改不当会造成相关功能的丢失</li>
</ul>
<p><strong>试用了一下发现确实很爽</strong></p>
<p>具体的看下面介绍</p>
<p><span id="more-1246"></span></p>
<p>做一个简单的Demo</p>
<blockquote><p>html:xxs</p>
<p>div#header&gt;div#logo.left+ul#menu&gt;li*5&gt;a</p>
</blockquote>
<p>两行代码下去 生成的结果</p>
<p>
<pre class="brush: jscript;">&lt;/p&gt;
&lt;p&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;head&gt;&lt;/p&gt;
&lt;p&gt;	&lt;title&gt;&lt;/title&gt;&lt;/p&gt;
&lt;p&gt;	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=UTF-8&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/head&gt;&lt;/p&gt;
&lt;p&gt;&lt;body&gt;&lt;/p&gt;
&lt;div id=&quot;header&quot;&gt;
&lt;div id=&quot;logo&quot; class=&quot;left&quot;&gt;&lt;/div&gt;
&lt;ul id=&quot;menu&quot;&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/body&gt;&lt;/p&gt;
&lt;p&gt;&lt;/html&gt;&lt;/p&gt;
&lt;p&gt;</pre>
</p>
<p>方便快捷 下面介绍一下选择符用法</p>
<p>这里是一个支持的属性和操作符的列表：</p>
<p>    * E</p>
<p>      元素名称(div, p);</p>
<p>    * E#id</p>
<p>      使用id的元素(div#content, p#intro, span#error);</p>
<p>    * E.class</p>
<p>      使用类的元素(div.header, p.error.critial). 你也可以联合使用class和idID: div#content.column.width;</p>
<p>    * E>N</p>
<p>      子代元素(div>p, div#footer>p>span);</p>
<p>    * E+N</p>
<p>      兄弟元素(h1+p, div#header+div#content+div#footer);</p>
<p>    * E*N</p>
<p>      元素倍增(ul#nav>li*5>a);</p>
<p>    * E$*N</p>
<p>      条目编号 (ul#nav>li.item-$*5);</p>
<p>具体的还要等我用熟了再给大家介绍了</p>
<p>本文部分内容转自互联网</p>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1382.html" title="即拷即用动画函数：透明度渐变、位置移动、尺寸变化">即拷即用动画函数：透明度渐变、位置移动、尺寸变化</a></li><li><a href="http://www.iamued.com/qianduan/1369.html" title="第六期WEB标准化交流会 会后总结 By 刘钢">第六期WEB标准化交流会 会后总结 By 刘钢</a></li><li><a href="http://www.iamued.com/qianduan/1373.html" title="kejun的HTML面试题答案揭晓">kejun的HTML面试题答案揭晓</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1246.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jquery1.4正式版发布了 JS库时代就是这样快</title>
		<link>http://www.iamued.com/qianduan/1180.html</link>
		<comments>http://www.iamued.com/qianduan/1180.html#comments</comments>
		<pubDate>Sat, 16 Jan 2010 09:32:18 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[JS库]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1180</guid>
		<description><![CDATA[记得前几天看了D2的视频 kejun兄讲的库时代和框架时代 让我感同身受 因为我所做的项目用的是Jq库 不知不觉的一个个插件让页面的已经一大排了~
所带来的另一个问题 是库的升级问题 公司目前的项目貌似有用jquery1.2.6的 有用jquery1.3.2的 还没有完全的更新到新版
这不是Jquery1.4又出来了么 看了一下新版的API还是不错的 New or Changed in 1.4 部分 点击查看
vfresh兄弟已经写了一个新版的概述 我就直接转载过来了

修改内容：

.add() 支持 .add( selector, context ) 方式
以下增加支持处理function方式：.addClass() .after() .before() .append() .css() .html() .prepend() .removeAttr() .removeClass() .replaceWith() .text() .toggleClass() .val() .wrap() .wrapAll() .wrapInner()
.bind() 支持批量绑定事件
.closest()支持第二个参数(筛选元素的容器)，优化效率。用法：.closest( selector, [ context ] )
.data() 支持批量设值 $('body').data({one: 1, two: 2});
.index() 如果无参数，则返回在它兄弟级元素集合中的索引值；并支持使用选择器(selector)过滤
jQuery() 如果无参数，会返回一个空的数组（旧版本返回document）
用 jQuery() 创建DOM时，可以使用第二个参数来设置属性值、绑定事件 查看示例
.offset() [...]]]></description>
			<content:encoded><![CDATA[<p>记得前几天看了D2的视频 <a href="http://hikejun.com">kejun</a>兄讲的库时代和框架时代 让我感同身受 因为我所做的项目用的是Jq库 不知不觉的一个个插件让页面的<script src=" "></script>已经一大排了~<br />
所带来的另一个问题 是库的升级问题 公司目前的项目貌似有用jquery1.2.6的 有用jquery1.3.2的 还没有完全的更新到新版<br />
这不是<a href="http://jquery14.com">Jquery1.4</a>又出来了么 看了一下新版的<a href="http://jquery14.com/pre-release-1/new-jquery-api-site">API</a>还是不错的 New or Changed in 1.4 部分 <a href="http://api.jquery.com/category/version/1.4/">点击查看</a></p>
<p><a href="http://www.vfresh.org/">vfresh</a>兄弟已经写了一个新版的概述 我就直接转载过来了<br />
<span id="more-1180"></span></p>
<h2>修改内容：</h2>
<ol>
<li><code>.add()</code> 支持 <code>.add( selector, context )</code> 方式</li>
<li>以下增加支持处理function方式：<code>.addClass()</code> .<code>after()</code> <code>.before()</code> <code>.append()</code> <code>.css()</code> <code>.html()</code> <code>.prepend()</code> <code>.removeAttr()</code> <code>.removeClass()</code> <code>.replaceWith()</code> <code>.text()</code> <code>.toggleClass()</code> <code>.val()</code> <code>.wrap()</code> <code>.wrapAll()</code> <code>.wrapInner()</code></li>
<li><code>.bind()</code> 支持批量绑定事件</li>
<li><code>.closest()</code>支持第二个参数(筛选元素的容器)，优化效率。用法：<code>.closest( selector, [ context ] )</code></li>
<li><code>.data()</code> 支持批量设值 <code>$('body').data({one: 1, two: 2});</code></li>
<li><code>.index()</code> 如果无参数，则返回在它兄弟级元素集合中的索引值；并支持使用选择器(selector)过滤</li>
<li><code>jQuery()</code> 如果无参数，会返回一个空的数组（旧版本返回document）<br />
用 <code>jQuery()</code> 创建DOM时，可以使用第二个参数来设置属性值、绑定事件 <a href="http://api.jquery.com/jQuery/#entry-examples">查看示例</a></li>
<li><code>.offset()</code> 新增功能可以直接设置元素相对于document的坐标，并支持function参数</li>
<li><code>jQuery.param()</code> 第二个参数(布尔值)，可以设定是否进行URI编码</li>
</ol>
<h2>新增内容：</h2>
<ol>
<li><code>.clearQueue()</code> 清除.queue()生成的队列，如无参数将清除fx中的队列；类似于.stop(true)</li>
<li><code>jQuery.contains()</code> 检测是元素否包含目标</li>
<pre class="brush: jscript;">
jQuery.contains(document.documentElement, document.body); // true
jQuery.contains(document.body, document.documentElement); // false
</pre>
<li><code>.delay()</code> 延迟执行队列</li>
<pre class="brush: xml;">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;style&gt;
div { width: 60px; height: 60px; float: left; }
.first { background-color: #3f3; }
.second { background-color: #33f;}
&lt;/style&gt;
  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;p&gt;&lt;button&gt;Run&lt;/button&gt;&lt;/p&gt;
&lt;div class=&quot;first&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;second&quot;&gt;&lt;/div&gt;

&lt;script&gt;
    $(&quot;button&quot;).click(function() {
      $(&quot;div.first&quot;).slideUp(300).delay(800).fadeIn(400);
      $(&quot;div.second&quot;).slideUp(300).fadeIn(400);
    });
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<li><code>.detach()</code> 返回从元素数组中移除的匹配元素。</li>
<li><code>.focusin()</code> 是.bind(‘focusin’, handler)的简写方式。</li>
<li><code>.focusout()</code> 是.bind(‘focusout’, handler)的简写方式。</li>
<li><code>.has()</code> 筛选出包含有指定元素的集合</li>
<pre class="brush: xml;">
&lt;div id=&quot;a&quot;&gt;&lt;strong&gt;这个会被选中&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;b&quot;&gt;这个选不中&lt;/div&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
	$('div').has('strong').css('color','red');
	&lt;/script&gt;
</pre>
<li><code>jQuery.isEmptyObject()</code> 检测对象是否为空值</li>
<pre class="brush: xml;">
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: &quot;bar&quot; }) // false
</pre>
<li><code>jQuery.isPlainObject( object )</code> 检测是否为pain object</li>
<pre class="brush: xml;">
jQuery.isPlainObject({});	//true
	jQuery.isPlainObject('{}');	//false
</pre>
<li><code>.nextUntil([ selector ])</code> 查找当前元素之后到selector(参数)之间的同辈元素</li>
<pre class="brush: xml;">
&lt;div id=&quot;a1&quot;&gt;3232323&lt;/div&gt;
&lt;div id=&quot;a&quot;&gt;&lt;strong&gt;这个会被选中&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;b&quot;&gt;这个选不中&lt;/div&gt;
&lt;div id=&quot;c&quot;&gt;ccc&lt;/div&gt;
&lt;div id=&quot;d&quot;&gt;ccc&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$('#a').nextUntil('#d');	//取得[#b,#c]
&lt;/script&gt;
</pre>
<li><code>.prevUntil([ selector ])</code> 查找当前元素之前到selector(参数)之间的同辈元素</li>
<li><code>.parentsUntil( [ selector ] )</code> 取得一个包含着所有匹配元素的祖先元素（直到找到selector截止）的元素集合</li>
<li><code>jQuery.noop</code> 空函数，当想定义一个空函数时可以用这个。</li>
<li><code>.toArray()</code> 取得所有匹配的 DOM 元素集合，有点类似于.get()</li>
<li><code>.unwrap()</code> 移除匹配元素的父级</li>
</ol>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1176.html" title="YUI3设计中的激进和妥协">YUI3设计中的激进和妥协</a></li><li><a href="http://www.iamued.com/qianduan/545.html" title="转：评论jQuery是魔鬼还是天使？">转：评论jQuery是魔鬼还是天使？</a></li><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1506.html" title="微软的jQuery国际化插件">微软的jQuery国际化插件</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1180.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你需要知道的CSS3 动画技术</title>
		<link>http://www.iamued.com/qianduan/1085.html</link>
		<comments>http://www.iamued.com/qianduan/1085.html#comments</comments>
		<pubDate>Wed, 30 Dec 2009 12:48:13 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[页面实现]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[动画]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1085</guid>
		<description><![CDATA[译序：本文译自Smashingmagazine，但是原文讲述的内容有些浅，也不是很完整，前端观察在翻译的前提下，增加了更多的更系统的内容。如有不足之处，欢迎指正补充。
随着网络的发展，浏览器具有更强的渲染更高级代码的能力，我们正逐步实现跨越所有平台和浏览器的目标。我们不但可以要花费更少的时间来确保我们的盒模型在IE6中看起来正常，而且形成了鼓励创新、避免hack、重前端脚本的氛围。
 
网络是一个非常好的环境，也是一个有丰富的知识来分享的协作社区。我们想要有圆角，我们就实现了它；我们想要多背景图片，我们实现了它；我们想要 边框图片，我们也让它实现了。所以需求从来不是问题，否则，我们可能还都仍然在使用table来布局页面而且使用过多的代码呢。我们都知道，网络无所不能。

为网络而生
CSS 3的属性比如border-radius、box-shadow和 text-shadow在webkit(Safari、Chrome等)和Gecko(Firefox)等先进的浏览器中的使用开始出现增长的势头。它们(这些CSS属性)已经为用户创建更轻量的页面和更丰富的体验，而且它们可以优雅的降级。然而，这些只是CSS 3能为我们做的众多事情中的一小部分。
在本文中，我们将走的更远，看一看 变形(transformation)、转换(transition)和动画(animation)等更高级的CSS3技术。我们将涉及代码本身、浏览器支持以及一些可以正确地展示这些新属性是如何即提升你的设计又增强整体用户体验的例子。
CSS 变形(Transformation)
CSS transformation是W3C的一个草案。但当我第一次坐下来阅读它的全部特性以了解一些东西的时候，它并没有让我感到开窍。你可以想象的到，这个文档是用技术术语的撰写的，而且它更关注变形的图形(比如绘图)元素和矩阵。大一学习微积分之后就没有碰过矩阵了，我必须为本章节做很多好的旧浏览器测试以及猜测和检验。
在看完我能找到的每一个教程和大量的浏览器测试之后，我总结出一些大家都能从中获益的有用的关于CSS变形的信息。
transform
transform属性实现了一些可用SVG实现的同样的功能。它可用于内联(inline)元素和块级(block)元素。它允许我们旋转、缩放和移动元素——只需要一行CSS代码。
一些前卫设计的最大诟病就是文字不可选(必须要使用切图的方法实现)。当你熟练使用transform属性来控制文字的时候，这就不再是问题了，因为这是个纯CSS方法，所以元素内的文字会保持可选。这是CSS相对于使用图片(或背景图片)的一个巨大优势。
一些有趣而有用的变形功能：

rotate
Rotate(旋转)允许你通过传递一个度数值来转动一个对象。
scale
Scale是一个缩放功能，可以让任一元素变的更大。它使用正数和负数以及小数作为参数。
translate
Translate就是基于X和Y 坐标重新定位元素
skew
顾名思义，skew就是要将对象倾斜，参数是度数
matrix
transform支持矩阵变换，就是基于X和Y 坐标重新定位元素

让我们更深入的了解每一个功能吧。
Rotate
transform属性有很多用法，其中一个就是translate(旋转)。translate就是基于角度转动一个对象并可用于内联元素和块级元素，它可以实现很酷的效果。


#nav{
	-webkit-transform: rotate(-90deg);
	-moz-transform: rotate(-90deg);
	-o-transform: rotate(-90deg);
	filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
	}

请注意在IE8中(非标准模式)它需要你写成“-ms-filter”而不是“filter”。
浏览器支持
浏览器对translate的支持令人惊奇的广泛。在上面的CSS片段中，我们直接加上-webkit-和-moz-前缀然后将#nav元素旋转-90度。
相当简单吧？唯一的问题是对于一个相当重要的设计元素，如果IE不支持，很多设计师就会不情愿使用它。
幸运的是，IE有这方面的滤镜:图形旋转滤镜。它可以有4个旋转值：0, 1, 2,和3。你将不会获得和Webkit和Gecko一样的精密控制，但是至少在一定程度上保持统一(甚至IE6)。虽然这个滤镜只支持4个值，显得有些鸡肋，但是对于IE来说，聊胜于无吧。
另外，非常值得一提的是，Opera在前几天发布了Opera 10.50 pre版本，声称支持CSS3 的transition和transform。只是还是需要使用私有属性，也就是要使用前缀 -o-
scale
scale并不像你想象的那样工作：简单的缩小和放大一个元素。缩放功能同时采用宽和高两个值，这些值可以是正数、负数和小数。
正数值放大一个元素，正如你期望的那样，基于指定的宽度和高度。
负数值并不会缩小元素，而是翻转它(比如，文字被反转)然后相应的缩放它。然而，你可以使用小于1的小数(例如.5)来收缩或者缩小一个元素。


#nav {
	/* nav元素的宽和高都会被放大双倍 */
	-webkit-transform: scale(2);
	-moz-transform: scale(2);
	-o-transform: scale(2); }
#nav {
	/* nav元素的宽会是双倍，而高度保持不变 */
	-webkit-transform: scale(2, 1);
	-moz-transform: scale(2, 1);
	-o-transform: scale(2, 1);
	}
#nav {
	/* nav的宽度将是双倍，并且水平翻转，但是高度保持不变 */
	-webkit-transform: scale(-2, 1);
	-moz-transform: scale(-2, 1);
	-o-transform: scale(-2, 1);
	}

浏览器支持
scale属性目前只有Firefox, Safari/Chrome以及 opera 10.50支持，到目前为止没有一个IE版本支持。缩放一个对象是相当有意义的设计选择。它可以通过渐进增强来使用:hover，这可以在你的导航上添加一个小小的趣味。

#nav li a:hover{
	/* 这可以让你的导航链接在鼠标经过的时候轻微的放大 */
	-webkit-transform: scale(1.1);
	-moz-transform: scale(1.1);
	-o-transform: scale(1.1);
	}

translate
这个名称“translate(转化)”有点容易误解。它事实上是一种使用X和Y坐标值定位元素的方法。


#nav{
 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>译序：</strong>本文译自Smashingmagazine，但是原文讲述的内容有些浅，也不是很完整，<a href="http://www.qianduan.net/">前端观察</a>在翻译的前提下，增加了更多的更系统的内容。如有不足之处，欢迎指正补充。</p>
<p>随着网络的发展，浏览器具有更强的渲染更高级代码的能力，我们正逐步实现跨越所有平台和浏览器的目标。我们不但可以要花费更少的时间来确保我们的盒模型在IE6中看起来正常，而且形成了鼓励创新、避免hack、重前端脚本的氛围。</p>
<p><span id="more-11680"> </span></p>
<p>网络是一个非常好的环境，也是一个有丰富的知识来分享的协作社区。我们想要有<a href="http://ragamo.medioclick.com/jquery/corners/">圆角</a>，我们就实现了它；我们想要<a href="http://www.protocoder.com/css/css-multiple-backgrounds-background-layering-with-jquery/">多背景图片</a>，我们实现了它；我们想要<a href="http://www.lrbabe.com/sdoms/borderImage/index.html"> 边框图片</a>，我们也让它实现了。所以需求从来不是问题，否则，我们可能还都仍然在使用table来布局页面而且使用过多的代码呢。我们都知道，网络无所不能。<br />
<span id="more-1085"></span></p>
<h4>为网络而生</h4>
<p>CSS 3的属性比如<a href="http://www.css3.info/preview/rounded-border/">border-radius</a>、<a href="http://www.css3.info/preview/box-shadow/">box-shadow</a>和 <a href="http://www.css3.info/preview/text-shadow/">text-shadow</a>在webkit(Safari、Chrome等)和Gecko(Firefox)等先进的浏览器中的使用开始出现增长的势头。它们(这些CSS属性)已经为用户创建更轻量的页面和更丰富的体验，而且它们可以优雅的降级。然而，这些只是CSS 3能为我们做的众多事情中的一小部分。</p>
<p>在本文中，我们将走的更远，看一看 <strong>变形(transformation)、转换(transition)和动画(animation)</strong>等更高级的CSS3技术。我们将涉及代码本身、浏览器支持以及一些可以正确地展示这些新属性是如何即提升你的设计又增强整体用户体验的例子。</p>
<h3>CSS 变形(Transformation)</h3>
<p>CSS transformation是W3C的一个草案。但当我第一次坐下来阅读<a href="http://www.w3.org/TR/css3-3d-transforms/">它的全部特性</a>以了解一些东西的时候，它并没有让我感到开窍。你可以想象的到，这个文档是用技术术语的撰写的，而且它更关注变形的图形(比如绘图)元素和矩阵。大一学习微积分之后就没有碰过矩阵了，我必须为本章节做很多好的旧浏览器测试以及猜测和检验。</p>
<p>在看完我能找到的每一个教程和大量的浏览器测试之后，我总结出一些大家都能从中获益的有用的关于<strong>CSS变形</strong>的信息。</p>
<h4>transform</h4>
<p>transform属性实现了一些可用<a href="http://www.w3.org/Graphics/SVG/">SVG</a>实现的同样的功能。它可用于内联(inline)元素和块级(block)元素。它允许我们旋转、缩放和移动元素——只需要一行CSS代码。</p>
<p>一些前卫设计的最大诟病就是文字不可选(必须要使用切图的方法实现)。当你熟练使用transform属性来控制文字的时候，这就不再是问题了，因为这是个纯CSS方法，所以元素内的文字会保持可选。这是CSS相对于使用图片(或背景图片)的一个巨大优势。</p>
<p>一些有趣而有用的变形功能：</p>
<ul>
<li><strong>rotate</strong><br />
Rotate(旋转)允许你通过传递一个度数值来转动一个对象。</li>
<li><strong>scale</strong><br />
Scale是一个缩放功能，可以让任一元素变的更大。它使用正数和负数以及小数作为参数。</li>
<li><strong>translate</strong><br />
Translate就是基于X和Y 坐标重新定位元素</li>
<li><strong>skew</strong><br />
顾名思义，skew就是要将对象倾斜，参数是度数</li>
<li><strong>matrix</strong><br />
transform支持矩阵变换，就是基于X和Y 坐标重新定位元素</li>
</ul>
<p>让我们更深入的了解每一个功能吧。</p>
<h4>Rotate</h4>
<p>transform属性有很多用法，其中一个就是<strong>translate(旋转)</strong>。translate就是基于角度转动一个对象并可用于内联元素和块级元素，它可以实现<a href="http://www.csskarma.com/lab/css3/text_rotation.html">很酷的效果</a>。</p>
<p><img src="http://www.iamued.com/wp-content/uploads/auto_save_image/2009/12/204815j9U.png" alt="Transform Rotate in What You Need To Know About Behavioral CSS" /></p>
<pre class="brush: css;">
#nav{
	-webkit-transform: rotate(-90deg);
	-moz-transform: rotate(-90deg);
	-o-transform: rotate(-90deg);
	filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
	}
</pre>
<p>请注意在IE8中(非标准模式)它需要你写成“-ms-filter”而不是“filter”。</p>
<h5>浏览器支持</h5>
<p>浏览器对translate的支持令人惊奇的广泛。在上面的CSS片段中，我们直接加上-webkit-和-moz-前缀然后将#nav元素旋转-90度。</p>
<p>相当简单吧？唯一的问题是对于一个相当重要的设计元素，如果IE不支持，很多设计师就会不情愿使用它。</p>
<p>幸运的是，<strong>IE有这方面的滤镜</strong>:图形旋转滤镜。它可以有4个旋转值：0, 1, 2,和3。你将不会获得和Webkit和Gecko一样的精密控制，但是至少在一定程度上保持统一(甚至IE6)。虽然这个滤镜只支持4个值，显得有些鸡肋，但是对于IE来说，聊胜于无吧。</p>
<p>另外，非常值得一提的是，Opera在前几天发布了Opera 10.50 pre版本，声称支持CSS3 的transition和transform。只是还是需要使用私有属性，也就是要使用前缀 -o-</p>
<h4>scale</h4>
<p>scale并不像你想象的那样工作：简单的缩小和放大一个元素。缩放功能同时采用宽和高两个值，这些值可以是正数、负数和小数。</p>
<p>正数值放大一个元素，正如你期望的那样，基于指定的宽度和高度。</p>
<p>负数值并不会缩小元素，而是翻转它(比如，文字被反转)然后相应的缩放它。然而，你可以使用小于1的小数(例如.5)来收缩或者缩小一个元素。</p>
<p><img src="http://www.iamued.com/wp-content/uploads/auto_save_image/2009/12/204818l82.png" alt="Transform Scale in What You Need To Know About Behavioral CSS" /></p>
<pre class="brush: css;">
#nav {
	/* nav元素的宽和高都会被放大双倍 */
	-webkit-transform: scale(2);
	-moz-transform: scale(2);
	-o-transform: scale(2); }
#nav {
	/* nav元素的宽会是双倍，而高度保持不变 */
	-webkit-transform: scale(2, 1);
	-moz-transform: scale(2, 1);
	-o-transform: scale(2, 1);
	}
#nav {
	/* nav的宽度将是双倍，并且水平翻转，但是高度保持不变 */
	-webkit-transform: scale(-2, 1);
	-moz-transform: scale(-2, 1);
	-o-transform: scale(-2, 1);
	}
</pre>
<h4>浏览器支持</h4>
<p>scale属性目前只有<strong>Firefox, Safari/Chrome以及 opera 10.50</strong>支持，到目前为止没有一个IE版本支持。缩放一个对象是相当有意义的设计选择。它可以通过渐进增强来使用:hover，这可以在你的导航上添加一个小小的趣味。</p>
<pre class="brush: css;">
#nav li a:hover{
	/* 这可以让你的导航链接在鼠标经过的时候轻微的放大 */
	-webkit-transform: scale(1.1);
	-moz-transform: scale(1.1);
	-o-transform: scale(1.1);
	}
</pre>
<h4>translate</h4>
<p>这个名称“translate(转化)”有点容易误解。它事实上是一种<strong>使用X和Y坐标值定位元素</strong>的方法。</p>
<p><img src="http://www.iamued.com/wp-content/uploads/auto_save_image/2009/12/204821HtV.png" alt="Transform Translate in What You Need To Know About Behavioral CSS" /></p>
<pre class="brush: css;">
#nav{
 /* 这会将nav元素向左移动10像素并向下移动20像素 */
 -moz-transform: translate(10px, 20px);
 -webkit-transform: translate(10px, 20px);
 -o-transform: translate(10px, 20px);
}
</pre>
<h4>浏览器支持</h4>
<p>translate属性目前只被<strong>Firefox, Safari/Chrome和Oprea 10.5</strong>支持，而且还要使用浏览器的私有前缀-moz- 和-webkit-。</p>
<h4>Skew</h4>
<p>Skew也是一个很有用的transform功能，它可以将一个对象围绕着x和y轴按照一定的角度倾斜。这和rotate的旋转不一样，rotate只是旋转，而不会让元素的形状改变。skew会让一个元素的形状改变。skew有两个参数，分别代表x和y轴的倾斜<strong>度数</strong>。</p>
<pre class="brush: css;">
#nav{
 /* 这会将nav元素向左移动10像素并向下移动20像素 */
 -moz-transform: skew(30deg, -10deg);
 -webkit-transform: skew(30deg, -10deg);
 -o-transform: skew(30deg, -10deg);
}
</pre>
<h4>浏览器支持</h4>
<p>Skew属性目前只被<strong>Firefox, Safari/Chrome和Oprea 10.5</strong>支持，而且还要使用浏览器的私有前缀-moz- 和-webkit-。</p>
<h4>Matrix</h4>
<p>没错，Matrix就是矩阵，矩阵是高等数学中非常基础的一个东东，而在CSS 3中确实一个相当高级的功能，CSS 3引入matrix函数，可以非常灵活的实现上述的各种效果。它有6个参数(a,b,c,d,e,f)，它事实上是一个3*3矩阵，经过该矩阵将旧的参数转换成新值：<br />
| a b e |<br />
| c d f |<br />
| 0 0 1 |<br />
如果你有兴趣深入研究，可以看一下这里<a href="http://www.w3.org/TR/SVG/coords.html#TransformMatrixDefined">http://www.w3.org/TR/SVG/coords.html#TransformMatrixDefined</a>，这是SVG的一个文档，但是对于matrix变换的原理是通用的。</p>
<p>让我们来看一个例子吧：</p>
<pre class="brush: css;">
#nav{
 /* nav元素将会像右上角倾斜 */
 -moz-transform: matrix(1, -0.2, 0, 1, 0, 0);
 -webkit-transform: matrix(1, -0.2, 0, 1, 0, 0);
 -o-transform: matrix(1, -0.2, 0, 1, 0, 0);
}
</pre>
<h5>浏览器支持</h5>
<p>可喜的是，IE支持<a href="http://msdn.microsoft.com/en-us/library/ms533014(VS.85,loband).aspx">matrix滤镜</a>，虽然它不支持大部分CSS3变形功能，但是使用它的这个滤镜，基本也可以实现相同的效果，不过，你要先搞明白矩阵运算再说。webkit和Firefox(3.5+)、Opera 10.5都支持该功能。</p>
<h4>链式变形</h4>
<p>变形常常是单独的，但是如果你想同时用到多种变形，代码也是可以快速整合的，特别是使用私有扩展。幸运的是，我们有一些内置的缩写：</p>
<pre class="brush: css;">
#nav{
 -moz-transform: translate(10, 25);
 -webkit-transform: translate(10, 25);
 -o-transform: translate(10, 25);
 -moz-transform: rotate(90deg);
 -webkit-transform: rotate(90deg);
 -o-transform: rotate(90deg);
 -moz-transform: scale(2, 1);
 -webkit-transform: scale(2, 1);
 -o-transform: scale(2, 1);
}
</pre>
<p>这些变形<strong>可以被链到一起</strong>，从而让你的代码更高效:</p>
<pre class="brush: css;">
#nav{
 -moz-transform: translate(10, 25) rotate(90deg) scale(2, 1);
 -webkit-transform: translate(10, 25) rotate(90deg) scale(2, 1);
 -o-transform: translate(10, 25) rotate(90deg) scale(2, 1);
 }
</pre>
<p>这些属性的真正的威力是合并到一起。你可以移动、旋转、缩放并控制任何内联元素和块级元素而不使用JavaScript。一旦这些属性的支持变的更加广泛，我们就可以创建更丰富和更轻量的界面和应用。</p>
<h3>transform-origin</h3>
<p>transform-origin不是transform的一个子功能，但是和transform关系非常密切。它可以用来指定transform的<strong>起点</strong>，比如，rotate变形的默认起点是其中间，你可以将起点设置在左上角，或者左下角，这样rotate变形的结果就可能大不相同了。</p>
<p>transform-origin接受两个参数，它们可以是百分比，em，px等具体的值，也可以是left,center,right，或者 top,middle,bottom等描述性参数。几个例子：</p>
<pre class="brush: css;">
.class1{-moz-transform-origin: 0 0;
-webkit-transform-origin: 0 0;
-o-transform-origin: 0 0;
...
}
.class2{-moz-transform-origin:100% 100%;
-webkit-transform-origin:100% 100%;
-o-transform-origin:100% 100%;
...}
.class3{-moz-transform-origin:top left;
-webkit-transform-origin:top left;
-o-transform-origin:top left;
...}
</pre>
<h5>浏览器兼容性</h5>
<p>该属性目前也只有webkit、firefox和Opera 10.5支持，而且需要添加各自的私有前缀。</p>
<h3>transition(转换)</h3>
<p>一个涉及到CSS属性的基本的转换就是定义和移动一个元素从它的静止状态(比如，深蓝色背景)到它的hover或者激活状态(比如，浅蓝色背景)。</p>
<p>转换可以和变形同时使用(以及引发诸如:hover 或:focus事件)以创建一些动画。淡出背景色彩，滑动一个元素以及让一个对象旋转都可以通过CSS转换实现。</p>
<pre class="brush: css;">
#nav a{ background-color:red; }
 #nav a:hover, #nav a:focus{
  background-color:blue;
  /* 告诉转换去应用到background-color 属性(看起来像一个CSS 参数，不是吗？ #foreshadowing)*/
  -webkit-transition-property:background-color;
  -o-transition-property:background-color;
  /* 让它持续两秒钟*/
  -webkit-transition-duration:2s;
  -o-transition-duration:2s;
}
</pre>
<h4>转换的一些参数</h4>
<ul>
<li>
<h5>transition-property</h5>
<p><span>指定转换的CSS属性名称，比如，上面的例子中，将转换应用于background-color属性。</span></li>
<li>
<h5>transition-duration</h5>
<p><span>定义转换花费的时间（从旧属性换到新属性花费的时间）</span></li>
<li>
<h5>transition-timing-function</h5>
<p><span>可以理解为过度效果。指定转换过程中的中间值。可以用cubic-bezier指定。当然有几个常用的内置值：ease | linear | ease-in | ease-out | ease-in-out</span></li>
<li>
<h5>transition-delay</h5>
<p><span>这个比较容易理解，就是转换延迟的时间。时间可以为正整数、负整数和零，非零的时候必须设置单位是s(秒)或者ms(毫秒)，为负数的时候，转换的动作会从该时间点开始显示，之前的动作被截断。</span></li>
</ul>
<p style="COLOR: gray">注：参数部分为<a href="http://www.qianduan.net/">前端观察</a>翻译时添加，原文中没有。</p>
<h5>浏览器支持</h5>
<p>像transform属性一样酷，但是目前只有<strong>WebKit</strong>浏览器支持。Opera 10.5 pre版本也可以通过添加-o-前缀来支持。-moz-transition已经在最近的nightly-build版本的Firefox 3.7中可用。你也可以添加-moz-transition到你的CSS中以实现将来的增强。甚至可以添加一个不用私有前缀的属性，以防万一。</p>
<h3>Animation</h3>
<p>动画是CSS 3最有用的地方。你可以将我们在上面讨论的所有的元素与动画属性比如animation-duration、animation-name 和animation-timing-function整合以创建像Flash动画一样的效果——纯CSS。<br />
<object width="420" height="363"><param name="movie" value="http://www.tudou.com/v/YeTPctOy2mo"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="wmode" value="opaque"></param><embed src="http://www.tudou.com/v/YeTPctOy2mo" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="420" height="363"></embed></object></p>
<pre class="brush: css;">
#rotate {
 margin: 0 auto;
 width: 600px;
 height: 400px;
 /* 确保我们是在一个 3-D 空间 */
 -webkit-transform-style: preserve-3d;
 /*让整个行使用x-轴旋转、7秒中的动画、无限次播放以及线性 */
 -webkit-animation-name: x-spin;
 -webkit-animation-duration: 7s;
 -webkit-animation-iteration-count: infinite;
 -webkit-animation-timing-function: linear;
}
 /* 定义要调用的动画 */
@-webkit-keyframes x-spin {
 0% { -webkit-transform: rotateX(0deg); }
 50% { -webkit-transform: rotateX(180deg); }
 100% { -webkit-transform: rotateX(360deg); }
}
</pre>
<p>这个梦幻的CSS动画代码和在线演示可以在<a href="http://webkit.org/blog-files/3d-transforms/poster-circle.html">webkit</a>网站看到。该演示可以在任何网站看到，但是动画效果却只能在Mac os(雪豹)的<a href="http://nightly.webkit.org/">WebKit的nightly build版本</a>可见。它看起来就像上面的视频中的一样，如果<strong>你是在用mac os (雪豹版本)，</strong>我认为安装一个webkit以亲眼看看这个效果是很值得的(它真的很酷)。Windows系统用户暂时无法欣赏这个效果。</p>
<h4>animation的一些参数</h4>
<p>animation的参数和translate有些像，所以如果你理解了translate的参数，这里就不难理解了。</p>
<ul>
<li>
<h5>animation-name</h5>
<p>动画的名称。</li>
<li>
<h5>animation-duration</h5>
<p>定义动画播放一次需要的时间。默认为0；</li>
<li>
<h5>animation-timing-function</h5>
<p>定义动画播放的方式，参数设置类似transition-timing-function</li>
<li>
<h5>animation-delay</h5>
<p>定义动画开始的时间</li>
<li>
<h5>animation-iteration-count</h5>
<p>定义循环的次数，infinite即为无限次。默认是1。</li>
<li>
<h5>-webkit-animation-direction</h5>
<p>动画播放的方向，两个值，默认为normal，这个时候动画的每次循环都向前播放。另一个值是alternate，则第偶数次向前播放，第奇数次向反方向播放。</li>
</ul>
<h4>浏览器支持</h4>
<p>不幸的是，目前，只有少数浏览器支持CSS动画。2D CSS animations 可以在Safari 4 (Leopard)、Chrome 3、Safari Mobile、Shira 以及其它Webkit 浏览器中工作。Safari 4 (Snow Leopard)支持3D动画</p>
<h3>总结</h3>
<p>现在，JavaScript可以在CSS 3完善之前弥补这个差距。遗憾的是，让所有浏览器支持这些很棒的属性可能需要一个很长的过程。不用等待那一天的到来，我们可以先使用一些严谨的<strong>渐进增强</strong>以及以来Javascript来增强我们的网站和应用。这不是件坏事，至少现在看起来是。</p>
<p>看了最近的<a href="http://www.readwriteweb.com/archives/microsoft_announces_ie9_html5_css4_javascript_performance.php">IE9的公告</a>，如果IE团队添加这些属性中的一些到这个新的版本的浏览器中我不会感到惊讶，他们已经开始考虑整合CSS3了(border-radius)。</p>
<p>web的前景是光明的，特别是因为这些类似动画的高度实验性的属性。尽管很多属性对客户或高级产品工作还不可用，至少他们很有趣！我们都期待着有一天，我们可以支持所有平台，以建立一些真的很棒的轻量级应用。</p>
<h3>参考与资源</h3>
<ul>
<li><a href="http://net.tutsplus.com/videos/screencasts/a-crash-course-in-advanced-css3-effects/">A Crash Course in Advanced CSS3 Effects</a><br />
Net Tuts 发布的一个很酷的关于CSS3效果的视频。</li>
<li><a href="http://www.css3.info/webkit-announces-support-for-css-3d-transforms/">Webkit Announces Support for CSS 3D Transforms</a><br />
CSS3.info 制作的一个使用CSS3动画的demo，目前只支持nightly build 版的WebKit.</li>
<li><a href="http://snook.ca/archives/html_and_css/css-text-rotation">Jonathan Snook on CSS Text Rotation</a><br />
Jonathan Snook 讲述即将到来的CSS3 属性.</li>
<li><a href="http://www.slideshare.net/incidentist/predevcampsf-css3-tricks-1838843">DEV Camp CSS3 Tricks</a><br />
一份来自Dan Kurtz的幻灯演示</li>
<li><a href="http://www.w3.org/TR/css3-2d-transforms/">W3C Spec on 2-D Transformations</a><br />
关于2-D 变换的资源.</li>
<li><a href="http://www.w3.org/TR/css3-3d-transforms/">W3C Spec on 3-D Transformations</a><br />
一个关于3-D 变换的资源.</li>
<li><a href="http://www.w3.org/TR/css3-animations/">W3C Spec on CSS3 Animations</a><br />
CSS animations的W3C工作草案</li>
<li><a href="http://developer.apple.com/mac/library/documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html">Safari CSS参考</a></li>
<li><a href="https://developer.mozilla.org/En/CSS/Using_CSS_transforms">MDC:Using CSS transforms</a></li>
<li><a href="https://developer.mozilla.org/En/CSS/-moz-transform">MDC: -moz-transform</a></li>
</ul>
<h5>关于原作者</h5>
<p>Tim Wright是一位网页设计师/开发工程师和博主。他从2004年就成为一名web标准和易用性的倡导者。你可以在<a href="http://www.csskarma.com/">CSSKarma.com</a>上找到他写的更多文章，或者<a href="http://www.twitter.com/csskarma">follow Tim on Twitter</a>。<br />
原文：<a href="http://www.qianduan.net/what-you-need-to-know-about-behavioral-css.html">你需要知道的CSS3 动画技术</a><br />
译自：<a href="http://www.smashingmagazine.com/2009/12/19/what-you-need-to-know-about-behavioral-css/">What You Need To Know About Behavioral CSS</a></p>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/857.html" title="揭秘HTML5和CSS3(2)">揭秘HTML5和CSS3(2)</a></li><li><a href="http://www.iamued.com/qianduan/853.html" title="揭秘HTML5和CSS3(1)">揭秘HTML5和CSS3(1)</a></li><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1397.html" title="基于 HTML5 的 Windows 画图程序">基于 HTML5 的 Windows 画图程序</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1085.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[原创]用JS控制显示子菜单个数 自动下拉</title>
		<link>http://www.iamued.com/qianduan/1010.html</link>
		<comments>http://www.iamued.com/qianduan/1010.html#comments</comments>
		<pubDate>Fri, 25 Dec 2009 13:21:15 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[页面实现]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[菜单]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1010</guid>
		<description><![CDATA[今天得到产品经理的一个需求
分类体系 一级分类 以及其子分类 在一个标题栏上展示 只显示5个子分类 其余显示为下拉列表 效果如下图

由于对前端比较痴迷 于是乎用前端来实现了一下 之前这样的需求 都是程序员去做判断 来实现的
查看DEMO
下载代码
已在如下浏览器测试 IE6 IE7 IE8 FF3.5.6 Opera10 Safari4
页面结构用前端实现如下

&#60;div class=&#34;Area&#34;&#62;
  &#60;div id=&#34;menu1&#34; class=&#34;main_tit&#34;&#62;
	&#60;h2&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;IamUed.com-前端开发&#60;/a&#62;&#60;/h2&#62;
	&#60;ul  class=&#34;sublist&#34;&#62;
		&#60;li&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;javascript&#60;/a&#62;&#60;/li&#62;
		&#60;li&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;Ria&#60;/a&#62;&#60;/li&#62;
		&#60;li&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;ActionScript&#60;/a&#62;&#60;/li&#62;
		&#60;li&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;Flash&#60;/a&#62;&#60;/li&#62;
		&#60;li&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;Flex&#60;/a&#62;&#60;/li&#62;
		&#60;li&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;W3C&#60;/a&#62;&#60;/li&#62;
		&#60;li&#62;&#60;a href=&#34;http://www.iamued.com&#34;&#62;xhtml&#60;/a&#62;&#60;/li&#62;
	&#60;/ul&#62;
  &#60;/div&#62;
  一级内具体内容
&#60;/div&#62;

可以看到 对于程序输出来讲 这样的结构不需要任何逻辑 相对代码结构清晰整洁
核心JS代码如下


//核心方法 传送一个数组参数
function submenumore(menuarr)
{
    for(var j=0;j&#60;menuarr.length;j++)//循环该数组
    {
      [...]]]></description>
			<content:encoded><![CDATA[<p>今天得到产品经理的一个需求<br />
分类体系 一级分类 以及其子分类 在一个标题栏上展示 只显示5个子分类 其余显示为下拉列表 效果如下图<br />
<img class="alignnone size-full wp-image-1011" title="submenumore" src="http://www.iamued.com/wp-content/uploads/2009/12/submenumore1.gif" alt="submenumore" width="602" height="131" /><br />
由于对前端比较痴迷 于是乎用前端来实现了一下 之前这样的需求 都是程序员去做判断 来实现的<br />
<strong><a href="http://www.iamued.com/demo/submenumore/index.html">查看DEMO</a></strong><br />
<strong><a href="http://www.iamued.com/demo/submenumore/submenumore-iamued.rar">下载代码</a></strong><br />
已在如下浏览器测试 IE6 IE7 IE8 FF3.5.6 Opera10 Safari4<br />
页面结构用前端实现如下</p>
<pre class="brush: xml;">
&lt;div class=&quot;Area&quot;&gt;
  &lt;div id=&quot;menu1&quot; class=&quot;main_tit&quot;&gt;
	&lt;h2&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;IamUed.com-前端开发&lt;/a&gt;&lt;/h2&gt;
	&lt;ul  class=&quot;sublist&quot;&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;javascript&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;Ria&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;ActionScript&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;Flash&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;Flex&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;W3C&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://www.iamued.com&quot;&gt;xhtml&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
  &lt;/div&gt;
  一级内具体内容
&lt;/div&gt;
</pre>
<p>可以看到 对于程序输出来讲 这样的结构不需要任何逻辑 相对代码结构清晰整洁</p>
<p>核心JS代码如下<br />
<span id="more-1010"></span></p>
<pre class="brush: jscript;">
//核心方法 传送一个数组参数
function submenumore(menuarr)
{
    for(var j=0;j&lt;menuarr.length;j++)//循环该数组
    {
        var listli=document.getElementById(menuarr[j]).getElementsByTagName(&quot;ul&quot;)[0].getElementsByTagName(&quot;li&quot;);//根据数组获取到该子菜单的li
        if(listli.length &gt; 5)//如果子菜单数量大于5
        {
            var newimg=document.createElement(&quot;a&quot;);//新建一个a元素 作为大于5个之后显示的小图标容器
            newimg.className=&quot;moreimg&quot;;//给a元素设置一个样式
            newimg.onmouseover=function()//绑定事件 主要用于显示之后的子菜单 这里不多做解释
            {
                showsubmore(this);
            }
            newimg.onmouseout=function()//绑定事件 主要用于隐藏之后的子菜单 这里不多做解释
            {
                hidesubmore(this);
            }
            var newul=document.createElement(&quot;ul&quot;);//新建一个Ul元素 用来存档多余的子菜单
            newul.className=&quot;sublistmore&quot;;//给新的UL设置样式
            for(var i=5;i&lt;listli.length;i++)
            {
                newul.appendChild(listli[i]);//将其余的子菜单 添加到这个新的有序列表里
                i--;
            }
            newul.onmouseover=function()//绑定事件 主要用于显示之后的子菜单 这里不多做解释
            {
                this.style.display=&quot;block&quot;
            }
            newul.onmouseout=function()//绑定事件 主要用于隐藏之后的子菜单 这里不多做解释
            {
                this.style.display=&quot;none&quot;
            }
            var imgli=document.createElement(&quot;li&quot;);//新建一个li元素
            imgli.appendChild(newimg);//将之前建立的A元素 添加到这里 为了页面结构统一 可以比较好的调整样式
            document.getElementById(menuarr[j]).getElementsByTagName(&quot;ul&quot;)[0].insertBefore(imgli,null);//将新建的LI插入到5个子菜单后面
            document.getElementById(menuarr[j]).appendChild(newul);//将多余子菜单加入到数组所传的容器内
        }
    }
}
</pre>
<p>这里要解释一个地方</p>
<pre class="brush: jscript;">
 for(var i=5;i&lt;listli.length;i++)
  {
     newul.appendChild(listli[i]);//将其余的子菜单 添加到这个新的有序列表里
     i--;
  }
</pre>
<blockquote><p>
这里为什么要i&#8211;呢<br />
由于读取出来的是一个引用对象<br />
所以将之前数组内对象 添加到新的 对象里<br />
之前的数组length将-1<br />
所以将i&#8211;以获得之前数组的连贯对象
</p></blockquote>
<p>在代码中用到了2个之前收集的方法 主要是为了兼容各种浏览器</p>
<pre class="brush: jscript;">
//该函数主要取得对象距离浏览器的真实距离Offset
function GetRealOffset(o)
{
    var elem = o;
    var leftOffset = elem.offsetLeft;
    var topOffset = elem.offsetTop;
    var parent = elem.offsetParent;
    while(parent)
    {
        leftOffset += parent.offsetLeft;
        topOffset += parent.offsetTop;
        parent = parent.offsetParent;
    }
    var Offsets = new Object();
    Offsets.top = topOffset;
    Offsets.left = leftOffset;
    return Offsets;
}
//该函数主要用于取得元素的兄弟节点 由于火狐下兄弟节点将TextNode也计算在内 所以用该函数兼容
function getnextSibling(o)
{
    do
    {
        o = o.nextSibling;
    }
    while (o.nodeType != 1)
    return o;
}
</pre>
<p>其他的更多的是页面样式的问题 不做过多解释了</p>
<p><strong><a href="http://www.iamued.com/demo/submenumore/index.html">查看DEMO</a></strong><br />
<strong><a href="http://www.iamued.com/demo/submenumore/submenumore-iamued.rar">下载代码</a></strong><br />
转载请注明：转自我是UED-原文链接:http://www.iamued.com/qianduan/1010.html</p>
<h2  class="related_post_title">您可能还关注的？</h2><ul class="related_post"><li><a href="http://www.iamued.com/qianduan/1612.html" title="太NB了：Google Docs Ctrl + C 技术浅析">太NB了：Google Docs Ctrl + C 技术浅析</a></li><li><a href="http://www.iamued.com/qianduan/1486.html" title="判断 iframe 是否加载完成的完美方法">判断 iframe 是否加载完成的完美方法</a></li><li><a href="http://www.iamued.com/qianduan/1382.html" title="即拷即用动画函数：透明度渐变、位置移动、尺寸变化">即拷即用动画函数：透明度渐变、位置移动、尺寸变化</a></li><li><a href="http://www.iamued.com/qianduan/600.html" title="offsetLeft and offsetTop gives wrong coords in IE ">offsetLeft and offsetTop gives wrong coords in IE </a></li><li><a href="http://www.iamued.com/qianduan/1450.html" title="讨论闭包传入参数：window &#038; undefined">讨论闭包传入参数：window &#038; undefined</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1010.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
