<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Play Google 玩转谷歌,Karry的技术博客</title><link>http://www.playgoogle.com/old/</link><description>学习笔记，成长历程</description><generator>RainbowSoft Studio Z-Blog 1.8 Spirit Build 80605</generator><language>zh-CN</language><copyright>Copyright &amp;amp;copy; 2009  PlayGoogle.com. All Rights Reserved.</copyright><pubDate>Wed, 30 Dec 2009 14:06:37 +0800</pubDate><item><title>国产JS框架--Como JS 1.0 正式发布</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/105.html</link><pubDate>Wed, 23 Dec 2009 10:31:41 +0800</pubDate><guid>http://www.playgoogle.com/old/post/105.html</guid><description><![CDATA[<p><a title="Home" href="http://comsome.com/como/"><img title="Comsome" alt="" src="http://comsome.com/images/logo-sub.png" /></a></p><p>综合了多个框架的优势，希望能给各位开发人员带来更大的方便。</p><p>由于框架刚发布，会存在很多不足之处，我们会在后续不断推出新的版本，也希望大家有任何意见或建议与我们联系。</p><p><span class="Apple-style-span" style="font-family: Simsun; font-size: 12px; color: rgb(155, 154, 154); line-height: 18px; ">Email/Gtalk/MSN: KevinComo@gmail.com</span></p><div class="box" style="padding-top: 20px; padding-right: 20px; padding-bottom: 20px; padding-left: 20px; background-color: rgb(244, 245, 245); margin-bottom: 20px; line-height: 2; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; "><span class="Apple-style-span" style="line-height: 28px; ">Como 是一款代码简易而功能强大的Javascript框架，这也是开发者在工作过程中的经验总结，实用性强；通过它，能够简化Javascript代码开发，增强代码重用性，能够异步按需加载js和css文件，增强page的加载速度；</span></div><div class="box" style="padding-top: 20px; padding-right: 20px; padding-bottom: 20px; padding-left: 20px; background-color: rgb(244, 245, 245); margin-bottom: 20px; line-height: 2; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; ">Como完全兼容市场目前的主流浏览器：Internet Explorer6+, Firefox 2, Safari 2+, Chrome, Opera 9+, 及其他基于IE内核的浏览器如Maxthon、360、Sogou等</div><div class="box" style="padding-top: 20px; padding-right: 20px; padding-bottom: 20px; padding-left: 20px; background-color: rgb(244, 245, 245); margin-bottom: 20px; line-height: 2; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; ">待Como完善成一套框架体系后，我们将提供出一套基于<a target="_blank" style="color: rgb(0, 0, 0); " href="http://www.freebsd.org/copyright/freebsd-license.html">BSD协议</a>的开源方案，供大家学习和分享。我们也将逐步推出一些扩展组件，比如编辑器等。</div><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/105.html" target="_blank">继续阅读《国产JS框架--Como JS 1.0 正式发布》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/103.html">递归练习,做个奥数题</a>&nbsp;&nbsp;(2009-10-28 16:24:29)</p><p><a  href="http://www.playgoogle.com/old/post/96.html">javascript中的memoization(memoizing) 技术介绍</a>&nbsp;&nbsp;(2009-8-5 19:22:19)</p><p><a  href="http://www.playgoogle.com/old/post/94.html">javascript链式调用的设计</a>&nbsp;&nbsp;(2009-7-29 22:19:31)</p><p><a  href="http://www.playgoogle.com/old/post/92.html">onbeforeunload与a标签在IE中的冲突</a>&nbsp;&nbsp;(2009-7-25 14:57:51)</p><p><a  href="http://www.playgoogle.com/old/post/91.html">基于jQuery UI的图片截取(圈人)功能</a>&nbsp;&nbsp;(2009-7-21 15:0:11)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/105.html#cmt283">2009-12-28 11:55:6</a>，tinawu ： 非常不错，<br/>我会一直关注的。</li></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/105.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=105</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=105&amp;key=3a7945a5</trackback:ping></item><item><title>推荐一本书--《从零到百亿Facebook创业故事》</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/104.html</link><pubDate>Tue, 17 Nov 2009 20:13:03 +0800</pubDate><guid>http://www.playgoogle.com/old/post/104.html</guid><description><![CDATA[<p><a href="http://www.douban.com/subject/2287687/" style="padding: 0pt 20px; float: left;" target="_blank"><img alt="" src="http://t.douban.com/mpic/s2764927.jpg" style="border: 0pt none ;" /></a>昨天晚上一口气读完了。书很薄，只有十万字左右。但是写的非常不错，翻译的也很流畅。作者以一个工程师平实的语言、从局内人的视角，描述了这个传奇的web2.0网站初期的爆炸性发展。</p><p>如果自己缺乏创业的能力，能有幸见识并亲身体验到一个伟大公司的诞生也是一段值得回忆的事。而其中对&ldquo;寻梦&rdquo;这个主题的描述，我觉得对想要创业的年轻人会非常有用，对那些对自己的职业规划不清晰的人也非常有用。</p><p>以下内容节选自&ldquo;《从零到百亿Facebook创业故事》&rdquo;</p><p>&ldquo;要想找到属于自己的创业梦想，要么从头做起，要么发现一个刚刚起步但却前程似锦的创业团队。</p><p>发现这样一个创业团队需要两个要素：运气和判断。我是非常幸运的，因为是Facebook找上了我。不过正如人们所说的那样，幸运之神只眷顾有所准备的人：我一直是LinkedInr的忠实用户。而判断这部分，对我来说也很容易：因为Facebook在很多大学校园里已经相当流行了，显然，它也会很快在其它校园里流行起来。我真的希望你也能像我这样容易地找到你的创业梦想。</p><p>1.在我之前加入Facebook的每个人，同扎克之间都是很知根知底的。从这里你该学到，要紧跟你那些才华横溢的朋友，并且鼓励他们去成功！</p><p>2.紧跟所有有才华的朋友并不现实，所以要能够明智地取舍。如果某个朋友恰好有个让你激动万分的创意，你就该好好想想，自己怎样才能不遗余力地帮助他实现这个创意。</p><p>3.一旦你加入了团队并且感觉良好的话，<strong>要努力让自己变得对团队不可或缺</strong>。团队的创始人所需要的，是能够完全信赖的高效的执行者，是能够了解其心意的人。开创一个新的公司，有太多的事情要做。创始人头脑中的想法&mdash;&mdash;如果你能够很好的实施的话&mdash;&mdash;才是最有价值的。相比之下，你对公司应该怎样动作的想法，只会是不合时宜的捣乱。</p><p>4<strong>.要有很强的适应力</strong>。熟悉掌握那些最需要的技能&mdash;&mdash;不论它是什么。年轻人在这方面有绝对的优势，而且是得天独厚的优势。达斯汀还在&ldquo;睡在我上铺的兄弟&rdquo;时代就成了扎克的左膀右臂。是他把站点扩张到了所有的校园，一路上披荆斩棘，学习一切需要的东西，包括编程和各中技术。</p><p>5.<strong>行胜于言。不要空谈，也不要质疑</strong>。只管去做。创业团队需要用最快的速度完成很多事情&mdash;&mdash;不管是用什么方式。</p><p>&ldquo;只管去做&rdquo;这句话意味深长，它所体现的是一种态度，它意味着快速地做出抉择，并矢志向前直到达到目标；它还意味着不要无休止地询问应该怎样做，就按你认为是最佳的办法去做吧。没有多少时间可以留给完美主义；你的激情的态度才是关键。理智的人会考虑实际情况，特别是时间上的限制。</p><p>&nbsp;</p><p>检验能够成功的标准：</p><p>那么，在你众多朋友们的好主意里，哪一个会成长为下一个巨无霸公司呢？</p><p>第一个检验标准就是激情。你的朋友要坚信他的主意是最好的，并准备投入自己的毕生精力。</p><p>第二个检验标准是未来的宏图能通过简单的几个小步骤来实现。一个创意，应该不需要很长的时间或大量的工作，就能够成为现实。即使再复杂的构思，也必须从一个易于理解和完成，单纯、简单的项目开始。如果这种从简单创意到宏伟图景的阶梯非常清晰的话，那是好迹象。相反，如果你的领头羊还不清楚首先要做什么以及最终完成的是什么，那就比较糟糕了。</p><p>第三个检验标准是能否得到参与者迅速、有力的支持。不同于艺术&mdash;&mdash;一些艺术家们或许在生前从不被理解&mdash;&mdash;流行的网站大多是在早期就获得了成功，并拥有一批真正理解和追随其宏图远景的铁杆支持者。第四人检验标准是低用户流失率和用户使用率的增长&rdquo;</p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/104.html" target="_blank">继续阅读《推荐一本书--《从零到百亿Facebook创业故事》》的全文内容...</a></p><p><a href="http://www.playgoogle.com/old/post/104.html#comment" target="_blank">找不到相关文章，请发表流言</a></p><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/104.html#cmt281">2009-12-21 0:19:53</a>，<a href="http://www.playw3c.com">设计师</a> ： 感谢推荐~~~！！</li><li><a href="http://www.playgoogle.com/old/post/104.html#cmt271">2009-11-30 17:7:17</a>，飞浪 ： 不错，一定去看看！</li><li><a href="http://www.playgoogle.com/old/post/104.html#cmt269">2009-11-28 15:58:52</a>，<a href="http://www.mobai.org">墨白</a> ： 给你推荐一个网站 www.lanoo.cc<br/>读书微博~<br/>应该会适合你，我一直用，嘿嘿</li></ul>]]></description><category>随笔</category><comments>http://www.playgoogle.com/old/post/104.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=104</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=104&amp;key=a9daecc0</trackback:ping></item><item><title>递归练习,做个奥数题</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/103.html</link><pubDate>Wed, 28 Oct 2009 16:24:29 +0800</pubDate><guid>http://www.playgoogle.com/old/post/103.html</guid><description><![CDATA[<p>今天有个朋友问我一个小学生的奥数题，酒1元钱1瓶，2个空瓶子可以换一瓶酒，问20块钱可以喝多少瓶酒。我OUT了，我被鄙视了。</p><p>我不会，但是谁让我是写代码的呢，写了个小程序用来鄙视他。告诉他，我不仅知道20块能买多少酒，你就是20000块我也能算出来。</p><div class="code"><p>var allWine = 0;&nbsp; // 20块钱可以买20瓶酒<br />var otherBottle = 0;<br />//递归函数，瓶换酒<br />function bottleExchangeWine(bottle)<br />{<br />&nbsp;&nbsp;&nbsp; if(bottle % 2==1){ //保证瓶子的数量为偶数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(otherBottle&gt;=1){//若不为偶数,且之前有剩余的空瓶子<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bottle += 1;//加一个瓶子<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; otherBottle -= 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bottle -= 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; otherBottle +=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; var newWine =bottle/2;<br />&nbsp;&nbsp;&nbsp; allWine +=newWine ;<br />&nbsp;&nbsp;&nbsp; if(newWine&gt;=1)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bottleExchangeWine(newWine);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp; <br />}<br />function getWine(){<br />&nbsp;&nbsp;&nbsp; otherBottle = 0;<br />&nbsp;&nbsp;&nbsp; allWine = parseInt(document.getElementById(&quot;txtMoney&quot;).value);<br />&nbsp;&nbsp;&nbsp; bottleExchangeWine(allWine);<br />&nbsp;&nbsp;&nbsp; alert(&quot;共有：&quot;+allWine+&quot;瓶酒，共有：&quot;+otherBottle+&quot;个空瓶子还没有换！&quot;);<br />}</p></div><p><a href="http://www.playgoogle.com/demo/buywine.html" target="_blank">点击查看</a></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/103.html" target="_blank">继续阅读《递归练习,做个奥数题》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/105.html">国产JS框架--Como JS 1.0 正式发布</a>&nbsp;&nbsp;(2009-12-23 10:31:41)</p><p><a  href="http://www.playgoogle.com/old/post/96.html">javascript中的memoization(memoizing) 技术介绍</a>&nbsp;&nbsp;(2009-8-5 19:22:19)</p><p><a  href="http://www.playgoogle.com/old/post/94.html">javascript链式调用的设计</a>&nbsp;&nbsp;(2009-7-29 22:19:31)</p><p><a  href="http://www.playgoogle.com/old/post/92.html">onbeforeunload与a标签在IE中的冲突</a>&nbsp;&nbsp;(2009-7-25 14:57:51)</p><p><a  href="http://www.playgoogle.com/old/post/91.html">基于jQuery UI的图片截取(圈人)功能</a>&nbsp;&nbsp;(2009-7-21 15:0:11)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/103.html#cmt266">2009-11-15 22:3:44</a>，飞浪 ： 看过此题，答案是40瓶，因为最后一个瓶子可以先跟店主换一瓶，这样就欠他一个空瓶子，把换来的喝完还他空瓶子，刚好。</li><li><a href="http://www.playgoogle.com/old/post/103.html#cmt257">2009-11-4 21:39:27</a>，<a href="http://qilei.org">飞鱼</a> ： 哈，别人告诉的。 <br/>弱智的问题，要用弱智的想法去考虑<br/><br/>先花1块钱，喝掉1瓶酒，还剩1空瓶<br/>有了这一空瓶子<br/>以后每多花1块钱，喝掉1瓶酒，又多一空瓶，2空瓶换一瓶酒，又能喝一瓶，还剩一空瓶<br/><br/>所以，20块钱 -&gt; 喝掉39瓶 + 1空瓶<br/></li><li><a href="http://www.playgoogle.com/old/post/103.html#cmt256">2009-11-2 12:32:28</a>，<a href="http://www.closhow.cn">canaan</a> ： 20+10+5+2+1+1=39</li><li><a href="http://www.playgoogle.com/old/post/103.html#cmt255">2009-10-30 13:49:52</a>，polarlm ： 貌似这题好象应该是20+10+5+2+1+1    ＋1<br/>最后留一个瓶子的时候，找人借一个瓶子，兑换之后再还给他。</li><li><a href="http://www.playgoogle.com/old/post/103.html#cmt253">2009-10-28 18:34:36</a>，bean ： 直接算也是可以的吧。<br/>先买20瓶(+20)，喝完，有20个瓶子。<br/>换10瓶(+10)，喝完，有10个瓶子。<br/>换5瓶(+5)，喝完，有5个瓶子。<br/>换2瓶(+2)，喝完，有3个瓶子。<br/>换1瓶(+1)，喝完，有2个瓶子。<br/>换1瓶(+1)，喝完，有一个瓶子。<br/>没的换了。<br/>加起来：20+10+5+2+1+1。</li></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/103.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=103</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=103&amp;key=8783ca95</trackback:ping></item><item><title>收藏：图片格式详解</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/102.html</link><pubDate>Wed, 16 Sep 2009 11:25:36 +0800</pubDate><guid>http://www.playgoogle.com/old/post/102.html</guid><description><![CDATA[<p><p><strong>Gif格式图片的特点:</strong></p><p>透明性</p><p>Gif是一种布尔透明类型，既它可以是全透明，也可以是全不透明，但是它并没有半透明（alpha 透明）。</p><p>动画</p><p>&nbsp;&nbsp; &nbsp;Gif这种格式支持动画。</p><p>无损耗性</p><p>&nbsp;&nbsp; &nbsp; Gif是一种无损耗的图像格式，这也意味着你可以对gif图片做任何操作也不会使 &nbsp;得图像质量产生损耗。</p><p>水平扫描</p><p>&nbsp;&nbsp; &nbsp; &nbsp;Gif是使用了一种叫作LZW的算法进行压缩的，当压缩gif的过程中，像素是由上到下水平压缩的，这也意味着同等条件下，横向的gif图片比竖向的gif图片更加小。例如500*10的图片比10*500的图片更加小</p><p>间隔渐进显示</p><p>Gif支持可选择性的间隔渐进显示</p><p>&nbsp;&nbsp;由以上特点看出只有256种颜色的gif图片不适合照片，但它适合对颜色要求不高的图形（比如说图标，图表等），它并不是最优的选择，我们会在后面中看到png是最优的选择。</p><p><strong>Jpeg</strong></p><p>&nbsp;&nbsp;透明性</p><p>&nbsp;&nbsp; &nbsp; 它并不支持透明。</p><p>&nbsp;&nbsp;动画</p><p>&nbsp;&nbsp; &nbsp; &nbsp;它也不支持动画。</p><p>&nbsp;&nbsp;损耗性</p><p>&nbsp;&nbsp; &nbsp; 除了一些比如说旋转（仅仅是90、180、270度旋转），裁切，从标准类型到先进类型，编辑图片的原数据之外，所有其它操作对jpeg图像的处理都会使得它的质量损失。所以我们在编辑过程一般用png作为过渡格式。</p><p>&nbsp;&nbsp; 隔行渐进显示</p><p>&nbsp;&nbsp; &nbsp; 它支持隔行渐进显示（但是ie浏览器并不支持这个属性，但是ie会在整个图像信息完全到达的时候显示）。</p><p>&nbsp;&nbsp; 由上可以看出Jpeg是最适web上面的摄影图片和数字照相机中。</p><p><strong>Png</strong></p><p>类型</p><p>&nbsp;&nbsp; Png这种图片格式包括了许多子类，但是在实践中大致可以分为256色的png和全色的png，你完成可以用256色的png代替gif，用全色的png代替jpeg</p><p>透明性</p><p>&nbsp;&nbsp; Png是完全支持alpha透明的(透明，半透明，不透明)，尽管有两个怪异的现象在ie6(下面详细讨论)</p><p>&nbsp;动画</p><p>&nbsp;&nbsp; &nbsp;它不支持动画</p><p>&nbsp;无损耗性</p><p>&nbsp;&nbsp; &nbsp;png是一种无损耗的图像格式，这也意味着你可以对png图片做任何操作也不会使 &nbsp;得图像质量产生损耗。这也使得png可以作为jpeg编辑的过渡格式</p><p>&nbsp;水平扫描</p><p>&nbsp;&nbsp; 像GIF一样，png也是水平扫描的，这样意味着水平重复颜色比垂直重复颜色的图片更小</p><p>间隔渐进显示</p><p>&nbsp;&nbsp; &nbsp;它支持间隔渐进显示，但是会造成图片大小变得更大</p><p><strong>更多关于PNG</strong></p><p>&nbsp;&nbsp;PNG8</p><p>&nbsp;&nbsp; &nbsp;256色PNG的别名</p><p>&nbsp;&nbsp;PNG24</p><p>&nbsp;&nbsp; &nbsp;全色PNG的别名</p><p>&nbsp;&nbsp;PNG32</p><p>&nbsp;&nbsp; &nbsp;全色PNG的别名</p><p>&nbsp;其它图片格式与PNG比较</p><p>&nbsp;&nbsp; &nbsp;众所周知GIF适合图形，JPEG适合照片，PNG系列两种都适合。</p><p>&nbsp;相比GIF</p><p>PNG 8除了不支持动画外，PNG8有GIF所有的特点，但是比GIF更加具有优势的是它支持alpha透明和更优的压缩。所以，大多数情况下，你都应该用PNG8不是GIF（除了非常小的图片GIF会有更好的压缩外）。</p><p>相比JPEG</p><p>&nbsp;&nbsp; &nbsp;JPEG比全色PNG具有更加好的压缩，因此也使得JPEG适合照片，但是编辑JPEG过程中容易造成质量的损失，所以全色PNG适合作为编辑JPEG的过渡格式.</p><p><strong>Png8的在ie中的怪异表现:</strong></p><p>1.半透明的png8在ie6以下的浏览器显示为全透明。</p><p>2.Alpha透明的全色PNG(png32）在ie6中会出现背景颜色(通常是灰色)。</p><p>由上面可以总结:</p><p>(a)全透明的png8可以在任一浏览器正常显示（就像gif一样）。半透明的png8在除了ie6及其以下的浏览器下错误的显示成全透明，其它浏览器都能正常显示半透明。这个bug并不需要特殊对待，因为在不支持半透明的浏览器下只是显示为全透明，对用户体验影响不大，它反而是透明gif的加强版。&nbsp;</p><p>(b)第二个bug没有什么好的方法解决，只能通过影响性能的方法AlphaImageLoader与需要加特殊标签（VML）。</p><p>因此得出结论就是:请使用PNG8。</p><p><strong>Png8的软件问题</strong></p><p>&nbsp;&nbsp;1.Photoshop只能导出布尔透明的PNG8。</p><p>&nbsp;&nbsp;2.Fireworks既能导出布尔透明的PNG8,也能导出alpha透明的PNG8.</p><p>&nbsp;&nbsp;3.pngquant与pngnq这两个命令行软件可以转换全色png为256色的png8。</p></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/102.html" target="_blank">继续阅读《收藏：图片格式详解》的全文内容...</a></p><p><a href="http://www.playgoogle.com/old/post/102.html#comment" target="_blank">找不到相关文章，请发表流言</a></p>]]></description><category>XHTML+CSS</category><comments>http://www.playgoogle.com/old/post/102.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=102</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=102&amp;key=6350226a</trackback:ping></item><item><title>Python学习笔记(2)</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/101.html</link><pubDate>Fri, 04 Sep 2009 18:01:02 +0800</pubDate><guid>http://www.playgoogle.com/old/post/101.html</guid><description><![CDATA[<ol>    <li>Python中没有 switch case语句，只有if elif else</li>    <li><strong>字符串、数字、元组是不可变的</strong>，改变其值会创建新的对象（这也是为什么大量字符串的拼接会导致效率降低的原因）</li>    <li>字符串模版（直觉是这个功能做WEB的时候很有用，可以轻易的实现根据模版生成静态页面的功能）：<br />    from string import Template<br />    s = Template(&quot;There are ${test}&quot;)<br />    print s.substitute(test=&quot;python&quot;)&nbsp; ==&gt;输出 There are python&nbsp;<br />    substitute中参数如果没有对应声明字符串模版中的<br />    Template 对象还有另外一个方法save_substitute(),该方法在没有声明key的情况下不会报错，直接输出</li>    <li><strong>浅拷贝与深拷贝</strong>。<br />    在拷贝一个列表时，有两种拷贝方式。浅拷贝，就是新创建了一个类型跟原类型一样，其内容是原来对象的引用，也就是说这个拷贝本身是新的，但是它的内容不是。而深拷贝则是建了一个与原对象独立的，但值一模一样的新对象。<br />    <strong>如何实现浅拷贝？</strong><br />    通常有三种方式，(1)完全的切片操作[:](2)利用工厂函数，比如list(),dict()等。(3)使用copy模块的copy函数。<br />    a 前拷贝的示例：<br />    <div class="code">person = [&quot;name&quot;,['male',19]]<br />    girl = person[:] &nbsp;&nbsp; # 将人这个列表浅拷贝到girl<br />    boy = person[:]&nbsp;  # 将人这个列表浅拷贝到boy<br />    gilr[0] = &quot;lily&quot;&nbsp;&nbsp; #修改名字<br />    gril[1][0] = &quot;female&quot;<br />    boy[0] = &ldquo;john&rdquo;<br />    boy[1][0]=&quot;male&quot;<br />    boy[1][1]=22</div>    &nbsp; 例认为打印出girl 和boy结果是什么？<br />    boy ====&gt;&nbsp; [&quot;johu&quot;,['male',22]]<br />    girl ====&gt; &nbsp; [&quot;lily&quot;,['male',22]]<br />    为什么名字相互之间没有影响，而性别和年龄之间有影响呢？这是因为该列表中的第一个元素是一个字符串，是一个不可变的对象，一旦对其修改，就会独立生成一个新的对象。因此当拷贝的时候，字符串被显示的拷贝了，而列表只是拷贝了一个引用。<br />    那么，<strong>如何实现深拷贝</strong>？<br />    在copy模块，有一个deepcopy()方法，可以轻松实现深拷贝。</li></ol><p>&nbsp;</p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/101.html" target="_blank">继续阅读《Python学习笔记(2)》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/100.html">Python学习笔记(1)</a>&nbsp;&nbsp;(2009-8-28 16:56:30)</p></ul>]]></description><category>服务器端</category><comments>http://www.playgoogle.com/old/post/101.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=101</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=101&amp;key=97aa4047</trackback:ping></item><item><title>Python学习笔记(1)</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/100.html</link><pubDate>Fri, 28 Aug 2009 16:56:30 +0800</pubDate><guid>http://www.playgoogle.com/old/post/100.html</guid><description><![CDATA[<p>由于公司的服务器端用的是Python，所以决定抽点时间熟悉一下，也好在以后的工作中能和其他同事有比较好的配合。</p><p>我主要是把Python和其他语言(特别是Javascript和c#,因为我熟悉)一些不一样的特性列出来。</p><p>首先说一下对Python的大体印象,Python和Javascript一样是解释性的语言，也是<strike>弱类型的语言</strike>。同时也是面向对象的一种语言，一切皆是对象：甚至字符串，变量，函数，都是对象。Python的设计也非常酷，用起来很灵活，习惯使用Javascript的人，一定会爱上Python&nbsp;</p><ol>    <li>没有大括号，靠缩进来控制代码块的开始与结束。语句结束不用分号，但一行中有多个语句，用分号隔开。</li>    <li><strong>// 运算符和 ** 运算符</strong><br />    //特殊的除法运算（千万别以为是注释代码的，Python的代码注释用#），运算符对整型和浮点型都会取整。如：2.0//3.0=0 &nbsp; **是就幂，如：2**3 表示2的3次方。</li>    <li><strong>不等号有两种写法 ！= 和&lt;&gt;</strong></li>    <li><strong>逻辑操作符的关键字是 and or not </strong></li>    <li><strong>三引号(三个连续的单引号或者双引号)中的特殊字符自动转义</strong></li>    <li><strong>Python中没有数组，只有列表，但其特性跟js中的数组一样，也就是长度可变的数组。</strong></li>    <li><strong>列表可以用引号（：）来获取元素</strong><br />    如：a = [0,1,2,3]&nbsp;&nbsp; a[1:4] =[1,2,3]&nbsp;&nbsp; a[:3]=[0,1,2]&nbsp;&nbsp; a[1:] = [1,2,3]</li>    <li>for 循环就相当于c#中的foreach ,有一个range函数来提供索引.<br />    <div class="code">#遍历数组<br />    a = [1,2,3]<br />    for(item in a):<br />    &nbsp;&nbsp;&nbsp; print item<br />    #另外一个例子<br />    for eachNum in range(3) <br />    &nbsp;&nbsp;&nbsp; print eachNum</div>    这里 range(obj1,obj2)为内建函数。obj1不提供默认为0，obj2不提供默认为1，返回一个从obj1到obj2的数组</li>    <li>可以多元赋值<br />    x,y= 1,2&nbsp; 等价于&nbsp; x=1 y=2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x,y = y,x&nbsp;&nbsp; 交换x和y的值（很好很强大，哈哈）</li>    <li>布尔值为False的对象有<br />    None(相当于js中的null)，False,所有值为0的数,空字符串''(注：'0'为True),空元组（）,空列表[],空字典{}</li>    <li>多个比较操作符可以在同一行中进行<br />    3&lt;4&lt;5&nbsp; 等同于（3&lt;4 and 4&lt;5)</li>    <li>用 is 来判断两个变量是否指向同一个对象。<br />    a is b 等同于id(a) is id(b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id()是获取对象的内存编号。但是要注意的是 Python为了提高性能会对整型和字符串类型进行缓存。但对浮点型不会。<br />    例如 a =2&nbsp;;b = 2; a is b&nbsp; 返回True，a=2.0;b=2.0 a is b 返回False</li>    <li>逻辑操作符的优先级 not 高于 and&nbsp; 高于 or</li>    <li>几个标准内建函数<br />    type(obj) 获取obj的类型，类似Javascript中的type of<br />    str(obj) 将obj 转换为 字符串类型<br />    repr(obj)是奖obj 序列化，转换为字符串，但是可以通过eval()还原，所以obj == eval(repr(obj))</li>    <li>与Javascript一样，Python 不支持方法和函数的重载（弱类型语言的特点）</li>    <li>字符串和列表、元组统称为序列，可以进行 in&nbsp;、not in、+、*操作<br />    obj in seq&nbsp; 判断obj 元素是否包含在seq中，在返回True，不在返回False<br />    + 操作符可以把两个序列连接起来。&nbsp;&nbsp;[1,2,3]&nbsp;+[4,5,6] == [1,2,3,4,5,6]<br />    * 操作符把一个序列拷贝多分。&nbsp; [1,2]* 2 == [1,2,1,2]</li>    <li>列表的下标可以是负数，负数标识从结束点往左找。<br />    [1,2,3][-2]==2</li></ol><p>今天先到这里，未完待续</p><p>12/29 更正:感谢<span class="Apple-style-span" style="font-family: Arial, Verdana, sans-serif, 微软雅黑; font-size: 12px; color: rgb(51, 51, 51); "><a style="text-decoration: none; color: rgb(204, 0, 0); " href="http://www.playgoogle.com/post/100.html">butterinsect</a>&nbsp;，我确实没有弄清楚，python是强类型的语言，确切的说是，python是隐式类型的强类型语言。也就是说，在声明变量的时候，不需要<span class="Apple-style-span" style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 18px; "><strong style="font-weight: bold; ">显式说明它的类型，</strong>但是在Python里，是有明确的类型的概念，而且不同类型的对象不能相互替代和操作，比如：</span></span></p><pre style="margin-top: 1.5em; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 1em; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-style: initial; border-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; white-space: pre; overflow-x: auto; overflow-y: auto; font: normal normal normal 1em/normal 'courier new', 'andale mono', 'lucida console', monospace; line-height: 1.5; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(0, 61, 0); border-right-color: rgb(0, 61, 0); border-bottom-color: rgb(0, 61, 0); border-left-color: rgb(0, 61, 0); background-color: yellow; ">&gt;&gt;&gt; 10 + '20'</pre><p>会出现错误&nbsp;<span class="Apple-style-span" style="font-family: 'courier new', 'andale mono', 'lucida console', monospace; font-size: 12px; color: rgb(34, 34, 34); line-height: 18px; white-space: pre; ">TypeError: unsupported operand type(s) for +: 'int' and 'str'</span></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/100.html" target="_blank">继续阅读《Python学习笔记(1)》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/101.html">Python学习笔记(2)</a>&nbsp;&nbsp;(2009-9-4 18:1:2)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/100.html#cmt285">2009-12-29 16:4:50</a>，butterinsect ： python是强类型语言，lz这都没有搞清楚，不要误人子弟</li><li><a href="http://www.playgoogle.com/old/post/100.html#cmt239">2009-9-3 13:22:4</a>，孤狗 ： 总结的很精辟。我最近也在学python，读了你的博客，发现自己在学习过程中有遗漏的知识点，受益匪浅。希望续集快点放出！</li><li><a href="http://www.playgoogle.com/old/post/100.html#cmt236">2009-8-30 22:41:13</a>，<a href="http://www.mobai.org">程路</a> ： 换主题了，不错<br/>也在关注Python，GAE提供有免费的Python空间，也不错~呵呵</li></ul>]]></description><category>服务器端</category><comments>http://www.playgoogle.com/old/post/100.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=100</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=100&amp;key=14db27ae</trackback:ping></item><item><title>收藏：淘宝DPL-Design Pattern Library</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/99.html</link><pubDate>Tue, 25 Aug 2009 16:42:00 +0800</pubDate><guid>http://www.playgoogle.com/old/post/99.html</guid><description><![CDATA[<p><span style="font-size: xx-large;"><strong>&nbsp;Taobao DPL</strong></span></p><div id="page"><div id="content"><h3>Basic Specification &amp; Usage Guide</h3><ol>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/basic_structure.html">页面基本结构和命名约定</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/assets_guide.html">assets 目录组织和文件命名规范</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/usage_help.html">TBra 使用说明</a></li></ol><h3>Basic Style Platform</h3><ol>    <li><a href="http://assets.taobaocdn.com/tbsp/tests/reset_test.html">样式重置 reset.css</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/grids_layout_1.html">栅格布局 grids.css</a> <a href="http://assets.taobaocdn.com/tbra/dpl/common/grids_help.html">栅格使用说明</a></li>    <li><a href="http://assets.taobaocdn.com/tbsp/tests/reset_grids_base_test.html">基本样式 base.css</a></li></ol><h3>Taobao Common Styles</h3><ol>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/box_demo.html">Box</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/price_demo.html">价格</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/pic_demo.html">图片</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/item_demo.html">商品信息块</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/button_demo.html">按钮</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/crumbs_demo.html">面包屑</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/message_demo.html">信息提示</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/flow_steps.html">步骤条</a></li></ol><h3>Taobao Common Icons</h3><ol>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/trade_icons.html">交易类图标</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/rank_demo.html">会员等级</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/common/misc_icons.html">杂类图标</a></li>    <li>...</li></ol><h3>Modules</h3><ol>    <li><a href="http://assets.taobaocdn.com/tbsp/tests/header/header.html">页头和页尾</a><a href="http://assets.taobaocdn.com/tbra/dpl/modules/page_template_v2.html">过渡版本v2</a><a href="http://assets.taobaocdn.com/tbra/dpl/modules/page_template_lite_v2.html">简头v2</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/modules/feedback_page.html">反馈页面</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/modules/wangwang_demo.html">旺旺点灯</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/modules/calendar_demo.html">日历</a></li>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/modules/popup_demo.html">弹出框</a></li>    <li>卡盘</li>    <li>排行榜</li>    <li>标签云</li>    <li>自动完成</li>    <li>协议</li>    <li>搜索</li>    <li>级联列表</li>    <li>就地编辑</li>    <li>...</li></ol><h3>Misc</h3><ol>    <li><a href="http://assets.taobaocdn.com/tbra/dpl/misc/2008_icons_report.html">2008年Icons年终汇报</a></li></ol></div><div id="footer"><p>原文地址：<a href="http://assets.taobaocdn.com/tbra/dpl/" target="_blank">http://assets.taobaocdn.com/tbra/dpl/</a></p></div></div><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/99.html" target="_blank">继续阅读《收藏：淘宝DPL-Design Pattern Library》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/68.html">初识DPL（Design Pattern Library）</a>&nbsp;&nbsp;(2009-3-25 21:24:3)</p></ul>]]></description><category>XHTML+CSS</category><comments>http://www.playgoogle.com/old/post/99.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=99</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=99&amp;key=42fb1a06</trackback:ping></item><item><title>三栏布局，左右固定宽度，中间自适应的一种解决方案</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/98.html</link><pubDate>Tue, 18 Aug 2009 13:42:28 +0800</pubDate><guid>http://www.playgoogle.com/old/post/98.html</guid><description><![CDATA[<p>&nbsp;<span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"><span style="font-family: sans-serif; font-size: 14px;" class="Apple-style-span"><img title="" alt="" src="../../../upload/2009/8/css.jpg" onload="ResizeImage(this,520)" /></span></span></p><p>如图所示，三栏布局中，左右固定宽度，中间自适应有很多总解决方法，之前也看过一篇文章<span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;" class="Apple-style-span"><span style="color: rgb(68, 68, 68); font-family: sans-serif; font-size: 14px; line-height: 23px; text-align: left;" class="Apple-style-span"><a style="text-decoration: none; color: rgb(204, 0, 0);" href="http://www.alistapart.com/articles/holygrail">In Search of the Holy Grail</a> ，不过</span></span>，就我个人而言，跟喜欢通过margin的负值来达到这种效果。</p><p>核心CSS代码：</p><div class="code"><ol>    <li>#content{background:#ff6;}</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #left,#right{width:200px;background:#fc0;float:left;}</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #middle{float:left; width:100%;margin:0 -200px;}</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #middle .inner{margin:0 200px;background:#ccc;}</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; #right{float:right;}</li></ol></div><p>DOM 结构：</p><div class="code"><ol>    <li>&lt;div id=&quot;content&quot; class=&quot;clearfix&quot;&gt;</li>    <li>&nbsp;&nbsp;&nbsp; &lt;div id=&quot;left&quot;&gt;</li>    <li>&nbsp;&nbsp;&nbsp; &lt;/div&gt;</li>    <li>&nbsp;&nbsp;&nbsp; &lt;div id=&quot;middle&quot;&gt;</li>    <li>&nbsp;&nbsp;&nbsp; &lt;/div&gt;</li>    <li>&nbsp;&nbsp;&nbsp; &lt;div id=&quot;right&quot;&gt;</li>    <li>&nbsp;&nbsp;&nbsp; &lt;/div&gt;</li>    <li>&lt;/div&gt;</li></ol></div><p><a href="http://www.playgoogle.com/demo/3layout/test.html" target="_blank"><strong>点击查看示例</strong></a></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/98.html" target="_blank">继续阅读《三栏布局，左右固定宽度，中间自适应的一种解决方案》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/97.html">可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks</a>&nbsp;&nbsp;(2009-8-10 10:47:28)</p><p><a  href="http://www.playgoogle.com/old/post/89.html">让IE6瞬间崩溃的5种方式</a>&nbsp;&nbsp;(2009-6-22 10:39:33)</p><p><a  href="http://www.playgoogle.com/old/post/86.html">【收藏】CSS技巧教程资源大全</a>&nbsp;&nbsp;(2009-6-17 13:29:55)</p><p><a  href="http://www.playgoogle.com/old/post/72.html">【收藏】字体、排版简明入门</a>&nbsp;&nbsp;(2009-4-1 10:58:52)</p><p><a  href="http://www.playgoogle.com/old/post/61.html">WebKit私有属性介绍</a>&nbsp;&nbsp;(2009-3-13 21:32:5)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/98.html#cmt263">2009-11-9 11:24:36</a>，<a href="http://qilei.org">飞鱼</a> ： 双magin欺骗的方法，挺好用，这样写的一个坏处就是 firebug<br/>抓不到 侧边栏，调试起来 比较麻烦，应该是100% 加margin 效果引起的，<br/>我用的方法跟LZ 引用的那文章差不多，不过container 用的不是padding，我用margin。</li><li><a href="http://www.playgoogle.com/old/post/98.html#cmt235">2009-8-28 10:9:29</a>，<a href="http://www.yimingdl.com">mj623ok</a> ： 我有些不明白，请教一下。<br/>设置#middle{float:left; width:100%;}我知道肯定会让#middle层下移，因为宽度是以父层的宽度来计算的。可是为什么加上margin:0 -200px;后，这个div就不会下移呢？麻烦博主给我解释一下，谢谢了</li><li><a href="http://www.playgoogle.com/old/post/98.html#cmt231">2009-8-21 14:18:48</a>，DanielChow ： 博客非常不错！写东西很实在，完全没有虚夸浮躁之风很佩服！<br/><br/><br/>//有的页面右边的divSidebar，高度溢出了。</li></ul>]]></description><category>XHTML+CSS</category><comments>http://www.playgoogle.com/old/post/98.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=98</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=98&amp;key=d1ccad2b</trackback:ping></item><item><title>可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/97.html</link><pubDate>Mon, 10 Aug 2009 10:47:28 +0800</pubDate><guid>http://www.playgoogle.com/old/post/97.html</guid><description><![CDATA[<div class="postEntry"><p>可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks：</p><div class="code"><div class="hl-main"><span style="color: Blue;">.test</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">color:</span><span style="color: Gray;">/*\**/</span><span style="color: rgb(0, 0, 139);">#00f</span><span style="color: Gray;">\</span><span style="color: Maroon;">9</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">IE8</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">.test</span><span style="color: Gray;">,<br /></span><span style="color: Blue;">.test</span><span style="color: Gray;">:-</span><span style="color: Blue;">moz-any-link</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#f60</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">Firefox2</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">.test</span><span style="color: Gray;">,<br /></span><span style="color: Blue;">.test</span><span style="color: Navy;">:default</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#000</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">Firefox3</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">*</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#f00</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">IE7</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br />&nbsp;&nbsp; &nbsp;_</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#0f0</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">IE6</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br /></span><span style="color: Olive;">}</span></div></div><p>可同时区分IE8、IE7、IE6、Firefox的CSS hacks：</p><div class="code"><div class="hl-main"><span style="color: Blue;">.test</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#000</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">Firefox</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">color:</span><span style="color: Gray;">/*\**/</span><span style="color: rgb(0, 0, 139);">#00f</span><span style="color: Gray;">\</span><span style="color: Maroon;">9</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">IE8</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">*</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#f00</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">IE7</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br />&nbsp;&nbsp; &nbsp;_</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#0f0</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">IE6</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br /></span><span style="color: Olive;">}</span></div></div><p>关于IE8的hacks：</p><div class="code"><div class="hl-main"><span style="color: Blue;">.test</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">color:</span><span style="color: Gray;">/*\**/</span><span style="color: rgb(0, 0, 139);">#00f</span><span style="color: Gray;">\</span><span style="color: Maroon;">9</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">IE8</span><span style="color: Gray;"> </span><span style="color: Blue;">only</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">color:</span><span style="color: rgb(0, 0, 139);">#00f</span><span style="color: Gray;">\</span><span style="color: Maroon;">9</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;"> 适用于所有</span><span style="color: Blue;">IE</span><span style="color: Gray;">版本 </span><span style="color: Blue;">*</span><span style="color: Gray;">/<br /></span><span style="color: Olive;">}</span></div></div></div><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/97.html" target="_blank">继续阅读《可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/98.html">三栏布局，左右固定宽度，中间自适应的一种解决方案</a>&nbsp;&nbsp;(2009-8-18 13:42:28)</p><p><a  href="http://www.playgoogle.com/old/post/89.html">让IE6瞬间崩溃的5种方式</a>&nbsp;&nbsp;(2009-6-22 10:39:33)</p><p><a  href="http://www.playgoogle.com/old/post/86.html">【收藏】CSS技巧教程资源大全</a>&nbsp;&nbsp;(2009-6-17 13:29:55)</p><p><a  href="http://www.playgoogle.com/old/post/72.html">【收藏】字体、排版简明入门</a>&nbsp;&nbsp;(2009-4-1 10:58:52)</p><p><a  href="http://www.playgoogle.com/old/post/61.html">WebKit私有属性介绍</a>&nbsp;&nbsp;(2009-3-13 21:32:5)</p></ul>]]></description><category>XHTML+CSS</category><comments>http://www.playgoogle.com/old/post/97.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=97</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=97&amp;key=30788ef2</trackback:ping></item><item><title>javascript中的memoization(memoizing) 技术介绍</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/96.html</link><pubDate>Wed, 05 Aug 2009 19:22:19 +0800</pubDate><guid>http://www.playgoogle.com/old/post/96.html</guid><description><![CDATA[<p>最近在读《JavaScript 设计模式》一书，其中工厂模式中提到了memoizing技术，今天仔细整理了一下memoization 相关的资料，与大家共享。</p><ul>    <li><a href="http://en.wikipedia.org/wiki/Memoization" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');"><strong>Memoization</strong></a><strong>的定义：</strong></li></ul><p>memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、memoizing.</p><p><a href="http://en.wikipedia.org/wiki/Memoization" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');">Memoization</a> 是一种将函数返回值缓存起来的方法，Memoization 原理非常简单，就是把函数的每次执行结果都放入一个键值对(数组也可以，视情况而定)中，在接下来的执行中，在键值对中查找是否已经有相应执行过的值，如果有，直接返回该值，没有才 真正执行函数体的求值部分。很明显，找值，尤其是在键值对中找值，比执行函数快多了。现代 JavaScript 的开发也已经大量使用这种技术。</p><ul>    <li><strong>&nbsp;一个简单的使用memoization的例子</strong></li></ul><p>我们知道，在不同的浏览器中，xmlHttpRequest对象的具体实现都不同。需要判断何种浏览器以执行具体的方法。这里就有一个使用memoization来实现的例子。</p><div class="code"><ol>    <li>function createXHRObject = function(){</li>    <li>&nbsp;&nbsp;&nbsp; //先把三个匿名函数缓存起来。</li>    <li>&nbsp;&nbsp;&nbsp; var methods = [</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; function(){return new XMLHttpRequest();},</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; function(){return new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);},</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; function(){return new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);}</li>    <li>&nbsp;&nbsp;&nbsp; ];</li>    <li>&nbsp;&nbsp;&nbsp; for(var i=0,len=methods.length;i&lt;len;i++){</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try{//这里用try catch来代替了条件判断，通常我不赞成这种写法</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; methods[i]();</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; catch(e){</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue;//如果报异常，则执行下一次循环</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 把createXHRObject 与能正常执行的匿名函数对应起来，再调用createXHRObject不用再检测浏览器了</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; createXHRObject = method[i];</li>    <li>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return method[i];</li>    <li>&nbsp;&nbsp;&nbsp; }</li>    <li>}</li></ol></div><p>以上是一个简单的例子，第一次执行createXHRObject（）的时候，会循环判断methods 中的方法，获取一个能正确执行的，并将createXHRObject的引用指向这个方法。以后再使用这个方法的时候，不用去判断，直接自动获取正确的方法。这省去了频繁的ajax调用中浏览器的检测。</p><p>当然，这个方法看上去效率的提升不是特别明显，我之所以写上来，是因为能比较清晰的理解memoization是如何实现的。在<strong>递归调用</strong>的时候，memoization的威力才能更好的显现。</p><p><strong>一个递归的例子</strong>：</p><div class="code"><ol>    <li><span class="ident">function</span> <span class="ident">fib</span><span class="punct">(</span><span class="ident">n</span><span class="punct">)</span> <span class="punct">{</span></li>    <li><span class="keyword">if</span> <span class="punct">(</span><span class="ident">n</span> <span class="punct">&lt;</span> <span class="number">2</span><span class="punct">)</span> <span class="punct">{</span></li>    <li><span class="keyword">return</span> <span class="ident">n</span><span class="punct">;</span></li>    <li><span class="punct">}</span></li>    <li><span class="keyword">return</span> <span class="ident">fib</span><span class="punct">(</span><span class="ident">n</span> <span class="punct">-</span> <span class="number">1</span><span class="punct">)</span> <span class="punct">+</span> <span class="ident">fib</span><span class="punct">(</span><span class="ident">n</span> <span class="punct">-</span> <span class="number">2</span><span class="punct">);</span></li>    <li><span class="punct">}</span></li></ol></div><p>&nbsp;这是一个经典的<a href="http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97" target="_blank">斐波纳契</a>序列，fib(20) 会把fib这个方法执行21891次，如果是fib(40),这会执行331160281次。</p><p>再看看如何使用memoization来实现，由于fib的参数就是一个自然数，这里用一个数组来缓存fib函数执行的结果。数组的下标用来标识参数，该小标对应的值用来表示函数执行的结果。</p><div class="code"><ol>    <li>&nbsp;var iterMemoFib = (function() {</li>    <li>&nbsp;&nbsp;&nbsp; var cache = [1, 1];</li>    <li>&nbsp;&nbsp;&nbsp; var fib = function(n) {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n &gt;= cache.length) {</li>    <li>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//将一个递归转换成了一个遍历</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = cache.length; i &lt;= n; i++) {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache[i] = cache[i - 2] + cache[i - 1];</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cache[n-1];</li>    <li>&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp; return fib;</li>    <li>})();</li></ol></div><p>将Function的原型扩展<span class="ident">memoize</span> 和<span class="string">unmemoize </span>方法，这样你可以对任何函数实现memoize和解除memoize,当然，这个方法要慎重，对一些不是频繁执行的函数，没必要缓存：</p><div class="code"><ol>    <li>Function.prototype.memoize = function() {</li>    <li>&nbsp;&nbsp;&nbsp; var pad&nbsp; = {};</li>    <li>&nbsp;&nbsp;&nbsp; var self = this;</li>    <li>&nbsp;&nbsp;&nbsp; var obj&nbsp; = arguments.length &gt; 0 ? arguments[i] : null;</li>    <li>&nbsp;</li>    <li>&nbsp;&nbsp;&nbsp; var memoizedFn = function() {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 把参数作为数组保存，作为键，把函数执行的结果作为值缓存起来</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var args = [];</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; arguments.length; i++) {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[i] = arguments[i];</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(args in pad)) {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pad[args] = self.apply(obj, arguments);</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pad[args];</li>    <li>&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp; memoizedFn.unmemoize = function() {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self;</li>    <li>&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp; return memoizedFn;</li>    <li>}</li>    <li>Function.prototype.unmemoize = function() {</li>    <li>&nbsp;&nbsp;&nbsp; alert(&quot;Attempt to unmemoize an unmemoized function.&quot;);</li>    <li>&nbsp;&nbsp;&nbsp; return null;</li>    <li>}</li>    <li>&nbsp;</li></ol></div><p>使用方法：</p><div class="code"><span class="ident">fib</span><span class="punct">.</span>memoize();</div><p>参考文档：</p><ol>    <li><a href="http://snippets.dzone.com/posts/show/488" target="_blank">Memoizing functions in JavaScript</a></li>    <li><a target="_blank" href="http://realazy.org/blog/2008/04/22/javascript-memoization/">JavaScript Memoization</a></li>    <li><a href="http://www.webjx.com/javascript/jsajax-10076.html" target="_blank">提升JS性能：将递归转换为迭代</a></li>    <li><a target="_blank" href="http://en.wikipedia.org/wiki/Memoization">MemoizationFrom Wikipedia, the free encyclopedia</a></li></ol><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/96.html" target="_blank">继续阅读《javascript中的memoization(memoizing) 技术介绍》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/105.html">国产JS框架--Como JS 1.0 正式发布</a>&nbsp;&nbsp;(2009-12-23 10:31:41)</p><p><a  href="http://www.playgoogle.com/old/post/103.html">递归练习,做个奥数题</a>&nbsp;&nbsp;(2009-10-28 16:24:29)</p><p><a  href="http://www.playgoogle.com/old/post/94.html">javascript链式调用的设计</a>&nbsp;&nbsp;(2009-7-29 22:19:31)</p><p><a  href="http://www.playgoogle.com/old/post/92.html">onbeforeunload与a标签在IE中的冲突</a>&nbsp;&nbsp;(2009-7-25 14:57:51)</p><p><a  href="http://www.playgoogle.com/old/post/91.html">基于jQuery UI的图片截取(圈人)功能</a>&nbsp;&nbsp;(2009-7-21 15:0:11)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/96.html#cmt227">2009-8-10 21:2:10</a>，celi ： 很不错，有嚼头。<br/></li></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/96.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=96</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=96&amp;key=f3a9a38f</trackback:ping></item><item><title>ASP.NET中如何防SQL注入</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/95.html</link><pubDate>Wed, 05 Aug 2009 10:50:28 +0800</pubDate><guid>http://www.playgoogle.com/old/post/95.html</guid><description><![CDATA[<p>防SQL 注入是一个系统工程,在项目开发中就要系统的考虑SQL 注入的问题。一般做到以下4点，能比较好的控制SQL 注入：</p><ol>    <li>严格验证用户的一切输入，包括URL参数。</li>    <li>将用户登录名称、密码等数据加密保存</li>    <li>不要用拼接字符串的方式来生成SQL语句，而是用SQL<span style="font-weight: bold;"> </span>Parameters 传参数或者用存储过程来查询</li>    <li>严格验证上传文件的后缀，exe、aspx、asp等可执行程序禁止上传。</li></ol><p>这里介绍一个简单通用的方法，用来验证字符串中是否有敏感字符，参数可以是一个字符串，也可以是一个字符串集合，敏感字符可以在Lawlesses数组中定义：</p><div class="code"><ol>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static string[] Lawlesses = { &quot;=&quot;, &quot;'&quot; };</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 敏感字符检测</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;args&quot;&gt;&lt;/param&gt;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static bool CheckParams(params object[] args)</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Lawlesses == null || Lawlesses.Length &lt;= 0) return true;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].*</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //另外,由于我是想做通用而且容易修改的函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string str_Regex = &quot;.*[&quot;;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; Lawlesses.Length - 1; i++)</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_Regex += Lawlesses[i] + &quot;|&quot;;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str_Regex += Lawlesses[Lawlesses.Length - 1] + &quot;].*&quot;;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (object arg in args)</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (arg is string)//如果是字符串,直接检查</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Regex.Matches(arg.ToString(), str_Regex).Count &gt; 0)</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (object obj in (ICollection)arg)</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (obj is string)</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Regex.Matches(obj.ToString(), str_Regex).Count &gt; 0)</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</li>    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</li></ol><p>&nbsp;</p></div><p>参考文档：<a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/ms998271(en-us).aspx">http://msdn.microsoft.com/zh-cn/library/ms998271(en-us).aspx</a></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/95.html" target="_blank">继续阅读《ASP.NET中如何防SQL注入》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/12.html">ASP.NET 缓存技术</a>&nbsp;&nbsp;(2008-7-12 8:43:57)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/95.html#cmt232">2009-8-22 3:44:25</a>，xmq120 ： 需要这样吧 用3层开发 问题完全不存在</li></ul>]]></description><category>服务器端</category><comments>http://www.playgoogle.com/old/post/95.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=95</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=95&amp;key=9c710c19</trackback:ping></item><item><title>javascript链式调用的设计</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/94.html</link><pubDate>Wed, 29 Jul 2009 22:19:31 +0800</pubDate><guid>http://www.playgoogle.com/old/post/94.html</guid><description><![CDATA[<p>用过jQuery的朋友一定对jQuery中方法的链式调用印象深刻，最近发布的YUI3也支持了方法的链式调用。这是一个非常不错的语法特性，能让代码更加简洁、易读。很多时候链式调用可以避免多次重复使用一个对象变量，从而减少代码，而js是一种客户端执行的脚本语言，减少代码就减少了js文件的大小，减少了服务器的压力。链式调用这么多优点，它是如何实现的呢？这篇文章就是想探讨一下这个问题。</p><p>链式调用例子如：$(&quot;p&quot;).append(&quot;test&quot;).fadeIn(&quot;fast&quot;);</p><p>看一段jQuery的源码：</p><div class="code">append: function() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.domManip(arguments, true, function(elem){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (this.nodeType == 1)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.appendChild( elem );<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp; }</div><p>以上是jQuery中append方法的实现。append方法是向每个匹配的元素内部追加内容的方法，很明显，属于赋值操作，但是却有<strong>返回值</strong>，返回的是当前操作的dom(通常返回this指针)。这是链式调用的关键，你会发现这不过是个<strong>语法小技巧</strong>而已。</p><p>很明显，在赋值器方法中(或者本身没有返回值的方法中)很容易实现链式调用，而取值器相对来说不好实现链式调用，因为你需要取值器返回你需要的数据而不是this指针(当然，如果你坚持要实现链式方法，也可以用回调函数来实现)。</p><p><strong>设计一个简单的支持链式调用的类：</strong></p><div class="code"><p>function Dog(name,color){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name=name||&quot;&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.color=color||&quot;&quot;;<br />}<br />Dog.prototype.setName=function(name){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name=name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return this;</strong><br />};<br />Dog.prototype.setColor(color){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.color=color;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return this;</strong><br />};<br />Dog.prototype.yelp(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&quot;我的名字叫：&quot;+this.name+&quot;,我的颜色是:&quot;+this.color);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return this;</strong><br />};</p></div><p>使用方式：</p><div class="code">var dog = new Dog();<br />dog.setName(&quot;旺财&quot;).setColor(&quot;白色&quot;).yelp();</div><p><strong>取值器你也想支持链式调用？</strong><br />那就用回调函数来实现，将本来应该返回的值直接传给回调函数，而return仍然返回this指针。接着上面的Dog类写一个方法：</p><div class="code">Dog.prototype.getName(callback){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback.call(this,this.name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />}</div><p>使用方式：</p><div class="code">function showName(name){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(name);<br />}<br />dog.setName(&quot;旺财&quot;).<strong>getName(showName)</strong>.setColor(&quot;白色&quot;);</div><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/94.html" target="_blank">继续阅读《javascript链式调用的设计》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/105.html">国产JS框架--Como JS 1.0 正式发布</a>&nbsp;&nbsp;(2009-12-23 10:31:41)</p><p><a  href="http://www.playgoogle.com/old/post/103.html">递归练习,做个奥数题</a>&nbsp;&nbsp;(2009-10-28 16:24:29)</p><p><a  href="http://www.playgoogle.com/old/post/96.html">javascript中的memoization(memoizing) 技术介绍</a>&nbsp;&nbsp;(2009-8-5 19:22:19)</p><p><a  href="http://www.playgoogle.com/old/post/92.html">onbeforeunload与a标签在IE中的冲突</a>&nbsp;&nbsp;(2009-7-25 14:57:51)</p><p><a  href="http://www.playgoogle.com/old/post/91.html">基于jQuery UI的图片截取(圈人)功能</a>&nbsp;&nbsp;(2009-7-21 15:0:11)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/94.html#cmt238">2009-9-1 13:13:26</a>，<a href="http://www.pinaster.net">Keeper</a> ： 不错。这一特性很符合JS的函数式语言的特点，连续求值，函数即求值</li><li><a href="http://www.playgoogle.com/old/post/94.html#cmt224">2009-8-4 10:21:23</a>，tinali ： 写的不错，学习了</li></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/94.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=94</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=94&amp;key=b7e90f8e</trackback:ping></item><item><title>MSSQL2005 孤立用户的解决方法</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/93.html</link><pubDate>Wed, 29 Jul 2009 15:08:47 +0800</pubDate><guid>http://www.playgoogle.com/old/post/93.html</guid><description><![CDATA[<p>&nbsp;Vinehoo.com近日经常遭到攻击，好几次数据库挂马，前几天把论坛升级了，今天又升级了数据库，把之前的MSSQL 2000 升级到MSSQL 2005，用的是数据库还原功能还原的,遇到了这个帐号孤立的问题。</p><p><strong>什么是孤立用户的问题？</strong></p><p>比如，以前的数据库的很多表是用户test建立的，但是当我们恢复数据库后，test用户此时就成了孤立用户，没有与之对应的登陆用户名，哪怕你建立了一个test登录用户名，而且是以前的用户密码，用该用户登录后同样没办法操作以前属于test的用户表。</p><p>Google 了一下，有很多解决方案，不过很多方案没办法实现，因为MSSQL 2005的权限的关系。这里介绍一个经过我验证的解决方法：</p><p><p>我们在建立了同样名称的数据库登录用户后，数据库中的表我们照样不能使用时因为<strong>sid</strong>的不同，就是系统登录表和数据库用户表中的用户名相同，单是sid字段，数据库中的还是以前旧系统的sid值，所以我们就要把它对应成我们新建的，数据库靠sid来识别用户。</p><p>这里可以使用存储过程sp_change_users_login。它有三种动作，分别是report，update_one和auto_fix。运行下面的代码，系统会列出当前数据库的孤立用户数。sp_change_users_login 'report'我们只需要选择当前数据库为testdb，然后运行</p><p><strong>sp_change_users_login 'update_one','test','test'</strong></p><p>系统就会提示修复了一个孤立用户。如果没有建立test的登录用户，还可以用</p><p><strong>sp_change_users_login 'Auto_Fix', 'test', NULL, 'testpassword'</strong></p><p>来创建一个登录用户名为test，密码为testpassword的用户与之对应。通常情况下，数据库对象得到访问问题已经解决了。如果有多个数据库中有同一个用户的数据表，只需要选择不同的数据库，执行update_one的那个就行了。</p><div>&nbsp;</div></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/93.html" target="_blank">继续阅读《MSSQL2005 孤立用户的解决方法》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/22.html">牢记！SQL Server数据库开发的二十一条军规</a>&nbsp;&nbsp;(2008-8-25 10:4:33)</p></ul>]]></description><category>服务器端</category><comments>http://www.playgoogle.com/old/post/93.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=93</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=93&amp;key=657ee862</trackback:ping></item><item><title>onbeforeunload与a标签在IE中的冲突</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/92.html</link><pubDate>Sat, 25 Jul 2009 14:57:51 +0800</pubDate><guid>http://www.playgoogle.com/old/post/92.html</guid><description><![CDATA[<p><strong>onbeforeunload</strong> 是window的一个事件，用来提示用户是否真的要离开该页面，通常在一些比较重要的数据提交之前，防止用户误操作导致数据丢失。典型的应用如gmail中，在写邮件的时候，如果刷新页面或者关闭页面，会出现提示：</p><p><img onload="ResizeImage(this,520)" src="http://www.playgoogle.com/old/upload/confirm.jpg" alt="" title="" /></p><p>今天在项目中发现在IE中点击一些按钮ajax时，在IE中，也会出现这个框，百思不得其解。开始以为是IE中的ajax操作会触发这个事件，后来逐一排查，发现是由于那些按钮是用&lt;a&gt;标签实现的，虽然在href里面写的是&ldquo;javascript:void(0)&rdquo;,但还是会触发<strong>onbeforeunload</strong>事件，以后用a标签做按钮的时候要注意了，避免出现这种冲突。</p><p>点击测试：<a href="http://www.playgoogle.com/demo/onbeforeunload/test.html" target="_blank">onbeforeunload-test.html</a></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/92.html" target="_blank">继续阅读《onbeforeunload与a标签在IE中的冲突》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/105.html">国产JS框架--Como JS 1.0 正式发布</a>&nbsp;&nbsp;(2009-12-23 10:31:41)</p><p><a  href="http://www.playgoogle.com/old/post/103.html">递归练习,做个奥数题</a>&nbsp;&nbsp;(2009-10-28 16:24:29)</p><p><a  href="http://www.playgoogle.com/old/post/96.html">javascript中的memoization(memoizing) 技术介绍</a>&nbsp;&nbsp;(2009-8-5 19:22:19)</p><p><a  href="http://www.playgoogle.com/old/post/94.html">javascript链式调用的设计</a>&nbsp;&nbsp;(2009-7-29 22:19:31)</p><p><a  href="http://www.playgoogle.com/old/post/91.html">基于jQuery UI的图片截取(圈人)功能</a>&nbsp;&nbsp;(2009-7-21 15:0:11)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/92.html#cmt246">2009-10-10 16:24:51</a>，margo ： 汗,我今天也遇到这个问题.  在onbeforeunload 在做清空session和关闭页面.  结果点击页面的链接  呵呵  后面你想的到</li><li><a href="http://www.playgoogle.com/old/post/92.html#cmt216">2009-7-26 9:28:6</a>，<a href="http://www.mobai.org">墨白</a> ： 博主 把那个onbeforeunload的实例代码教程发一份吧？<br/>就是如何实现Gmail里面的功能呢。<br/>学习中……<blockquote><div class="quote quote3"><div class="quote-title">karry 于 2009-7-26 12:53:12 回复</div>很简单啊。<br/>window.onbeforeunload=function test(event){<br/>		return &quot;确认要离开吗？&quot;; <br/>};<br/></div></blockquote></li></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/92.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=92</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=92&amp;key=282703cc</trackback:ping></item><item><title>基于jQuery UI的图片截取(圈人)功能</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/91.html</link><pubDate>Tue, 21 Jul 2009 15:00:11 +0800</pubDate><guid>http://www.playgoogle.com/old/post/91.html</guid><description><![CDATA[<p><img onload="ResizeImage(this,520)" src="../../../upload/2009/7/111.jpg" alt="" title="" /></p><p>现在的SNS网站相册都拥有圈人的功能，也就是在图片上指定的地方画一个框，然后指定该框里是谁。这和裁剪图片的原理是一样的。也就是拖拽功能和resize功能合理的配合。由于jQuery UI 里这两个功能都有比较好的实现，而且效率很不错，所以，我就用jQuery UI 整合实现了一个。</p><p><strong>1.准备工作</strong></p><p>&nbsp;&nbsp; 该功能既然基于jQuery UI 功能，当然需要引入相关的js组件。在这里使用的是jQuery-1.3.3 、jQuery UI 1.7.1中的ui.core.js、ui.dragdrop.js、ui.resize.js</p><p><strong>2.DOM结构与样式的编写</strong></p><p>&nbsp;&nbsp; 上图所示，虚线框和8个小的拖拽按钮如何实现？我采用的是绝对定位的方式。虚线由于有一点动画效果，我用一个小的gif图片来实现的，这里要注意的是，由于使用的是jQuery UI 的组件来实现，在resize 组件中，resize拖拽的按钮的DOM结构已经固定写在了JS里面，所以，只能在依照其规则来写。具体的DOM结构如下：</p><p><img onload="ResizeImage(this,520)" src="../../../upload/2009/7/333.jpg" alt="" title="" /></p><p>其中，&lt;span&gt;标签表示的是四条虚线。后面的8个div表示的是8个拖拽按钮。全部采用绝对定位，这样在改变大小了之后，能够确保样式正确。其中&lt;div class=&quot;frame&quot;&gt;标签是为了解决IE里面绝对bottom无法正常显示加的hack。</p><p>另外，由于拖拽和resize都要求不能超过图片的范围，所以，我将图片和marker标签使用的DOM放在同一个父容器下，父容器的高度和宽度根据图片的大小自动适应，所以，父容器要采用<strong>浮动定位</strong>或者<strong>绝对定位</strong>，具体需要考虑整体的需求。另外，Dom是JS生成的。</p><p>测试 <a target="_blank" href="http://www.playgoogle.com/demo/imageMarker/demo1.html">DOM 结构</a></p><p><strong>3.js的编写</strong></p><p>&nbsp;&nbsp;&nbsp; js我还是按照以往的风格，写成了一个类以方便调用和扩展。其中关键的是jQuery UI 中的两个组件（drag、resize）的调用，的代码如下：</p><div class="code"><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var _this = this;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.$marker.draggable({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>containment:&quot;parent&quot;,</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drag:function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; _this._resize();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; if($.isFunction(_this.opts.drag)){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;_this.opts.drag.call(_this);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop:function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; _this._resize();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; if($.isFunction(_this.opts.dragStop)){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;_this.opts.dragStop.call(_this);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.$marker.resizable({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>handles:&quot;n,e,s,w,se,sw,ne,nw&quot;,</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minHeight:30,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minWidth:30,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resize:function(event,ui) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _this._resize();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($.isFunction(_this.opts.resize)){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; _this.opts.resize.call(_this);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop:function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; _this._resize();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($.isFunction(_this.opts.risizeStop)){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;_this.opts.risizeStop.call(_this);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p></div><p>其中containment:&quot;parent&quot;,是为了控制其多拽范围。也就是只能在父容器中拖拽。 handles:&quot;n,e,s,w,se,sw,ne,nw&quot;是对其拖拽方向的控制，这里表示可以在8个方向上任意拖拽。我写了4个回调函数：drag,resize,dragStop, resizeStrop分别在拖拽中、大小缩放时、拖拽结束时、大小缩放结束时调用。通常可以用来实时获取当前截取框的位置。</p><p>我有一个公开的方法：getPosition() 获取当前位置。获取是一个对象，分别是左上角点的坐标和右下角点的坐标。</p><p>测试 <a target="_blank" href="http://www.playgoogle.com/demo/imageMarker/default.html">完整功能</a></p><p>我只写了前端部分的代码，如果要完成圈人或者截图的功能，是需要后台来支持的。前台把当前框选的位置和大小传给后台，后台再来处理剩下的事。</p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/91.html" target="_blank">继续阅读《基于jQuery UI的图片截取(圈人)功能》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/105.html">国产JS框架--Como JS 1.0 正式发布</a>&nbsp;&nbsp;(2009-12-23 10:31:41)</p><p><a  href="http://www.playgoogle.com/old/post/103.html">递归练习,做个奥数题</a>&nbsp;&nbsp;(2009-10-28 16:24:29)</p><p><a  href="http://www.playgoogle.com/old/post/96.html">javascript中的memoization(memoizing) 技术介绍</a>&nbsp;&nbsp;(2009-8-5 19:22:19)</p><p><a  href="http://www.playgoogle.com/old/post/94.html">javascript链式调用的设计</a>&nbsp;&nbsp;(2009-7-29 22:19:31)</p><p><a  href="http://www.playgoogle.com/old/post/92.html">onbeforeunload与a标签在IE中的冲突</a>&nbsp;&nbsp;(2009-7-25 14:57:51)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/91.html#cmt215">2009-7-26 9:25:39</a>，<a href="http://www.mobai.org">墨白</a> ： 好久不见了~<br/>How r u？<br/>就是这个IE下就是有点卡。。。</li><li><a href="http://www.playgoogle.com/old/post/91.html#cmt214">2009-7-24 22:12:59</a>，<a href="http://pzling.com">鹏衷铃</a> ： 拖动很卡，就这感觉~~</li><li><a href="http://www.playgoogle.com/old/post/91.html#cmt210">2009-7-22 17:31:2</a>，<a href="http://www.cssrain.cn">cssrain</a> ： ie下 拖动选择框 比较慢。</li></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/91.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=91</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=91&amp;key=61f66734</trackback:ping></item><item><title>整理：详解javascript function中的caller,callee,call,apply</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/90.html</link><pubDate>Sat, 04 Jul 2009 11:41:33 +0800</pubDate><guid>http://www.playgoogle.com/old/post/90.html</guid><description><![CDATA[<p><span style="font-size: larger;"><strong>&nbsp;caller</strong></span></p><p>返回一个对函数的引用，该函数调用了当前函数。也就是说，返回的是调用该函数的函数。<br />functionName.caller<br />functionName 对象是所执行函数的名称。</p><p><strong>说明</strong><br />对于函数来说，caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的，那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性，那么结果和 functionName.toString 一样，也就是说，显示的是函数的反编译文本。值得注意的一点是，事件的触发总是带着一个匿名的函数。</p><p>点击查看--<a target="_blank" href="http://www.playgoogle.com/demo/Javascript%20call,apply,caller,callee.html">caller测试示例</a></p><p><br /><span style="font-size: larger;"><strong>callee</strong></span><br /><br />返回正被执行的 Function 对象，也就是所指定的 Function 对象的正文,他是arguments对象的一个属性。[function.]arguments.callee，可选项 function 参数是当前正在执行的 Function 对象的名称。</p><p><strong>说明</strong><br />callee 属性的初始值就是正被执行的 Function 对象。<br /><br />callee 属性是 arguments 对象的一个成员，它表示对函数对象本身的引用，这有利于匿名函数的递归或者保证函数的封装性，例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性，这个属性有时候用于验证还是比较好的。arguments.length是实参长度，arguments.callee.length是形参长度，由此可以判断调用时形参长度是否和实参长度一致。<br /><br />点击查看--<a href="http://www.playgoogle.com/demo/Javascript%20call,apply,caller,callee.html#callee" target="_blank">callee测试示例</a><br /><br /><span style="font-size: larger;"><strong>apply and call</strong></span><br />它们的作用都是将函数绑定到另外一个对象上去运行，两者仅在定义参数方式有所区别：<br />apply(thisArg,argArray);<br />call(thisArg[,arg1,arg2&hellip;] ]);<br />即所有函数内部的this指针都会被赋值为thisArg，这可实现将函数作为另外一个对象的方法运行的目的</p><p><strong>apply的说明</strong><br />如果 argArray 不是一个有效的数组或者不是 arguments 对象，那么将导致一个 TypeError。如果没有提供 argArray 和 thisArg任何一个参数，那么 Global 对象将被用作 thisArg，并且无法被传递任何参数。</p><p><strong>call的说明</strong><br />call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。如果没有提供 thisArg参数，那么 Global 对象被用作 thisArg</p><p><strong>相关技巧：</strong><br />应用call和apply还有一个技巧在里面，就是用call和apply应用另一个函数（类）以后，当前的<br />函数（类）就具备了另一个函数（类）的方法或者是属性，这也可以称之为&ldquo;继承&rdquo;。<br /><br />点击查看--<a href="http://www.playgoogle.com/demo/Javascript%20call,apply,caller,callee.html#callandapply" target="_blank">call 和 apply 测试示例</a></p><p>&nbsp;</p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/90.html" target="_blank">继续阅读《整理：详解javascript function中的caller,callee,call,apply》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/105.html">国产JS框架--Como JS 1.0 正式发布</a>&nbsp;&nbsp;(2009-12-23 10:31:41)</p><p><a  href="http://www.playgoogle.com/old/post/103.html">递归练习,做个奥数题</a>&nbsp;&nbsp;(2009-10-28 16:24:29)</p><p><a  href="http://www.playgoogle.com/old/post/96.html">javascript中的memoization(memoizing) 技术介绍</a>&nbsp;&nbsp;(2009-8-5 19:22:19)</p><p><a  href="http://www.playgoogle.com/old/post/94.html">javascript链式调用的设计</a>&nbsp;&nbsp;(2009-7-29 22:19:31)</p><p><a  href="http://www.playgoogle.com/old/post/92.html">onbeforeunload与a标签在IE中的冲突</a>&nbsp;&nbsp;(2009-7-25 14:57:51)</p></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/90.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=90</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=90&amp;key=ad5999c8</trackback:ping></item><item><title>让IE6瞬间崩溃的5种方式</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/89.html</link><pubDate>Mon, 22 Jun 2009 10:39:33 +0800</pubDate><guid>http://www.playgoogle.com/old/post/89.html</guid><description><![CDATA[<p>经常遇到莫名其妙让IE6崩溃的事情。今天看到了一篇好文章，我整理整理发上来，以后开发的时候要注意了。</p><p>鉴于国内IE6的市场份额还在主流的情况，一定要避免出现以下情况。</p><p>IE6真脆弱啊<img alt="" src="http://www.playgoogle.com/old/image/face/Hehe.gif" /></p><p>1.设置<strong>scrollbar-base-color</strong>，css里给table做了定位，再通过js改变其定位IE6就崩溃了。</p><p>关键代码：</p><div class="code">&lt;style type=&quot;text/css&quot;&gt; <br />&nbsp; html, body {<br />&nbsp;&nbsp;&nbsp; <strong>scrollbar-base-color: #330066;</strong><br />} <br />.crash {<br />position:absolute;<br />left:200px;<br />top:200px;<br />width:200px;<br />} <br />&lt;/style&gt;<br />&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br />&nbsp;&nbsp;&nbsp; function galgenfrist() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.setTimeout('crashIE();',1000);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; function crashIE() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var moveNode = document.getElementById(&quot;move&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(moveNode) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; moveNode.style.top = &quot;100px&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; moveNode.style.left = &quot;200px&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &lt;/script&gt;<br />&lt;body onload=&quot;galgenfrist();&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;div id=&quot;move&quot; class=&quot;crash&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tbody&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;textarea&gt;&lt;/textarea&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/table&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />&lt;/body&gt;</div><p>用IE6点击测试：<a href="http://www.playgoogle.com/demo/iedead/1.html" target="_blank">ie6崩溃测试一</a></p><p><strong>2.document.write</strong></p><div class="code"><p>&lt;script&gt;for (x in document.write) { document.write(x);}&lt;/script&gt;</p></div><p>在FF和Chrome中，都会打印出&ldquo;prototype&rdquo;字符，在IE6中立即崩溃。</p><p>用IE6点击测试：<a href="http://www.playgoogle.com/demo/iedead/2.html" target="_blank">ie6崩溃测试二</a></p><p><strong>3.在CSS中使用通配符*,在HTML的table标签中直接放置内容（而不是&lt;tr&gt;标签之类）</strong></p><div class="code">&lt;style&gt;*{position:relative}&lt;/style&gt;&lt;table&gt;aaabbbccc&lt;/table&gt;</div><p>用IE6点击测试：<a href="http://www.playgoogle.com/demo/iedead/3.html" target="_blank">ie6崩溃测试三</a></p><p><strong>4.CSS中出现@+任意字符+/* 立即崩溃</strong></p><div class="code">&lt;style&gt;@;/*&lt;/style&gt;</div><p>用IE6点击测试：<a href="http://www.playgoogle.com/demo/iedead/4.html" target="_blank">ie6崩溃测试四</a></p><p><strong>5.onload=&quot;window()&quot;</strong></p><div class="code"><pre>&lt;body onload=&quot;window()&quot;&gt;&lt;/body&gt;</pre></div><p>用IE6点击测试：<a href="http://www.playgoogle.com/demo/iedead/5.html" target="_blank">ie6崩溃测试五</a></p><p>原文网址：<a target="_blank" href="http://www.catswhocode.com/blog/6-html-and-javascript-codes-to-crash-ie6">http://www.catswhocode.com/blog/6-html-and-javascript-codes-to-crash-ie6</a></p><p>注：原文中有6个导致崩溃的问题，我装的是IETester,有一个没有测出来。所以没写上来。</p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/89.html" target="_blank">继续阅读《让IE6瞬间崩溃的5种方式》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/98.html">三栏布局，左右固定宽度，中间自适应的一种解决方案</a>&nbsp;&nbsp;(2009-8-18 13:42:28)</p><p><a  href="http://www.playgoogle.com/old/post/97.html">可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks</a>&nbsp;&nbsp;(2009-8-10 10:47:28)</p><p><a  href="http://www.playgoogle.com/old/post/86.html">【收藏】CSS技巧教程资源大全</a>&nbsp;&nbsp;(2009-6-17 13:29:55)</p><p><a  href="http://www.playgoogle.com/old/post/72.html">【收藏】字体、排版简明入门</a>&nbsp;&nbsp;(2009-4-1 10:58:52)</p><p><a  href="http://www.playgoogle.com/old/post/61.html">WebKit私有属性介绍</a>&nbsp;&nbsp;(2009-3-13 21:32:5)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/89.html#cmt204">2009-7-5 17:37:23</a>，<a href="http://feerbook.com">yaugle</a> ： 你的文章很精彩，欢迎到feerbook.com提交你的文章与更多网友分享</li><li><a href="http://www.playgoogle.com/old/post/89.html#cmt200">2009-6-30 21:1:6</a>，<a href="http://www.mobai.org">墨白</a> ： 超级讨厌IE6</li><li><a href="http://www.playgoogle.com/old/post/89.html#cmt197">2009-6-22 21:19:33</a>，karry ： @cssrain 第三种情况时有出现。特别是后台工程师循环读数据时。我就遇到过这样的情况。</li><li><a href="http://www.playgoogle.com/old/post/89.html#cmt196">2009-6-22 20:48:41</a>，<a href="http://www.cssrain.cn">cssrain</a> ： 没人会这么去写吧。 <br/>很佩服作者能想出这些怪异的东西，但并不实用 ，并且实际中 上面说的5种情况 几乎 遇不到。</li><li><a href="http://www.playgoogle.com/old/post/89.html#cmt195">2009-6-22 16:28:39</a>，<a href="http://fishyoyo.com">博译论</a> ： 呵呵，好玩<br/>鉴于国内IE6的市场份额还在主流的情况，一定要多想让IE6早点退出舞台的方法！</li></ul>]]></description><category>XHTML+CSS</category><comments>http://www.playgoogle.com/old/post/89.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=89</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=89&amp;key=3232dd0f</trackback:ping></item><item><title>jQuery的不足之处</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/88.html</link><pubDate>Sat, 20 Jun 2009 20:54:04 +0800</pubDate><guid>http://www.playgoogle.com/old/post/88.html</guid><description><![CDATA[<p>使用Jquery一年多了，对Jquery轻便、易学易用、方便的DOM操作以及这个框架的设计思想都由衷的赞叹。但是Jquery在设计过程中也有一些不合理的地方（当然，有些东西见仁见智，可能你并不觉得这不合理），今天看到了一篇文章，觉得写的挺有道理的，我做了一下整理。并不是说Jquery很差，让大家不要用，而是通过这些内容来更好的了解和使用jQuery。</p><p><strong>1.each工具的回调函数参数的设计。</strong></p><div class="code"><p>jQuery.each(obj,callback)</p><div>通用遍历方法，可用于遍历对象和数组。</div><div class="longdesc">不同于遍历 jQuery 对象的 $().each() 方法，此方法可用于遍历任何对象。回调函数拥有两个参数：<strong>第一个为对象的成员或数组的索引</strong>，<strong>第二个为对应变量或内容</strong>。 如果需要退出 each 循环可使回调函数返回 false，其它返回值将被忽略。</div></div><p>很明显，这个参数的设计不合理。应该将参数的顺序对调。原因很简单，通常做遍历的时候，我们只需要获取当前对应的变量或内容就可以了，大多数情况下是不需要索引的。如果索引参数在后面，在不使用的情况下就可以省略。也许你觉得我在鸡蛋里面挑骨头,你看看jQuery的另外一个工具的设计就清楚了：</p><div class="code">jQuery.grep(array,callback,[invert])</div><p>这个工具是对对象和数组做遍历用的，但是这个工具的callback函数的两个参数中第一个为<strong>对应变量或内容</strong>，第二个为<strong>对象的成员或数组的索引。正好与jQuery.each相反。</strong></p><p><strong>2.this指针的变换</strong></p><p>在jQuery中this指针的变换是非常频繁的，可能稍不留神，就会出错。特别是在OO编程的时候。例如：</p><div class="code"><p>function Dog(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name=&quot;旺财&quot;;<br />}</p><p>Dog.prototype.eat=function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&quot;div&quot;).click(function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(this.name+&quot;在啃骨头&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />};</p></div><p>&nbsp;你会发现这段代码并不会像你想象的那样执行，因为this指针已经变换，指代的是当前的div对象，而不是Dog的实例。</p><p><strong>3.jquery.inArray(value,array<strong>)工具的设计</strong></strong></p><p>&nbsp;就字面意思来说，这个函数应该返回true or false,事实上返回的是value在array第一次出现的位置。若不存在，返回-1。若你当作true或false来处理，就郁闷了，-1是true。</p><p><strong>4.对OO的支持不够</strong></p><p>&nbsp; jquery的DOM操作的支持很好很强大，但在OO方面却没有做任何工作。而且，就jQuery的编码风格也和OO有点格格不入。而其他框架如prototype,MooTools都有比较好的支持。</p><p>参考文章网址：<a target="_blank" href="http://blog.thinkrelevance.com/2009/1/12/why-i-still-prefer-prototype-to-jquery">http://blog.thinkrelevance.com/2009/1/12/why-i-still-prefer-prototype-to-jquery</a></p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/88.html" target="_blank">继续阅读《jQuery的不足之处》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/105.html">国产JS框架--Como JS 1.0 正式发布</a>&nbsp;&nbsp;(2009-12-23 10:31:41)</p><p><a  href="http://www.playgoogle.com/old/post/103.html">递归练习,做个奥数题</a>&nbsp;&nbsp;(2009-10-28 16:24:29)</p><p><a  href="http://www.playgoogle.com/old/post/96.html">javascript中的memoization(memoizing) 技术介绍</a>&nbsp;&nbsp;(2009-8-5 19:22:19)</p><p><a  href="http://www.playgoogle.com/old/post/94.html">javascript链式调用的设计</a>&nbsp;&nbsp;(2009-7-29 22:19:31)</p><p><a  href="http://www.playgoogle.com/old/post/92.html">onbeforeunload与a标签在IE中的冲突</a>&nbsp;&nbsp;(2009-7-25 14:57:51)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/88.html#cmt217">2009-7-27 13:46:54</a>，yun ： 第二个问题你不用jq。它的this就能指向dog实例了？？？<blockquote><div class="quote quote3"><div class="quote-title">karry 于 2009-7-27 15:14:48 回复</div>呵呵，开篇就说了，这种东西见仁见智，jQuery这么设计是为了方便链式操作，当然也有他的道理，我只是从反面说说而已。</div></blockquote></li><li><a href="http://www.playgoogle.com/old/post/88.html#cmt203">2009-7-4 13:17:37</a>，<a href="http://blog.blackbing.net">BLACKBING</a> ： 2的問題跟jquery沒關係吧，這本來就是javascript中this 關鍵字的特性了。</li></ul>]]></description><category>Javascript</category><comments>http://www.playgoogle.com/old/post/88.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=88</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=88&amp;key=d760eaed</trackback:ping></item><item><title>【收藏】详解CSS的优先权</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/87.html</link><pubDate>Fri, 19 Jun 2009 10:47:54 +0800</pubDate><guid>http://www.playgoogle.com/old/post/87.html</guid><description><![CDATA[<p>转自：<a target="_blank" href="http://www.planabc.net/2008/05/06/css_specificity/">怿飞</a></p><div class="entry-content"><p>发现很多朋友对 CSS 的优先权不甚了解，规则很简单。需要说明的一点，如果你的样式管理需要深层判断 CSS 的优先权，更应反思自己的 CSS 代码，是否合理？是否优化？</p><p><a title="CSS2.1" target="_blank" href="http://www.w3.org/TR/CSS21">CSS2.1</a> 中规定了关于 CSS 规则 <a title="Calculating a selector's specificity" target="_blank" href="http://www.w3.org/TR/CSS21/cascade.html#specificity">Specificity</a>（特异性）的计算方式，用一个四位的数字串（注：CSS2 中是用三位）来表示，最后以 Specificity 的高低判断 CSS 的优先权。</p><p>Specificity 具体的计算规则：</p><ul>    <li>元素的 style 样式属性，加 1,0,0,0。</li>    <li>每个 ID 选择符（#id），加 0,1,0,0。</li>    <li>每个 class 选择符（.class）、每个属性选择符（例 [attr=&rdquo;&quot;] ）、每个伪类（例 :hover），加 0,0,1,0。</li>    <li>每个元素或伪元素（例 :firstchild）等，加 0,0,0,1。</li>    <li>其他选择符（例 全局选择符 *，子选择符 &gt;），加 0,0,0,0。</li></ul><p>最后逐位相加数字串，得到最终的 Specificity 值，按照从左到右的顺序逐位比较。</p><p>除了 Specificity 还有一些其他规则：</p><ul>    <li>!important 声明的规则高于一切，如果 !important 声明冲突，则比较优先权。</li>    <li>如果优先权一样，则按源码中&ldquo;后来者居上&rdquo;的原则。</li>    <li>由继承而得到的样式属性不参与 specificity 的计算，低于一切其他规则（例 全局选择符 * ）。</li></ul><p>范例分析：</p><div class="code"><span class="pln">h1 </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;}</span><span class="pln"><br /></span><span class="com">/* 只有一个普通元素加成，结果是 0,0,0,1 */</span><span class="pln"><br />body h1 </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;}</span><span class="pln"><br /></span><span class="com">/* 两个普通元素加成，结果是 0,0,0,2 */</span><span class="pln"><br /></span><span class="com">/*0,0,0,1 小于 0,0,0,2 ，后者胜出*/</span><span class="pln"><br /><br />h2</span><span class="pun">.</span><span class="pln">grape </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> purple</span><span class="pun">;}</span><span class="pln"><br /></span><span class="com">/* 一个普通元素、一个class选择符加成，结果是 0,0,1,1*/</span><span class="pln"><br />h2 </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> silver</span><span class="pun">;}</span><span class="pln"><br /></span><span class="com">/*一个普通元素，结果是 0,0,0,1 */</span><span class="pln"><br /></span><span class="com">/*0,0,1,1 大于 0,0,0,1 ，前者胜出*/</span><span class="pln"><br /><br />html </span><span class="pun">&gt;</span><span class="pln"> body table tr</span><span class="pun">[</span><span class="pln">id</span><span class="pun">=&rdquo;</span><span class="pln">totals</span><span class="pun">&rdquo;]</span><span class="pln"> td ul </span><span class="pun">&gt;</span><span class="pln"> li </span><span class="pun">{</span><span class="pln">color</span><span class="pun">:</span><span class="pln"> maroon</span><span class="pun">;}</span><span class="pln"><br /></span><span class="com">/* 7个普通元素、一个属性选择符、两个其他选择符（子选择符 &gt;），结果是0,0,1,7 */</span><span class="pln"><br />li</span><span class="com">#answer {color: navy;}</span><span class="pln"><br /></span><span class="com">/* 一个ID选择符，一个普通选择符，结果是0,1,0,1 */</span><span class="pln"><br /></span><span class="com">/*0,0,1,7 小于 0,1,0,1，后者胜出*/</span></div><p>节选 old9 的<a href="http://old9.blogsome.com/2006/03/13/css_conflict_resolve/" target="_blank" title="CSS的优先权">《CSS的优先权》</a>（无法穿越 GFW）</p><script type="text/javascript">AKPC_IDS += "67,";</script></div><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/87.html" target="_blank">继续阅读《【收藏】详解CSS的优先权》的全文内容...</a></p><p><a href="http://www.playgoogle.com/old/post/87.html#comment" target="_blank">找不到相关文章，请发表流言</a></p>]]></description><category>XHTML+CSS</category><comments>http://www.playgoogle.com/old/post/87.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=87</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=87&amp;key=bca00829</trackback:ping></item><item><title>【收藏】CSS技巧教程资源大全</title><author>vinehoo@gmail.com (karry)</author><link>http://www.playgoogle.com/old/post/86.html</link><pubDate>Wed, 17 Jun 2009 13:29:55 +0800</pubDate><guid>http://www.playgoogle.com/old/post/86.html</guid><description><![CDATA[<h2>一，Web 标准</h2><p>要玩游戏，就得先了解规则。要学CSS，就应该先了解一下Web标准。尽管看上去不是必须的(我在学CSS之前，根本不知道也不想知道Web标准是 个啥玩意儿)。应该说，你是否学Web标准，跟你是否能学会CSS没有什么关系，但跟你能写出什么样的CSS，以及XHTML或其它代码，跟你能做出什么 质量的网页有很大的关系。</p><p><img onload="ResizeImage(this,520)" alt="" title="" src="../../../upload/2009/6/sw-stack-2005.png" /></p><p>其实我自己对Web标准也不甚了解，尽管我看过不少关于Web标准的文章和书。(我总是这样，对学术性的概念名词永远都似懂非懂的)，所以每次谈到Web标准，我头里就会有一堆问号:</p><ol>    <li>Web标准真的有利于SEO吗？ Web标准的动机难道就是SEO? 出于SEO动机的Web标准是否会失去一些Web标准真正的本质?</li>    <li>如何才算符合Web标准? 仅仅是通过W3C的代码验证，你就觉得自己符合Web标准了?</li>    <li>Web标准是为了提升用户体验，而一个对用户友好的网站其代码应该写得非常简洁实用，而一个使用简洁实用代码的网站是有利于SEO的。这个逻辑似乎合情合理，但在实际运用中却又总有这样那样的冲突&hellip;</li>    <li>&hellip;</li></ol><h3>我们应该把Web标准看成一份&rdquo;道德约束&rdquo;还是&rdquo;法律强制&rdquo;呢?</h3><p>我个人比较乐意看成前者，努力靠拢就好了，但没必要为了标准而标准，自己为难自己。</p><ol>    <li>你已经花了50%的时间完成了一个项目的90%，如果余下的10%又需要你花50%的时间去弄，是否值得? 尤其是这种情况发生在: 你的90%已可以让用户在各个浏览器下正可常浏览，而那10%仅仅是为了通过W3C代码验证。这时候你或许该考虑下，你千辛万苦的通过W3C验证是为了符 合Web标准还是为了满足自己小小的虚荣心?</li>    <li>特喜欢跟别人争论&rdquo;DIV+CSS&rdquo;的说法是错误的，应该是&rdquo;XHTML+CSS&rdquo;，你有没有做过类似这样的事儿? 还打心里为自己科学家般严谨的态度而感到自豪。 但事实上，叫&rdquo;DIV+CSS&rdquo;的人，没有哪个傻到整个页面的元素都使用DIV。这就像当你说&rdquo;吃饭&rdquo;时，你也不光是吃白花花的大米。</li></ol><p>呃，本来只是想随便写点文章引语，闲扯太多了，还是看看下面这些有关Web标准的东西吧，有助于你了解这个东西。</p><h3>一些有Web标准的文章</h3><ol>    <li><a target="_blank" href="http://www.w3cn.org/what/index.html">什么是Web标准?</a></li>    <li><a target="_blank" href="http://www.w3cn.org/article/tips/2007/123.html">Web标准概念入门</a></li>    <li><a target="_blank" href="http://www.w3cn.org/benefits/index.html">使用Web标准的好处</a></li>    <li><a target="_blank" href="http://www.cssforest.org/blog/index.php?id=123">对Web标准的理解 | CSS森林</a></li>    <li><a target="_blank" href="http://www.webstandards.org/2008/11/24/web-standards-in-china/">Web standards in China (英文</a>) | <a target="_blank" href="http://www.blueidea.com/tech/web/2008/6297.asp">中译 &ndash; Web标准在中国</a></li>    <li><a target="_blank" href="http://www.aoao.org.cn/blog/2007/09/towards-a-semantic-web/">步向语义网的几句话 | 样式之美</a></li>    <li><a target="_blank" href="http://www.iselong.com/online/web-standards.pdf">Web标准和网站重构 (PDF文档)</a></li>    <li><a target="_blank" href="http://www.yzznl.cn/archives/222.html">WEB标准专题之精华文章汇总</a></li>    <li><a target="_blank" href="http://www.cnblogs.com/yuntian/archive/2009/05/26/1489089.html">Web标准的未来，浏览器的未来，应用的未来 | YunTian<br />    </a></li>    <li><a target="_blank" href="http://bbs.blueidea.com/thread-2692909-1-1.html">Web标准常见问题整理 | 蓝色理想BBS</a></li>    <li><a target="_blank" href="http://www.javaeye.com/topic/333321">网站重构Web标准视频教程 | YuYaDong</a></li>    <li><a target="_blank" href="http://blog.csdn.net/webwalker/articles/2102450.aspx">Web标准要求一览表</a></li>    <li><a target="_blank" href="http://www.downcodes.com/info/2009/05/30/20090530-929.html">初学Web标准的几个误区</a></li>    <li><a target="_blank" href="http://www.downcodes.com/info/2009/05/30/20090530-1383.html">你在骗W3C，还是在骗自己的客户</a></li>    <li><a target="_blank" href="http://www.downcodes.com/info/2009/05/30/20090530-1379.html">Six Revisions 访谈：大学里的 Web 标准 上</a>，<a target="_blank" href="http://www.downcodes.com/info/2009/05/30/20090530-1378.html">下</a></li>    <li><a target="_blank" href="http://blog.bingo929.com/china-web-standards.html">中国的Web标准现状</a></li></ol><h3><a target="_blank" href="http://www.yeeyan.com/articles/view/82460/44390">验证HTML，CSS及RSS源的14个免费工具</a></h3><p>这篇译文里介绍了14个工具可以方便的验证你的CSS以及HTML和RSS源。你别看我上面说了一堆看似反验证的话，其实我也挺在乎这个东西的，我也每次都玩验证，只是当碰到很难解决无关痛痒的东西时，我不会为难自己。我只是想告诉你，别对自己太苛求了，别让自己太累。</p><h2>二， CSS布局和定位</h2><p>我不是什么Web前端观察家，我个人发现的两个可能并不正确的网页布局趋势是: <strong>两栏和水平条</strong>。</p><p>说两栏是趋势似乎有点唬烂，两栏本身就是最基本最常用的布局，但之所以成为更加流行的网页设计趋势得益于Web 2.0的流行，你很少会看到一个Web 2.0网站把自己做成门户般的杂志型布局，大家都力求简洁。当然，在国内，还是有很大一部份个人站长和企业喜欢把自己的网站挤得密密麻 麻，Magazine的非常厉害。这恐怕也不能说谁前卫谁落后，好的Magazine布局确实能让人产生一个感觉或错觉: 这个网站很专业，做的很大，很优。我个人是希望简洁两栏真的能成为趋势，每次进入门户型布局的非门户级网站时，就感觉自己掉进了一堆链接的海洋里。</p><p>水平条成为趋势则源于宽屏浏览器的普及，它能让你的网页不管在各种宽屏分辨率下显得协调美观。比如帕兰映像的网页主体是960像素固定宽度，我的电 脑分辨率是1440*990像素，如果没有水平条，总感觉网页太空，尽管留白也是一种设计技巧，但并不是这样的留白。尽管还有另一种解决方案是自适应宽 度，但我个人觉得，对于大多数网站来说，自适应宽度并不是一个好方法，它解决了宽度的问题，却又让网页产生了很大其它破坏视觉的问题。</p><p>还是让我们看一些关于CSS布局的技巧吧。</p><p><img onload="ResizeImage(this,520)" alt="" title="" src="../../../upload/2009/6/css-layouts.png" /></p><h3><a target="_blank" href="http://www.qianduan.net/15-extremely-useful-css-grid-layout-generators.html">15款网格布局生成器</a></h3><p>网格布局的页面能给人简洁明快、层次分明的感觉。之前帕兰映像里面也介绍过一些网格布局相关的文章: <a href="http://parandroid.com/discover-minimalistic-design/">探索极简派设计/Minimalist Design</a>，<a target="_blank" href="http://parandroid.com/32-meshs-website-design-appreciate/">32个网格布局的网页设计欣赏</a>和<a target="_blank" href="http://parandroid.com/mesh-design-for-the-960-grid-system/">960网格系统</a>等。如果你也想制作一个网格布局，可以看看这些在线生成器。</p><h3><a target="_blank" href="http://parandroid.com/9-timeless-column-3-of-the-css-layout-skills/">9个永不过时的CSS 3栏布局技巧</a></h3><p>我喜欢3栏布局的网页设计，尽管时下正火的Web2.0似乎很少采用3栏布局。但没关系，我们是非非非主流。 但是3栏布局相对来说就比较复杂，有些难以控制，Noupe发表一篇文章，收集了9个号称永不过时的三栏布局设计技巧(9 Timeless 3 Column Layout Techniques)。</p><h3><a target="_blank" href="http://www.iwanna.cn/archives/2009/05/07/983/">五种方法让CSS实现垂直居中</a></h3><p>使用 CSS 实现垂直居中并不容易。有些方法在一些浏览器中无效。本文里介绍了使对象垂直集中的5种不同方法，以及它们各自的优缺点。</p><h3><a target="_blank" href="http://www.52css.com/article.asp?id=1055">CSS布局口诀</a></h3><p>网络上有朋友把CSS BUG编成了顺口溜了！是否有效不好说，但至少是蛮有趣的。</p><h3><a target="_blank" href="http://blog.bingo929.com/three-column-fixed-layout-structure-using-css.html">使用CSS创建三列固定布局结构</a></h3><p>讲解如何通过设计一个HTML/CSS的基本结构，来创造一个简单且常用的三列式固定页面布局。</p><h3><a target="_blank" href="http://blog.bingo929.com/css-vertical-center.html">使用CSS完美实现垂直居中的方法</a></h3><p>使用XHTML+CSS来实现元素的垂直居中一直是前端开发中的一个比较复杂且棘手的问题，作为网页设计师或前端开发工程师，这个垂直居中问题也是 必须掌 握的技巧之一，一些互联网公司面试题中也会出现这类题目。本文分享一个由aka Yuh?发明完美通过CSS实现垂直居中的方法。</p><h3><a target="_blank" href="http://lifesinger.org/blog/?p=631">渐进增强式布局探讨（上）</a>、<a target="_blank" href="http://lifesinger.org/blog/?p=659">（下）</a></h3><p>经典得一塌糊涂的表格布局，在渐进增强面前落花流水&mdash;&mdash;表格布局要求书写HTML代码时，首先考虑布局，而不是内容。不啰嗦，直接枪毙。</p><h3><a target="_blank" href="http://parandroid.com/css-layout-best-guinness/">CSS布局大全</a></h3><p>这份列表收集一些比较优秀的CSS布局，这些布局都免费供个人和商业使用。当然，你使用之前还是得看版权说明，也许会发生许可协议变更。 Layout Gala- 这个网站收集了40多个专业的CSS布局，每个布局都通过了CSS和HTML验证，且不需要Hack，兼容各大主流浏览器。</p><h3><a target="_blank" href="http://www.yeeyan.com/articles/view/47543/34201">43个PSD转xHTML+CSS网页布局及导航教程</a></h3><p>推荐43个实例xHTML+CSS(DIV+CSS)网页及导航布局教程，在国外也可以叫做PSD2XHTML。如果你是以为网 页设计师，可能会对将自己的效果图实现成语义化的xHTML页面感到头痛，还有一些CSS初学者对于xHTML+CSS处于懵懂状态，希望大家通过这43 个&rdquo;DIV+CSS&rdquo;实例教程学习到语义化xHTML+CSS布局的精髓，即使你已经成为高手，我也相信其中有你值得学习的地方。</p><h3><a target="_blank" href="http://www.qianduan.net/css-position.html">CSS Position</a></h3><p>这篇文章详细介绍了CSS定位属性Position的各个值的用法，和一些实例说明，以及相关的绝对定位布局和清除浮动列等CSS技巧。</p><h3><a target="_blank" href="http://www.blueidea.com/tech/web/2007/4577.asp">详解css定位与定位应用</a></h3><p>定位一直是WEB标准应用中的难点，如果理不清楚定位那么可能应实现的效果实现不了，实现了的效果可能会走样。如果理清了定位的原理，那定位会让网页实现的更加完美。</p><h3><a href="http://xn--css%7bposition-6c8sw90fx4bj36aa1072ftttbis6etdsa/">跨浏览器的CSS固定定位{position:fixed}</a></h3><p>使用Position:fixed属性可以实现固定元素于窗口某位置，比如<a target="_blank" href="http://parandroid.com/">帕兰映像</a>的头部工具栏和底部工具栏就是使用这种效果, 但IE6并不支持这个属性，帕兰映像里使用的方法是利用IE的条件注释让IE6下非固定，显示不同样式。如果你想实现高度统一，可以看看这篇文章教你如何实现。</p><p><a target="_blank" href="http://parandroid.com/css-layout-best-guinness/">32个网格布局的网页设计欣赏</a></p><p>这些设计里面，有紧凑型的网格布局设计，同样也有使用大量空白间距的网格布局。</p><h2>三，CSS Sprites(CSS图片合并技术)</h2><p>最初知道CSS Sprites的时候，大家都还不知道该如何恰当的翻译这个技术名词，有人称其为CSS妖精，CSS小鬼等，听上去是蛮可爱蛮特别的，但会让人纳闷这倒底是个什么东西。最近发现大家开始把这项CSS技术称为图片合并，感谢还是蛮贴切的。</p><p>CSS Sprites目前已经成为非常流行的CSS技术应用，你随便到一个经常逛的著名网站看看，会发现大家都在使用这项技术，比如淘宝、谷歌、豆瓣、土豆等等等等。简单的说，<strong>CSS Sprites主要就是提高网页载入速度和防止图片加载延迟</strong>，这对于大流量的网站来说是非常重要的。</p><p><img onload="ResizeImage(this,520)" alt="" title="" src="../../../upload/2009/6/nav_logo4.png" /></p><p>学习CSS Sprites是件很简单的事情，比较麻烦的是合并图片和写CSS时的定位，更麻烦的后期的维护管理。但不管怎样，做为一项有效实用的CSS技术来说，如果你是一个Web前端开发者，你很有必要掌握这项小技术。</p><h3><a target="_blank" href="http://www.qianduan.net/css-spriting-tips.html">CSS Sprites的一些技巧 | 前端观察</a></h3><p>本文的目的并不是讲CSS Sprite如何让一个网站更快，而是说一些使用CSS Sprite的时候的一些最佳实践。</p><h3><a target="_blank" href="http://www.mangguo.org/css-foreground-image-merge-technology/">CSS 前景图片合并技术 | 芒果</a></h3><p>不只背景图片可以合并，前景图片同样可以合并，本文介绍了Google网页里是如何对两个元素进行定位和溢出截断，来实现前景的图片合并。</p><p>P.S  其实才学习CSS Sprites的时候，就想着前景图片也一定是可以合并的，可自己却又一下子想不出来什么方法。看过这篇文章后，才发现是如此的简单，不禁为自己的智商挫败了好几秒 <img title="60+CSS技巧教程资源大全" class="wp-smiley" alt=":)" src="http://parandroid.com/wp-includes/images/smilies/icon_smile.gif" /></p><h3><a target="_blank" href="http://blog.bingo929.com/css-sprites-css-techniques-tools-tutorials.html">CSS Sprites(CSS图像拼合技术)教程、工具集合</a></h3><p>非常非常全面的一篇文章，详细介绍了什么是CSS Sprites,  哪些著名网站使用了CSS Sprites，使用更好的使用CSS Sprites等等。</p><h3><a target="_blank" href="http://www.yeeyan.com/articles/view/seasun/40032">CSS Sprites + 圆角</a></h3><p>我知道现在有成千上万个关于 用CSS处理圆角 的教程，但不管怎么说，我仍然想把这篇文章展示给您。也希望您会发现这篇文章会非常有用。需要重点指出的是，这篇教程彻底地应用高级CSS技术，但是，我 会尽力使初学者看起来简单。CSS3 在这里还没有得到完全的应用，所以，知道现在，我会保持W3C验证的有效。</p><h3><a target="_blank" href="http://www.mangguo.org/css-sprites-image-cut-and-optimize-skill/">CSS Sprites, 图片切割与优化技术</a></h3><p>这篇文章不是告诉你什么是CSS Spries，也不是告诉你如何使用CSS Sprites，而是 &mdash;&mdash; <strong>为什么要使用CSS Sprites</strong>?</p><h2>四，CSS优化</h2><p><img title="" alt="" onload="ResizeImage(this,520)" src="../../../upload/2009/6/example2-wrong.png" /></p><p>我个人对CSS优化的看法是:</p><p><strong>在语义化的前提下，对代码进行精简。如果是大型网站，则又考虑CSS的结构化和模块化</strong></p><p>。所以CSS的优化就包含了命名规范、CSS Reset、语义化、结构化和模块化等等。</p><p>至于CSS与SEO一说，倒还真不敢苟同。不过，不管它们是否有关联，你都应该尽量去学着写出一份拥有良好语义并尽量简洁高效的CSS样式表。</p><h3><a rel="bookmark" title="8款在线CSS优化工具/组织和压缩CSS" href="http://parandroid.com/8-online-css-optimizer/">8款在线CSS优化工具/组织和压缩CSS</a></h3><p>CSS的优化通常包括两方面: 格式化CSS和精简CSS。精简CSS的办法是把具有相同属性的元素合并在一起，但这会降低代码的可读性，使代码的后期维护很麻烦，稍不注意就出错。格式 化CSS一般就是多行模式或单行模式的选择。本文里面介绍了8款工具能让你方便的优化和格式化CSS的在线工具。</p><h3><a target="_blank" href="http://parandroid.com/css-code-streamlined-tools-and-tricks/">CSS代码精简工具和技巧</a></h3><p>管通常一个CSS文件占用不了什么带宽, 但之于网页设计, 在不影响整个网页构架与功能的情况下, 网页文件越小越好. 因为更小的网页文件有利于缩短页面的载入时间. 更重要的是, 相同的页面排版和结构, 能用最简洁的代码来实现, 也应该是每个网页设计师对自己的一种要求.</p><h3><a target="_blank" href="http://parandroid.com/17-to-accelerate-the-efficiency-of-the-css-tools/">17款加速效率的CSS工具</a></h3><p>作为一个网站设计/开发人员，你必须不断寻找方法来减少设计/开发过程中所花费的时间。这对于提高你的工作效率并最大化你的利润是非常重要的。下面介绍的按功能分类的CSS工具可以有效地节省你设计网站的时间。</p><h3><a target="_blank" href="http://blog.bingo929.com/10-css-shorthand-tips.html">10个CSS简写技巧让你永远受用</a></h3><p>CSS简写就是指将多行的CSS属性声明化成一行，又称为CSS代码优化。CSS简写的最大好处就是能够显著减少CSS文件的大小，其实还有很多其 他益处。臃肿而杂乱的CSS样式表会使你遇到问题是难以调试。尤其是当一个团队在进行设计的时候，你的臃肿的CSS代码会使你的团队其他成员的工作效率下 降。</p><h3><a target="_blank" href="http://zmingcx.cn/pay-attention-to-seo-search-optimization-div-css-naming.html">注重SEO搜索优化的div+css命名规则 | 知更鸟</a></h3><p>CSS的命名规则入手会有意想不到的收获，最基础的就是最有效的。 下面从前端设计的角度整理的DIV+CSS的命名规则，就很好地考虑到了搜索引擎的喜好，在页面设计的过程中，尽量做你懂，搜索引擎也懂，何乐而不为呢。</p><h3><a target="_blank" href="http://blog.bingo929.com/web-ui-design-name-convention.html">W</a><a target="_blank" href="http://blog.bingo929.com/web-ui-design-name-convention.html">eb UI 设计(网页设计)命名规范</a></h3><p>Web  UI设计命名规范，也就是网站用户界面设计(俗称网页设计)命名规范。这套规范并非单纯的CSS、html或JavaScript命名规范，它涉及了很多使用PhotoShop这类设计工具进行网页设计过程中的命名规范。</p><h3><a target="_blank" href="http://blog.bingo929.com/css-reset-collection.html">目前比较全的CSS重设(reset)方法总结</a></h3><p>收集了15套CSS重设实例，您可以在前端开发工作中进行参考和使用，有些是很简化的CSS Reset，有些则是非常复杂非常全面的CSS Reset，至于使用哪套，全看您的爱好或需要。</p><h3><a target="_blank" href="http://blog.bingo929.com/category/technology/css/page/3">CSS代码命名惯例语义化的方法</a></h3><p>CSS代码的命名惯例一直是大家热门讨论的话题。本文通过分析一个流行三栏布局中的必要元素，来为大家讲解关于使用语义化方法替代结构化方法来命名CSS类的建议和指导。</p><h3><a target="_blank" href="http://www.happinesz.cn/archives/986/">模块化 CSS &ndash; 更有效地管理CSS | 幸福收藏夹</a></h3><p>关于如何模块化CSS来实现更有效管理CSS的一些见解。</p><h3><a target="_blank" href="http://www.yeeyan.com/articles/view/oceaniver/9104">编写具有良好结构的CSS文件</a></h3><p>这是一篇关于如何编写具有良好结构的CSS文件的帖子。我已经讲过CSS文件的代码可读性，但在讨论之后，一些更具体的要求被提出（主要是关于一些读者在管理具有大量布局元素CSS文件时的困难之处），所以我决定在这些案例中说明我自己的开发流程。</p><h3><a target="_blank" href="http://lifesinger.org/blog/2009/02/the-order-css-rules/">CSS中属性的书写顺序</a></h3><p>我个人是觉得讨论CSS属性的书写顺序有点没意义，或者说即使有意义，一定要弄一套书写顺序去框住自己，实在又是一件自己为难自己的事儿。只要保证每一个属性和值都有用，当冲突时，该前的在前，该后的在后，也就好了。</p><h2>五，CSS、IE和Hacks</h2><p>想一想，我们花上一大把的时间去研究CSS Hack，研究IE为何如此的叛逆，做项目时可能就因为某个兼容问题给卡死个半天，这些时间如果用来学一门其它技术，可能早已修炼成该技术的专家了，并且 是有用的。而精通Hacks并不是件值得骄傲的事情，而是所有开发者的无奈和悲哀。</p><p><img title="" alt="" onload="ResizeImage(this,520)" src="../../../upload/2009/6/css_hacks.png" /></p><p>&nbsp;</p><p>没关系，我是这么安慰自己的:<strong>当年没有CSS的时候，多少站长花了比现在10倍甚至百倍的辛苦来建站和维护，当有CSS后，他们默默的选择过渡，而不是难过的去自杀。那个不是说了嘛，往往都是事情改变人，人改变不了事情，我们能做的，只能是适应每个过程。</strong></p><h3><a rel="bookmark" title="10个实用但IE不支持的CSS属性" href="http://parandroid.com/10-css-properties-not-supported-by-ie/">10个实用但IE不支持的CSS属性</a></h3><p>本文里面，介绍了10个很实但IE却不支持的CSS属性，列出这些属性并不是为了数落IE(数落也没用), 而是你了解了哪些CSS属性是IE不支持的，就更有针对性的去编写CSS和Hack。</p><h3><a target="_blank" href="http://www.qianduan.net/ie6u002639s-bug-amended-10-tips.html">修正IE6的bug的10个技巧 </a></h3><p>我们知道，IE6可能过不了多久就会消失了，但是我们还能继续支持这个浏览器并且避免hack和有约束的CSS吗？这里是10个使用有效的HTML和CSS代码来修正IE6主要问题的方法。</p><h3><a target="_blank" href="http://www.css88.com/archives/579">IE6 BUG大全</a></h3><p>一个系列文章，包含了很多IE6 BUG的详细介绍，比如IE6中奇数宽度的BUG，PNG Alpha透明，像素BUG的实例，IE6文字溢出BUG等等。</p><h3><a target="_blank" href="http://blog.bingo929.com/at-present-very-comprehensive-information-on-css-compatible-pool.html">目前非常全面的CSS兼容问题资料汇集</a></h3><p>CSS兼容问题一直困扰着CSSer，面对各浏览器，往往感觉束手无策，愁眉不展。CSS Hack是在标准CSS没办法兼容各浏览器显示效果时才会用上的补救方法，在各浏览器厂商解析CSS没有达成一致前，我们只能用这样的方法来完成这样的任 务。本文里面收集了非常详细的CSS兼容问题。</p><h3><a target="_blank" href="http://www.gracecode.com/Archive/Display/2608">IE6方程式</a></h3><p>Web 开发人员的使命就是面对不同的浏览器。自 Web 标准运动的诞生起，有个宿命从 Netscape Navigator 4 开始就被延续着，就是那些过时的浏览器拒绝死亡。它们顽强的存在，阻碍了现代标准的发展。而今天，这个宿命降落到了 Internet Explorer 6 身上。</p><h2>六，你可能不知道的一些CSS技巧</h2><p>就像本文开头所说的，CSS像魔方一样，有数不清的玩法，即使你是高手，永远都有你不了解的地方。有一些CSS技巧并不常用，一些CSS技巧完全是实验性质的，还有一些完全甚至是代码写错误打误撞搞出来的结果，比如本站之前介绍的<a href="http://parandroid.com/css-to-achieve-the-label-cloud-tag-cloud-hyperopia-effect/">CSS实现的标签云远视效果</a>。</p><p style="text-align: center;"><img height="208" width="316" alt="purecss 60+CSS技巧教程资源大全" title="purecssmistake" class="aligncenter" src="http://parandroid.com/wp-content/uploads/2008/03/purecss.gif" /></p><h3><a target="_blank" href="http://www.qianduan.net/css-content-counter-increment-counter-reset.html">CSS content, counter-increment 和 counter-reset详解 </a></h3><p>你很可能没有听过上面这些CSS术语？事实上，我在这之前也不了解，但你可能看到过conten:after和content:before这样的 CSS代码，利用这样一些CSS属性可以实现内容的渲染。尽管这些属性存在浏览器兼容性和W3C验证的问题，但了解一下还是蛮有趣的。</p><h3><a target="_blank" href="http://www.qianduan.net/css-selectors-customization-link-style.html">使用CSS选择器创建个性化链接样式</a></h3><p>zip文档链接前面显示显示一个zip文档图标，PDF则显示PDF图标，以此类推，听上去很酷吧。更酷的是，你只需要使用CSS而不是JS就能实现这项功能。这篇教程告诉你如何通过CSS的属性选择器来制作个性化链接样式。</p><h3><a rel="bookmark" title="CSS Sticky Footer: 完美的CSS绝对底部" href="http://parandroid.com/css-sticky-footer/">CSS Sticky Footer: 完美的CSS绝对底部</a></h3><p>当做一个页面时，如果页面内容很少，不足于填充一屏的窗口区域，按普通的布局，就会出现下面图片中的样子(也就是底部内容并没有位于窗口的底部，而 留下了大量空白。对于追未完美的设计师来说，这是不美观的。网上有一些解决方案，但会出现当改变窗口高度时，底部和正文重叠的BUG。尽管没有多少人会有 事没事儿的去改变窗口高度，但设计嘛，追求的就是尽善尽美。</p><h3><a target="_blank" href="http://parandroid.com/no-float-css-layout/">没有div没有float没有clear没有hack的超强CSS布局</a></h3><p>一个超强的CSS 布局，<strong>没有div，没有float, 没有clear, 没有hack， 没有和你开玩笑，确实是一个CSS 布局</strong>。出自<a target="_blank" href="http://www.tjkdesign.com/articles/float-less_css_layouts.asp">TJKDesign</a> 之手，你可以查看<a target="_blank" href="http://www.tjkdesign.com/articles/css-layout/no_div_no_float_no_clear_no_hack_no_joke.asp">DEMO 演示</a> 或<a target="_blank" href="http://www.tjkdesign.com/articles/float-less_css_layouts.asp">阅读该布局设计师的文章说明</a>。</p><h3><a href="http://www.css88.com/archives/746">一个关于透明度继承的问题</a></h3><p>在前端开发的时候，经常用到板块背景的透明度， 但当父层透明时，其中嵌套的子层也会继承其透明性。而这并不是我们想要的，比如，我们只是想要某个块状元素背景透明，而背景层里面的文本子层则非透明。</p><h3><a target="_blank" href="http://blog.bingo929.com/spice-up-your-images-with-css-5-way.html">使用CSS为图片添加更多趣味的5种方法</a></h3><p>为你平淡乏味的图片添加更多趣味情调的简单技巧。使用Photoshop为每个图片添加某种样式虽然可行，但会是相当乏味且困难的长久工作。本文要介绍的CSS技巧将帮助你从痛苦中解脱出来！</p><h3><a target="_blank" href="http://parandroid.com/101-css-advanced-application-techniques-guide-1/">101个CSS技术高级应用教程(上)</a> <a target="_blank" href="http://parandroid.com/101-css-advanced-application-technology-directory-2/">(下)</a></h3><p>一些比较高阶的CSS技术应用介绍，全学完这些教程，你的CSS水平将提高很多，废话&nbsp;</p><h3><a target="_blank" href="http://parandroid.com/53-kinds-of-web-designers-the-necessary-skills-high-css/">53种网页设计师必备的高级CSS技巧</a></h3><p>都说了必备了，你不看看实在对不住自己千万的Web开发同胞了&hellip;</p><h2>七, CSS 3</h2><p>CSS2的出现让web顿时丰富起来，特别是web2.0时代CSS成为每个web页面都必不可少的元素。但是随着web技术的发展，CSS2已经 不能满足web开发的需求，例如属性选择、AJAX出现后与JS的交互等，因此对下一代的CSS需求越来越明显。目前CSS3还处于草稿阶段，但是其某些 特征已经让人兴奋不已。</p><p><img onload="ResizeImage(this,520)" src="http://www.playgoogle.com/old/upload/2009/6/css30.gif" alt="" title="" /></p><p>目前主流浏览器Firefox、IE7/8、Webkit等都已经部分地支持CSS3。因此提前了解CSS3是十分必要的。下面提供的20个学习资 源中，多数是单篇的文章和访谈记录等，可见这方面的资源还是比较少的，作为一个真正的CSS开发者，走在别人的前面提前了解、运用、研究CSS3也是十分 必要的。</p><h3><a target="_blank" href="http://parandroid.com/css30-related/">CSS3.0相关资源和参考手册收集整理</a></h3><p>一些有关CSS 3技巧和教程的资源整理。</p><h3><a target="_blank" href="http://www.dudo.org/article/CSSJS/268.htm">CSS 3入门</a></h3><p>如果你关注CSS，那么你一定听说过CSS3,它是本应该在几年前问世的下一代样式表语言。 是的，CSS 3样式文档至今还没有最终完成。如果你已经急不可待了，那么你也不必感到孤独。虽然这它还没有最终定型但是很多浏览器厂商已经开始支持其中的一些新特性了。</p><h3><a target="_blank" href="http://www.dudo.org/article/CSSJS/266.htm">20个对学习CSS3大有裨益的资源</a></h3><p>本文列出了20个对你学习CSS3大有帮助的网站资源。</p><h3><a target="_blank" href="http://www.qianduan.net/css3-and-rgba-cool-button.html">使用CSS3和RGBa创建超酷的按钮</a></h3><p>不需要图片，只需要充分利用CSS3的圆角、盒子阴影和文字阴影效果，同时使用RGBa色彩，就能实现非常漂亮、非常流行的文字阴影圆角按钮效果。</p><h3><a target="_blank" href="http://blog.bingo929.com/5-techniques-to-acquaint-you-with-css-3.html">你应当了解的5个CSS3新技术 | 彬Go</a></h3><p>CSS是众所周知且应用广泛的网站样式语言，在它的版本三(CSS3)计划中，新增了一些能够节省时间的特性。尽管只有当前最新了浏览器版本才能支 持这些效果，但了解它们还是必须且很有趣味性的。本文向大家展示CSS中的5个有趣的新技术:圆角、个别圆角、不透明度、阴影和调整元素大小。</p><h3><a rel="bookmark" title="25个高级CSS技巧教程" href="http://parandroid.com/25-advanced-css-skills-tutorial/">25个高级CSS技巧教程</a></h3><p>能用CSS实现的效果，就尽量不要使用JS。但如果使用CSS需要很繁琐的代码，那用CSS也不见得是好事儿。这里是25个高级CSS技巧，有助于你提高你的CSS水平，让你对CSS的掌握更上一个台阶。</p><h2>八，更多CSS相关资源</h2><h3><a target="_blank" href="http://parandroid.com/more-than-50-highly-creative-presentations-and-tutorials-css/">50多个极富创意的CSS演示和教程</a></h3><p>SS可以让网页设计中实现很多丰富和独特的技术. 今天,我们就围绕着CSS技术展示全面的探讨, 为你找寻一些最具创造性的CSS技术和使用技巧. 绝对值得喜欢网页设计的你一看.</p><h3><a rel="bookmark" title="5个CSS书写技巧" href="http://parandroid.com/5-ways-to-write-better-css/">5个CSS书写技巧</a></h3><p>nettuts带来的5个css书写技巧9(link)，简单翻译一下它的中心思想。包括一些代码书写顺序、CSS Reset等，不一定对，但可以做参考。</p><h3><a rel="bookmark" title="15个CSS框架简介" href="http://parandroid.com/15-css-framework/">15个CSS框架简介</a></h3><p>对于小的Web开发项目来说，CSS 框架并不一定就适用，至少不见得能提高多少工作效率。但对于一个开发团队和规模比较大的项目来说，CSS 框架不仅能加快设计进程，更能解决网站改版中带来的诸多麻烦和问题。</p><h3><a target="_blank" href="http://parandroid.com/8-simple-and-practical-skills-css/">8个简单和实用的CSS技巧</a></h3><p>最好的解决方案往往是最简单的，这里列出8个CSS技巧，非常简单，简单到只需要写一行代码，只需要定义一个属性参数。非常适合学习CSS的新手朋友阅读。</p><h3><a href="http://parandroid.com/11-great-css-tutorials-button/">11大CSS按钮教程</a></h3><p>按钮是网站中非常重要的一部分, 它们常用于引发访客点击和产生互动。下面收集了11个css按钮教程，教你如何创建吸引访客目光的按钮。我最想推荐的其实是第一个， Google custom buttons. 在Recreating the button这篇文章中，作者详细向我们介绍了google现在很多应用服务中（google reader, gmail等）。其中包括需要用到一张渐变背景图的3.0版本&hellip;</p><h3><a target="_blank" href="http://www.yeeyan.com/articles/view/seasun/44063">12个针对网页设计师的非常便利的CSS框架、模板和摘录网 | 译言</a></h3><p>如果您经常性地需要建立和开发新的网站，那么您就应该考虑使用模板创建，收集有用的代码片段等等。为了加快开发的进程，您就应该这样做，在需要的适 合您可以使用、修改并优化这些模板文件；如果是作为商业用途的您应该检查下许可条款。然而，到目前为止，这是从最榜的站点中挑选出来的最好的站点的普通清 单。好好地使用它们吧！</p><h3><a target="_blank" href="http://blog.bingo929.com/20-websites-learn-css.html">推荐20个让你学习并精通CSS的网站</a></h3><p>CSS的学习过程既可以说简单又可以说是复杂。CSS的语法比较简单，但CSS的应用中有一些概念(一可以说是原理)还是很难掌握的。本文推荐了 20个出色的CSS技术类(英语)网站帮你更好的理解和掌握CSS，其中包括各种各样的网站，从博客到清单风格列表甚至网站，它们都侧重于研究同一个主 题，那就是CSS。</p><h3><a href="http://www.planabc.net/2008/05/06/css_specificity/">详解CSS的优先权 | 怿飞</a></h3><p>发现很多朋友对 CSS 的优先权不甚了解，规则很简单。需要说明的一点，如果你的样式管理需要深层判断 CSS 的优先权，更应反思自己的 CSS 代码，是否合理？是否优化？ CSS2.1 中规定了关于 CSS 规则 Specificity（特异性）的计算方式，用一个四位的数字串（注：CSS2 中是用三位）来表示，最后以 Specificity 的高低判断 CSS 的优先权。</p><h3><a href="http://www.css88.com/archives/754">页面中css调试和问题解决的一些经验总结</a></h3><p>CSS2各个属性被各个浏览器支持的问题，css&gt;继承，css叠加等等，我们经常因为这些而需要调试页面中css。 本文里面，作者分享了自己一些页面中css调试和问题解决的的经验。</p><h3><a target="_blank" href="http://xianguo.com/item/439791327">网页不需要漂亮</a></h3><p>你见过的最炫目的网站设计通常都是个人网站，尤其是设计师的Portfolio。但最漂亮不代表最成功，CSS是用来玩花俏的视觉效果的吗？一些设 计师在尽可能的发挥着想象力做些炫目和富有创意的网页，也有一些设计师，在反对对网页中过度的视觉设计。到底该选择什么呢，看你自己了。</p><h3><a target="_blank" href="http://www.css88.com/archives/821">彻底了解css中的长度单位</a></h3><p>我们在写css的时候最常用的长度单位是px（像素），经常看到的还有em，pt等等，其实css中的长度单位一共有8个，分别是px，em，pt，ex，pc，in，mm，cm；那我们到底该用哪种单位呢?</p><h3><a target="_blank" href="http://www.qianduan.net/css-box-model.html">CSS盒模型</a></h3><p>网页设计中的每个元素都是长方形的盒子。 了解盒模型这个概念有什么好处呢？我只能用我的感受来向你描述一个这个东西: 当开始样式化一个网页时，你就会把网页看成一个杂乱堆放了很大不同大小盒子的地方，而你所需要做的，只是把这些盒子拉高、拉宽和移动。然后，一个网页的布 局就OK了。</p><p>转载自 <a title="60+CSS技巧教程资源大全" rel="bookmark" href="http://parandroid.com/60-css-tips-round-up/">60+CSS技巧教程资源大全 | 帕兰映像</a></p><p>&nbsp;</p><p>Copyright  <a href="http://www.playgoogle.com">playgoogle.com</a>© 2008</p><p><a href="http://www.playgoogle.com/old/post/86.html" target="_blank">继续阅读《【收藏】CSS技巧教程资源大全》的全文内容...</a></p><h3>相关文章:</h3><ul><p><a  href="http://www.playgoogle.com/old/post/98.html">三栏布局，左右固定宽度，中间自适应的一种解决方案</a>&nbsp;&nbsp;(2009-8-18 13:42:28)</p><p><a  href="http://www.playgoogle.com/old/post/97.html">可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks</a>&nbsp;&nbsp;(2009-8-10 10:47:28)</p><p><a  href="http://www.playgoogle.com/old/post/89.html">让IE6瞬间崩溃的5种方式</a>&nbsp;&nbsp;(2009-6-22 10:39:33)</p><p><a  href="http://www.playgoogle.com/old/post/72.html">【收藏】字体、排版简明入门</a>&nbsp;&nbsp;(2009-4-1 10:58:52)</p><p><a  href="http://www.playgoogle.com/old/post/61.html">WebKit私有属性介绍</a>&nbsp;&nbsp;(2009-3-13 21:32:5)</p></ul><hr /> <h3>最新评论:</h3><ul><li><a href="http://www.playgoogle.com/old/post/86.html#cmt191">2009-6-19 10:22:40</a>，<a href="http://www.lusongsong.com">卢松松</a> ： 不错 受教了！~</li></ul>]]></description><category>XHTML+CSS</category><comments>http://www.playgoogle.com/old/post/86.html#comment</comments><wfw:comment>http://www.playgoogle.com/old/</wfw:comment><wfw:commentRss>http://www.playgoogle.com/old/feed.asp?cmt=86</wfw:commentRss><trackback:ping>http://www.playgoogle.com/old/cmd.asp?act=tb&amp;id=86&amp;key=5c0da04c</trackback:ping></item></channel></rss>

