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

<channel>
	<title>肉包子的摇滚生活 &#187; yui</title>
	<atom:link href="http://www.fangyuqiang.com/archives/tag/yui/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fangyuqiang.com</link>
	<description>在通往架构师的路上努力着...</description>
	<lastBuildDate>Mon, 14 Mar 2011 03:48:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Meta CSS框架</title>
		<link>http://www.fangyuqiang.com/metacss</link>
		<comments>http://www.fangyuqiang.com/metacss#comments</comments>
		<pubDate>Thu, 02 Jul 2009 15:00:12 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Blueprints]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://fangyuqiang.com.fb6l.8-host.com/?page_id=272</guid>
		<description><![CDATA[背景 Meta CSS是一个很简单的CSS框架。可以点这里(下载)先一睹为快。 在深入介绍之前，我们来考虑几个web开发者非常容易遇到的问题： 同样的一个款式的按钮，有些页面它要在左边，但是有些页面要在右边 同样作用的一段提示文字，有些地方字体要大号，有些却要小号 同样风格的一段文字，有些要红色，有些却要绿色 这样的状况是相当频繁的。对此，通常有4种解决方法： 每种不同款式，定义一个css。按钮A一个css，按钮B虽然长得跟A一样，但是在右边，那就copy下A的css代码，然后改成在右边。 .a{/* 很多样式定义 */} .b{/* 很多样式定义 */ text-align:center;} .c{/* 很多样式定义 */ text-align:right;} &#60;div class="a"&#62;按钮A&#60;/div&#62; &#60;div class="b"&#62;按钮B&#60;/div&#62; &#60;div class="c"&#62;按钮C&#60;/div&#62; 针对不同地方，利用css层级覆盖来实现。比如按钮A设定css，然后对于特别的页面，设定特别的css来覆盖 .a{/* 很多样式定义 */} #s1 .a{text-align:center;} #s2 .a{text-align:right;} &#60;div class="a"&#62;按钮A&#60;/div&#62; &#60;div id="s1"&#62;&#60;div class="a"&#62;按钮B&#60;/div&#62;&#60;/div&#62; &#60;div id="s2"&#62;&#60;div class="a"&#62;按钮C&#60;/div&#62;&#60;/div&#62; 利用css组合来实现。如上面的代码片段，设定css基础类，然后进行组合。对于按钮A，它的class为x，在右边的按钮B，它的class为x tar，对于B来说，它的样式就是x与tar组合起来的。 .a{/* 很多样式定义 */} .tac{text-align:center;} .tar{text-align:right;} &#60;div class="a"&#62;按钮A&#60;/div&#62; &#60;div class="a tac"&#62;按钮B&#60;/div&#62; &#60;div [...]]]></description>
			<content:encoded><![CDATA[<h3>背景</h3>
<p>Meta CSS是一个很简单的CSS框架。可以点<a href="http://www.fangyuqiang.com/wp-content/uploads/2009/07/metacss.css">这里(下载)</a>先一睹为快。</p>
<p>在深入介绍之前，我们来考虑几个web开发者非常容易遇到的问题：</p>
<ul>
<li>同样的一个款式的按钮，有些页面它要在左边，但是有些页面要在右边</li>
<li>同样作用的一段提示文字，有些地方字体要大号，有些却要小号</li>
<li>同样风格的一段文字，有些要红色，有些却要绿色</li>
</ul>
<p>这样的状况是相当频繁的。对此，通常有4种解决方法：</p>
<ol>
<li>每种不同款式，定义一个css。按钮A一个css，按钮B虽然长得跟A一样，但是在右边，那就copy下A的css代码，然后改成在右边。
<pre class="css" title="code">.a{/* 很多样式定义 */}
.b{/* 很多样式定义 */ text-align:center;}
.c{/* 很多样式定义 */ text-align:right;}
&lt;div class="a"&gt;按钮A&lt;/div&gt;
&lt;div class="b"&gt;按钮B&lt;/div&gt;
&lt;div class="c"&gt;按钮C&lt;/div&gt;</pre>
</li>
<li>针对不同地方，利用css层级覆盖来实现。比如按钮A设定css，然后对于特别的页面，设定特别的css来覆盖</li>
<pre class="css" title="code">.a{/* 很多样式定义 */}
#s1 .a{text-align:center;}
#s2 .a{text-align:right;}
&lt;div class="a"&gt;按钮A&lt;/div&gt;
&lt;div id="s1"&gt;&lt;div class="a"&gt;按钮B&lt;/div&gt;&lt;/div&gt;
&lt;div id="s2"&gt;&lt;div class="a"&gt;按钮C&lt;/div&gt;&lt;/div&gt;</pre>
<li><strong>利用css组合来实现。如上面的代码片段，设定css基础类，然后进行组合。对于按钮A，它的class为x，在右边的按钮B，它的class为x tar，对于B来说，它的样式就是x与tar组合起来的。</strong>
<pre class="css" title="code">.a{/* 很多样式定义 */}
.tac{text-align:center;}
.tar{text-align:right;}
&lt;div class="a"&gt;按钮A&lt;/div&gt;
&lt;div class="a tac"&gt;按钮B&lt;/div&gt;
&lt;div class="a tar"&gt;按钮C&lt;/div&gt;</pre>
</li>
<li>直接内嵌style来解决。
<pre class="css" title="code">.a{/* 很多样式定义 */}
&lt;div class="a"&gt;按钮A&lt;/div&gt;
&lt;div class="a" style="text-align:center"&gt;按钮B&lt;/div&gt;
&lt;div class="a" style="text-align:right"&gt;按钮C&lt;/div&gt;</pre>
</li>
</ol>
<p>再来分析下4种方式各自的优缺点：</p>
<ol>
<li>每种不同款式，定义一个css。随着代码量变大，css将会变得越来越难维护。<strong>当你需要修改一个按钮风格的时候，所有同样风格的按钮都要改过</strong>。你copy到那里，哪里就得改，很容易遗漏。并且代码量也会相对更大，很多可重复利用的资源没有利用起来。</li>
<li>利用css层级覆盖来实现。利用css选择符的优先级来覆盖是很好的做法，也是很常用的做法。不过在很多情况下，例如<strong>大量的动态页面，我们没有办法完全预知定义的css的id或者类名，而无法定义特别样式。在一些可以控制的情况下，定义太多特殊类名用来区分，又会造成大量后期维护的困难。</strong></li>
<li>良好的运用css组合方式，可以比较妥善的解决上面的2个问题。首先，<strong>公用样式都被提取了，你修改一个按钮，只需要改公共的部分</strong>。其次，不需要绞 尽脑汁去想一个不会冲突的css类名，<strong>遵循组合的规则</strong>就可以了。当然，这种方法也有缺点，较为复杂的组合需要代码作者自己熟悉覆盖的规则，在css代码里 面并不知道html页面拿哪一些规则拿来进行组合，修改一个规则可能导致调用css的地方出问题。</li>
<li>内嵌style优点就是简单快速。缺点也很明显，不仅写起来有点麻烦，代码也难看，维护性也不好。很重要的一点，到处都是style会让人BS的，觉得你这前端div+css用得也忒不好了。所以代码洁癖的人往往宁可定义一个新样式，也不愿意页面有一个style。</li>
</ol>
<p>我们来看看一些大型站点是如何来解决这个问题的：</p>
<pre class="css" title="code">/* 一段摘抄自开心网kaixin001.com的css代码 */
.l{float:left;}.r{float:right; clear:right;}.c{clear:both;}
.tal{text-align:left;}.tar{text-align:right;}.tac{text-align:center;}
.c0,a.c0{color: #000; font-family:Arial;}
.c6,a.c6{color:#666; font-family:Arial;</pre>
<pre class="css" title="code">/* 一段摘抄自163.com的css代码 */
/* Font  */
.fB {font-weight: bold;}
.f12px{ font-size:12px;}
/* Other */
.left{ float: left;}
.right{ float: right;}
.clear{ clear: both; font-size:1px; width:1px; height:0; visibility: hidden; }
.clearfix:after{content:"."; display:block; height: 0; clear: both; visibility: hidden;} /* only FF */
.hidden {display: none;}
.blank3{ height:3px; clear:both;display:block; font-size:1px;overflow:hidden;}</pre>
<p>经常做前端开发的童鞋自己的开发也经常有这样的做法，但是也许并没有总结跟提取。不了解前端开发的人可能就比较纳闷，就这样一大堆属性的css定义，有什么用啊？跟用style有什么区别吗？</p>
<p>从上面2份css代码中，我们可以看到前端设计师经常会提取一些只有一个属性的css类，用来做组合。以163的为例，它有一个left的类，是左浮动，开心网更简单，是l。如果一个按钮正常情况下是不浮动的，但是有些地方它要左浮动，就只要在元素的class上面加一个left或者l，通过这样的组合来达到目的。</p>
<p><strong>Meta CSS框架，就是为了满足这样的一个需求而设计的一个框架。</strong></p>
<p>Meta CSS框架的实现参考了不少大型站点的css代码，分析代码里的共性而总结出来的，<strong>该框架可以整合<a href="http://developer.yahoo.com/yui/grids/" target="_blank">yui css</a>框架或者<a href="http://www.blueprintcss.org/" target="_blank">blueprints</a>框架来使用</strong>。它的作用在于以一个明确的命名规则，提供一个通用的css类集。正如这个框架的名字Meta，它规划出最小的最通用的”元定义”。可以与目前了解的各类css框架共存。</p>
<p>框架的意义，其实就是提供一个<strong>良好的可遵循的规范以及底层功能，规范代码的开发，提高开发的效率</strong>。Meta CSS也是遵循这样的一个理念，<a href="http://www.fangyuqiang.com/wp-content/uploads/2009/07/metacss.css" target="_self">查看完整版本</a>，先来看一个Meta CSS框架的代码片段：</p>
<pre class="css" title="code">/* Font  */
.fwb {
 font-weight: bold;
}
.fwn{
 font-weight: normal;
}
.tdn{
 text-decoration: none;
}
.tdu{
 text-decoration: underline;
}
.tdl{
 text-decoration: line-through;
}
.fs10p{
 font-size: 10px;
}
.fs11p{
 font-size: 11px;
}</pre>
<h3>Meta CSS框架的命名规则</h3>
<p>Meta CSS框架提供了一个简单而有规律的命名。</p>
<p>规则1：<strong>非</strong><strong>定义</strong><strong>尺寸的css定义，以css属性名的首字母+属性值的首字母组合而成</strong>。例如font-weight:bold，css类名就是fwb。text-align:center，css类名就是tac。float:left，css类名就是fl。</p>
<p>规则2：<strong>定义尺寸的css，以css属性名的首字母+属性值+属性值单位的首字母</strong>。例如font-size:10px，css类名就是fs10p。border:1px solid #cccccc; css类名为b1sc。<strong>特别的，%的数值，采用percent的首2个字母pe。</strong></p>
<p>规则3：<strong>多个属性的定义，命名参考规则1与规则2，中间用-连接</strong>。例如font-size:10px,font-weight:bold。css类名就是fs10p-fwb。</p>
<p>为什么要这样定义呢？有些人可能比较偏好开心网的，极致简单的，float:left，css类名是l，float:right，css类名就是r，非常简单。简单是非常简单，但是问题在于这样的定义显得很随意，没有规则。假设它定义的font-weight:bold的css类名是fb，那么新的开发者一定要去看代码才知道定义的名称叫fb，<strong>它没办法通过一个明确的规则来知道想要的属性是什么名称，有时候他还会很干脆的另外定义一个。</strong></p>
<p>而我们规定的这个命名规则，如果想要左浮动，就可以马上得知是：fl。font-weight:bold，可以马上知道是fwb，毫无疑惑。敏捷开发的一个很重要的思想，就是<strong>约定胜于配置，</strong><strong>meta css框架中很多css类名看起来很不优雅，甚至显得怪异，但是只要所有协同开发者了解这个约定，就可以大大减少记忆的工作量，所有的开发者都可以轻松的记住它。</strong></p>
<h3>Meta CSS框架的组成</h3>
<p>对照w3c的手册，Meta CSS将css定义分成了几个部分，分别是：font字体，text文本，background背景，position位置，dimension元素尺寸，layout布局，margin外边距，border边框，padding内边距，other其他以及combine联合定义。</p>
<p>具体的内容可以查看：<a href="http://www.fangyuqiang.com/wp-content/uploads/2009/07/metacss.css" target="_blank">metacss.css</a>，这里概况下各个部分的定义：</p>
<ul>
<li>font字体：定义了font-weight，text-decoration，font-size，color。</li>
<li>text文本：定义了text-align，text-indent</li>
<li>background背景：定义了background-color</li>
<li>position位置：定义了z-index</li>
<li>dimension元素尺寸：定义了width，height</li>
<li>layout布局：定义了float，overflow，display。特别的，有一个额外定义的css类c，可以在多浏览器环境下实现清除浮动。常常可以在一些css代码中见到，常常也命名为clearfix。</li>
<li>margin外边距：定义margin</li>
<li>border边框：定义了border</li>
<li>padding内边距：定义了padding</li>
<li>other其他：定义了cursor</li>
<li>combine联合定义：用户自行扩展定义。联合定义规定了多个属性的定义方法，比如font-weight加上font-size，定义的css类名为fs10p-fwb。</li>
</ul>
<h3>Meta CSS框架扩展与裁减</h3>
<p>Meta CSS说白了本质上就是一个css文件而已，要进行改动是一件很容易的事情，任何开发者都可以随意的往这个css文件里面添加或者删除任意属性与定义。<strong>随意的添加或删除当然不是我们希望看到的结果，遵循框架的约定进行增删改，才是真正意义上的扩展与裁减。</strong></p>
<p><strong>注意：根据你自己的项目，对Meta CSS进行扩展与裁减是非常正常的也是很有必要的。<br />
</strong></p>
<p><strong>扩展Meta CSS的方式很简单，就是遵循命名规则，添加新的css类定义。</strong>假设你要增加一个margin是20px的定义，默认框架中是margin:10px，你就可以添加一个m20p的css类就可以了。具体可以查看Meta CSS文件中的注释。</p>
<p><strong>裁减Meta CSS同样简单，删除文件中你确实不需要用到的属性就可以了。</strong>大部分时候，默认的一些字体，内外边距之类的定义往往不一定符合你的需求。</p>
<h3>Meta CSS 使用方法</h3>
<p>从语法上，你当然可以通过class=”fwb tar mr10p pt20p”来创建一个加粗的，右对齐的，右内边距10px，上外边距20px的元素，但是从框架本身的意义来说，这不是最佳的适用环境。Meta CSS框架适用的环境是：</p>
<ol>
<li><strong>的确是单一属性的定义。</strong>例如只是 class=”fwb”，加粗一个元素。</li>
<li><strong>对某一个css定义给出特殊情况的补充。</strong>参考开头部分提到的<a href="#e3">例子3</a>。</li>
</ol>
<p>代码中使用的范例：</p>
<pre class="html" title="code">&lt;style type="text/css"&gt;
	.fwb{
		font-weight:bold;
	}
	.tar{
		text-align:right;
	}
	.div1{
		border:1px solid #ccc;
		padding:15px;
		color:green;
		width:200px;
		margin-bottom:20px;
	}
&lt;/style&gt;
&lt;div id="d1" class="div1"&gt;
	第一个div
&lt;/div&gt;
&lt;div id="d2" class="div1 fwb"&gt;
	第二个div，字体加粗
&lt;/div&gt;
&lt;div id="d3" class="div1 tar"&gt;
	第三个div，右对齐
&lt;/div&gt;</pre>
<p>基本使用方法：<a href="http://www.fangyuqiang.com/wp-content/uploads/2009/07/metacss.css">下载metacss文件</a>，放到你的css文件夹中，可以采用形如</p>
<pre>&lt;link rel="stylesheet" href="css/metacss<code>.css" type="text/css" media="screen"&gt;
</code></pre>
<p>这样的css引用语句。你可以将metacss中所有的css定义copy到你的css文件中合并到一起，所有的css文件可以怎么做，你都可以怎么做。</p>
<h3>Meta CSS框架的局限性</h3>
<p>css优先级的影响，你不能保证定义总会生效，如果之前的css类已经包含某些要覆盖的定义，则有可能因为优先级的关系，不能生效。我们稍微修改下上面的例子：</p>
<pre class="html" title="code">&lt;style type="text/css"&gt;
	.fwb{
		font-weight:bold;
	}
	.tar{
		text-align:right;
	}
	.div1{
		border:1px solid #ccc;
		padding:15px;
		color:green;
		width:200px;
		margin-bottom:20px;
		text-align:left; /* 更高优先级，无法被tar覆盖 */
}
&lt;/style&gt;
&lt;div id="d1" class="div1"&gt;
	第一个div
&lt;/div&gt;
&lt;div id="d2" class="div1 fwb"&gt;
	第二个div，字体加粗
&lt;/div&gt;
&lt;div id="d3" class="div1 tar"&gt;
	第三个div，预期右对齐，但是事实上不会生效。
&lt;/div&gt;</pre>
<p>像这个例子里，.div1的text-align有比tar更高的优先级，所以用css组合这种方式就会不起作用。所以在应用框架的时候需要注意这一点。关于css优先级的讨论超出本文的范围，可以自己google一番。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/metacss/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>

