<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>随网之舞CSS3</title>
	<atom:link href="http://dancewithnet.com/tag/css3/feed/" rel="self" type="application/rss+xml" />
	<link>http://dancewithnet.com</link>
	<description>WEB Design{HTML:CSS:Javascript:DOM:AJAX:PHP:Usability}/Viewpoint/Photo/Food/Mood</description>
	<lastBuildDate>Mon, 18 Jul 2011 02:45:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>border-radius与圆角</title>
		<link>http://dancewithnet.com/2008/12/27/border-radius-and-rounded-corner/</link>
		<comments>http://dancewithnet.com/2008/12/27/border-radius-and-rounded-corner/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 11:25:55 +0000</pubDate>
		<dc:creator>秦歌</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[border-radius]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://dancewithnet.com/?p=1412</guid>
		<description><![CDATA[两年前发表的《The visual design of Web 2.0》中提到“Rounded everything”，圆角因使人感觉舒适的友好风格而变得无处不在。这个无处不在也让很多前端工程师累个半死，YAHOO Performance Research Engneer Team... ]]></description>
			<content:encoded><![CDATA[<p>两年前发表的<a href="http://f6design.com/journal/2006/10/21/the-visual-design-of-web-20/">《The visual design of Web 2.0》</a>中提到“Rounded everything”，圆角因使人感觉舒适的友好风格而变得无处不在。这个无处不在也让很多前端工程师累个半死，<a href="http://developer.yahoo.com/performance/">YAHOO Performance Research Engneer Team</a>的Nicole在讲演<a href="http://www.slideshare.net/stubbornella/designing-fast-websites-presentation">《Designing Fast Websites》</a>中用的副标题是don&#8217;t blame the rounded corners!，从侧面也说明了圆角给实现者带来的困扰：实现麻烦、兼容困难、性能不佳。而W3C早在<a href="http://www.w3.org/TR/2002/WD-css3-border-20021107/#the-border-radius">2002年的CSS3草案中</a>就加入了一个叫<a href="http://www.w3.org/TR/css3-background/#the-border-radius">border-radius</a>的属性，通过它可以直接来定义HTML元素的圆角。<span id="more-1412"></span></p>
<h3>CSS3的border-radius规范</h3>
<p><a href="http://www.w3.org/TR/css3-background/#the-border-radius">最新草案</a>中其主要信息如下：</p>
<ol>
<li>属性：<code>border-top-right-radius</code><br />
　　　<code>border-bottom-right-radius</code><br />
　　　<code>border-bottom-right-radius</code><br />
　　　<code>border-bottom-right-radius</code><br />
值：&lt;length&gt; &lt;length&gt;?。它们分别是定义角形状的四分之一椭圆的两个半径。如图：<br />
<img src="http://www.w3.org/TR/2005/WD-css3-background-20050216/corner.png" width="289" height="179" alt="border-radius" /></p>
<ol>
<li>第一个值是水平半径。</li>
<li>如果第二个值省略，则它等于第一个值，这时这个角就是一个四分之一圆角。</li>
<li>如果任意一个值为0，则这个角是矩形，不会是圆的。</li>
<li>值不允许是负值。</li>
</ol>
</li>
<li>属性：border-radius。它是上面四个属性值的简写。<br />
值：&lt;length&gt;{1,4} [ / &lt;length&gt;{1,4} ]?</p>
<ol>
<li>如果斜线前后的值都存在，那么斜线前的值设置水平半径，且斜线后的值设置垂直半径。如果没有斜线，则水平半径和垂直半径相等。</li>
<li>四个值是按照top-left、top-right、 bottom-right、 bottom-left的顺序来设置的。如果bottom-left省略，那么它等于top-right。如果bottom-right省略，那么它等于top-left。如果top-right省略，那么它等于top-left。</li>
</ol>
</li>
<li>应用范围：所有的元素，除了table的样式属性<code>border-collapse</code>是<code>collapse</code>时</li>
<li>内边半径等于外边半径减去对应边的厚度。当这个结果是负值时，内边半径是0。所以内外边曲线的圆心并不一定是一致的。</li>
<li>border-radius也会导致该元素的背景也是圆的，即使<code>border</code>是<code>none</code>。如果<a href="http://www.w3.org/TR/css3-background/#background-clip">background-clip</a>是padding-box，则背景（background）会被曲线的内边裁剪。如果是border-box则被外边裁剪。border和padding定义的区域也一样会被曲线裁剪。</li>
<li>所有的边框样式（<code>solid</code>、<code>dotted</code>、<code>inset</code>等）都遵照角的曲线。如果设置了border-image，则曲线以外的部分会被裁剪掉。</li>
<li>如果角的两个相邻边有不同的宽度，那么这个角将会从宽的边平滑过度到窄的边。其中一条边甚至可以是0。</li>
<li>两条相邻边颜色和样式转变的中心点是在一个和两边宽度成正比的角上。比如，两条边宽度相同，这个点就是一个45°的角上，如果一条边是另外一条边的两倍，那么这个点就在一个30°的角上。界定这个转变的线就是连接在内外曲线上的两个点的直线</li>
<li>角不允许相互重叠，所以当相邻两个角半径的和大于所在矩形区域的大小时，用户代理（浏览器）比如缩小一个或多个角半径。运算法则如下：f = min(L<sub>i</sub>/S<sub>i</sub>)，i ∈ {top, right, bottom, left}，L<sub>top</sub> = L<sub>bottom</sub> = 所在矩形区域的宽，L<sub>left</sub> = L<sub>right</sub> = 所在矩形区域的高。如果f < 1，那么所有角半径都乘以f。</li>
</li>
</ol>
<h3>浏览器支持</h3>
<p>实际中，目前没有任何一款浏览器支持这个属性，只有部分浏览器利用其私有属性支持部分实现：</p>
<ol>
<li><a href="https://developer.mozilla.org/en/CSS/-moz-border-radius">Firefox对border-radius的支持</a>：
<pre><code>-moz-border-radius: &lt;length&gt;{1,4} | inherit
-moz-border-radius-bottomleft : &lt;length&gt; | inherit
-moz-border-radius-bottomright  : &lt;length&gt; | inherit
-moz-border-radius-topleft  : &lt;length&gt; | inherit
-moz-border-radius-topright : &lt;length&gt; | inherit
</code></pre>
<ol>
<li>只对每个角设置一个半径，只支持实现四分之一圆角，并不支持椭圆形圆角。</li>
<li>具体每个角的命名规则也和W3C不一致，这个比较讨厌。</li>
<li>Firefox3圆角已经相当圆滑了，Firefox2比较糟糕，好在它即将终结了。</li>
</ol>
</li>
<li><a href="http://developer.apple.com/documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html#//apple_ref/css/property/-webkit-border-radius">Safari和Chrome对border-radius的支持</a>：
<pre><code>-webkit-border-radius: &lt;length&gt;{1,2} | inherit
-webkit-border-bottom-left-radius : &lt;length&gt;{1,2} | inherit
-webkit-border-bottom-right-radius : &lt;length&gt;{1,2} | inherit
-webkit-border-top-left-radius  : &lt;length&gt;{1,2} | inherit
-webkit-border-top-right-radius : &lt;length&gt;{1,2} | inherit
</code></pre>
<ol>
<li>每个属性有1个或2个值，当有两个值时1个表示水平半径，一个表示垂直半径（当writing-mode改变也随之而变）。所以，Safari和Chrome中的圆角可以是椭圆角。</li>
<li>webkit的实现方法和<a href="http://www.w3.org/TR/2005/WD-css3-background-20050216/#the-border-radius">W3C的CSS3草案2005年版本</a>非常一致，和当前的草案最大不同就是简写属性-webkit-border-radius的属性值也只有1个或2个值，意义和前面相同。</li>
<li>Chrome中圆角锯齿比较严重，基本上和Firefox2是同一水平，或许是它的webkit版本较低造成的。</li>
<li>由于webkit出生于khtml，所以把 上面属性中的webkit换成khtml即会得到以khtml为核心的浏览器支持的属性了。</li>
<li>当相邻的角半径之和大于所在矩形区域的大小时，都会直接设置所有的角半径为0，即圆角失效，而不会像Firefox那样同比率缩小。</li>
</ol>
</li>
<li>Opera尚不支持border-radius，虽然<a href="http://bbs.operachina.com/viewtopic.php?f=64&#038;t=36109">Opera10 alpha拥有众多的CSS3改进</a>，但是依旧看不到对其支持的希望。</li>
<li>IE就不用说了，标准的不支持了。从MSDN的<a href="http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx#border">CSS Compatibility and Internet Explorer</a>中可以看出IE8已经铁定不支持了。</li>
</ol>
<h3>实际应用</h3>
<p>最简单的应用就是支持的用圆角，不支持的用方角。比如Wordpress2.7的后台、<a href="http://ued.koubei.com/">雅虎口碑UED的blog</a>和<a href="http://xiayu.info/">今天你带伞了吗?</a>。基础代码如下：</p>
<pre><code>
border-width: 1px;
border-style: solid;
-moz-border-radius: 11px;
-khtml-border-radius: 11px;
-webkit-border-radius: 11px;
border-radius: 11px;
</code></pre>
<p>实现请看<a href="http://dancewithnet.com/lab/2008/border-radius/" class="link-btn">演示实例</a>。</p>
<p><a href="http://snook.ca/archives/html_and_css/rounded_corners_experiment_ie/">利用VML可以实现从IE5-7的圆角</a>，但是貌似IE8不支持VML了。<a href="http://dillerdesign.com/experiment/DD_roundies/">组件DD_roundies</a>就是综合以上解决方案的一个具体应用。说实话这样实现出来的圆角也比较粗糙了，我感觉还不如不要。</p>
<p>像VML一样，Canvas也能实现圆角，切除了IE外，所有的主流浏览器都支持。所以就有了两者结合实现的组件<a href="http://labs.parkerfox.co.uk/cornerz/">Cornerz</a>。</p>
<p>如果上面的现实太痛苦，而又非要用圆角的话，要么一个像素一个像素去拼装，比如<a href="http://www.cssplay.co.uk/boxes/chunky.html">Chunky Borders</a>；要么就老老实实用图片来实现吧，比如<a href="http://www.lesliesommer.com/wdw07/html/">CSS Mojo</a>的方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://dancewithnet.com/2008/12/27/border-radius-and-rounded-corner/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>连续字符自动换行的解决方案</title>
		<link>http://dancewithnet.com/2008/12/04/word-break-all/</link>
		<comments>http://dancewithnet.com/2008/12/04/word-break-all/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 16:16:50 +0000</pubDate>
		<dc:creator>秦歌</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Javascript & DOM & AJAX]]></category>
		<category><![CDATA[break-all]]></category>
		<category><![CDATA[break-word]]></category>
		<category><![CDATA[createTreeWalker]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[word-break]]></category>
		<category><![CDATA[word-wrap]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://dancewithnet.com/?p=1386</guid>
		<description><![CDATA[文本的排版依据语言的不同会有一些格式上的要求，比如简体中文中类似逗号、分号等标点符号不会出现在一行的开头，对于英文来讲就是一个完整单词不会在两行显示，浏览器会依据类似这... ]]></description>
			<content:encoded><![CDATA[<p>文本的排版依据语言的不同会有一些格式上的要求，比如简体中文中类似逗号、分号等标点符号不会出现在一行的开头，对于英文来讲就是一个完整单词不会在两行显示，浏览器会依据类似这样的原则来显示文本。但是由于网页有宽度限制的，连续的超长的字母、数字或标点符号超出其所在区域宽度的限制而导致影响页面视觉，如<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo1">例1</a>所示。这个问题在显示用户输入信息时尤为突出，这里就是要说如何解决这个问题。</p>
<p>在<a href="http://www.w3.org/TR/css3-text/">CSS3草案</a>中，对文本的处理新增了两个新属性<a href="http://www.w3.org/TR/css3-text/#word-wrap">word-wrap</a>和<a href="http://www.w3.org/TR/css3-text/#word-break">word-break</a>来解决这个问题：</p>
<ol>
<li>{word-break:break-all;} ：依照亚洲语言和非亚洲语言的文本规则，允许在字内换行，且允许非亚洲语言文本行的任意字内断开</li>
<li> {word-wrap:break-word;}： 内容将在边界内换行，如需要则词内换行（word-break）也行发生</li>
</ol>
<p><span id="more-1386"></span></p>
<p>下面是常见浏览器的支持情况：</p>
<table>
<tbody>
<tr>
<th></th>
<th>IE6/7/8<sup>[1]</sup></th>
<th>Firefox2/3<sup>[2]</sup></th>
<th>Firefox3.5</th>
<th>Opera9+</th>
<th>Safari9.5+/Chrome</th>
</tr>
<tr>
<th>{word-wrap:break-word;}</th>
<td>td元素需设置其宽度<br />见<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo4">例4</a>和<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo5">例5</a></td>
<td>不支持</td>
<td>不支持td元素<br />见<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo4">例4</a>和<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo5">例5</a></td>
<td>不支持</td>
<td>不支持td元素<br />见<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo4">例4</a>和<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo5">例5</a></td>
</tr>
<tr>
<th>{word-break:break-all;}</th>
<td>不支持连续的符号<br />见<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo3">例3</a></td>
<td>不支持</td>
<td>不支持连续的符号<br />见<a href="http://dancewithnet.com/lab/2008/word-break-all/#demo3">例3</a></td>
<td>不支持</td>
<td>支持</td>
</tr>
</tbody>
</table>
<ul class="refer">
<li>[1] <del datetime="2009-05-13T17:07:03+08:00">在MSDN的<a href="http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx#font">CSS Compatibility and Internet Explorer</a>中可以看出，IE8会像IE6和IE7一样支持word-wrap和word-break这两个属性，但我在IE8beta2上测试来看却不支持这两项，由于IE8还处于beta阶段，且我相信IE8最终会支持的，所以在页头声明<code>&lt;meta content="IE=7" http-equiv="X-UA-Compatible" /&gt;</code>使IE8按照IE7来解释页面是一个不错的办法。</del><ins datetime="2009-05-13T21:08:52+08:00"><a href="http://msdn.microsoft.com/en-us/library/ms531186.aspx">IE8正式版支持</a></ins></li>
<li>[2] <del datetime="2009-05-13T17:07:03+08:00">Firefox3.1将会支持word-wrap属性</del><ins datetime="2009-05-13T17:07:03+08:00">Firefox3.5beta4已经支持</ins></li>
</ul>
<p>由于{word-break:break-all;}导致英文和数字可读性严重下降且无法使连续符号换行，所以{word-wrap:break-word;}是一个相对较好的选择。需要注意的是各个浏览器中word-wrap在td上实现不一致，所以避免直接在td上使用。</p>
<p>但面对浏览器的如此糟糕支持，所以不能不借助JavaScript来解决这个问题，即当浏览器不支持CSS解决方案时，在连续字符串的适当位置插入&amp;#8203;字符（当然还可以用<code>&lt;wbr /&gt;</code>和&amp;shy;，这三个字符在浏览器中的支持情况请看<a href="http://www.quirksmode.org/oddsandends/wbr.html">ppk的《The wbr tag》</a>），这些字符写在浏览器中不会显示，却使长字符串换行。<ins datetime="2009-05-30T15:47:29+08:00">&amp;#8203;和&amp;shy;都会导致复制用其处理过的文本时有大量不可打印的字符，导致字符数急剧增大，更严重的是导致复制的链接字符串不可用，所以用<code>&lt;wbr /&gt;</code>是比较好的方案，虽然<code>&lt;wbr /&gt;</code>在IE8中不被支持且在Safari中有bug，但这些浏览器可以直接用CSS{word-wrap:break-word}来实现无需用<code>&lt;wbr /&gt;</code>处理。</ins><ins datetime="2009-06-04T22:46:16+08:00">Opera下要兼容<code>&lt;wbr /&gt;</code>，需要设置CSS：<code>wbr:after { content: "\00200B" }</code></ins>。
</p>
<p><ins datetime="2009-05-28T18:02:06+08:00">2009.05.28重写了实现方法，尽可能减少对浏览器探测的依赖，同时考虑对同一个页面多次执行该方法的效率，同时为了偷懒直接基于YUI。<a href="http://dancewithnet.com/lab/2008/word-break-all/break-word-req-yui.html" class="link-btn">请看DEMO</a></ins></p>
<p>具体实现代码如下：</p>
<pre><code>function fnBreakWordAll(o){
var o = o || {},
  iWord = o.word || 13,
  iRe = o.re || '[a-zA-Z0-9]',
  bAll = o.all || false,
  sClassName = o.className || 'word-break-all',
  aEls = o.els || (function(){
    var aEls = [],
      aAllEls = document.getElementsByTagName('*'),
      re = new RegExp('(?:^|\\s+)' + sClassName + '(?:\\s+|$)');
    for(var i =0,iLen = aAllEls.length; i &lt; iLen ; ++i){
      if(re.test(aAllEls[i].className)){
        aEls[aEls.length] = aAllEls[i];
      }
    }
    return aEls;
  })() || [],
  fnBreakWord = function(oEl){
    <span>// 基于http://www.hedgerwow.com/360/dhtml/css-word-break.html修改</span>
    if(!oEl || oEl.nodeType !== 1){
      return false;
    }else if(oEl.currentStyle &#038;&#038; typeof oEl.currentStyle.wordWrap==='string'){
      breakWord = function(oEl){
        oEl.runtimeStyle.wordWrap = 'break-word';
        return true;
      }
      return breakWord(oEl);
    }else if(document.createTreeWalker){
      var trim = function  (str) {
        str = str.replace(/^\s\s*/, '');
        var ws = /\s/,
        i = str.length;
        while (ws.test(str.charAt(--i)));
        return str.slice(0, i + 1);
      }
      breakWord = function(oEl){
        var dWalker=document.createTreeWalker(oEl,NodeFilter.SHOW_TEXT,null,false);
        var node,s,c = String.fromCharCode('8203'),
          <span>//re = /([a-zA-Z0-9]{0,13})/;</span>
          re = new RegExp('('+ iRe +'{0,' + iWord + '})');
        while (dWalker.nextNode()){
          node = dWalker.currentNode;
          s = trim(node.nodeValue).split(re).join(c);
          node.nodeValue = s;
        }
        return true;
      }
      return breakWord(oEl);
    }
  };
for(var i=0,n=aEls.length; i&lt;n; ++i){
  var sUa = navigator.userAgent,
    sTn = aEls[i].tagName.toLowerCase() ;
  if((/Opera/).test(sUa) || (/Firefox/).test(sUa) || ((/KHTML/).test(sUa) &#038;&#038;
  (sTn === 'td' || sTn === 'th')) || bAll){
    fnBreakWord(aEls[i]);
  }
}
}</code></pre>
<p>具体应用请看<a href="http://dancewithnet.com/lab/2008/word-break-all/kill-all.html" class="link-btn">演示实例</a></p>
<p>fnWordBreakAll函数提供一些定制参数，使用方法和参数含义如下：</p>
<pre><code>fnWordBreakAll({word:15,re:'[\\w]',all:true});</code></pre>
<table>
<tr>
<th>参数</th>
<th>值</th>
<th>说明</th>
</tr>
<tr>
<th>word</th>
<td>正整数，默认是13</td>
<td>在这个字数内的单词不会被插入\u8203，印象中超过13个字母的单词不多，这可以保证绝大部分单词不会被打碎</td>
</tr>
<tr>
<th>re</th>
<td>正则表达式，默认[a-zA-Z0-9]</td>
<td>单词的正则表达式，用以确定一个单词是哪些字符组成，注意\的转义</td>
</tr>
<tr>
<th>all</th>
<td>布尔值，默认false</td>
<td>确定是否在所有的浏览器中执行，默认在Opera和Firefox，以及当class应用在th或td的Safari上执行，这个主要用在.word-break-all没有定义时，会对IE加上样式</td>
</tr>
<tr>
<th>className</th>
<td>合法class名，默认word-break-all</td>
<td>执行函数的元素对应属性名</td>
</tr>
</table>
<p>这个函数的核心部分修改自Hedger Wang 整理了一个JavaScript解决方案<a href="http://www.hedgerwow.com/360/dhtml/css-word-break.html">《Cross Browser Word Breaker》</a>，其利用<a href="https://developer.mozilla.org/En/DOM/Document.createTreeWalker">document.createTreeWalker</a>和split方法给非IE浏览器的每个字符间加入了&amp;#8203;，它用在纯中文文本基本上没有什么问题，但是如果你仔细观察他给出的例子就会发现文本中有英文或数字时，虽然解决了换行问题，但是使文本难以阅读，且增大了字符间的间距，所以我在此基础上做了上面的改进。</p>
]]></content:encoded>
			<wfw:commentRss>http://dancewithnet.com/2008/12/04/word-break-all/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>

