@brizer
2016-02-17T12:12:06.000000Z
字数 6701
阅读 1391
工作需要,学习编程规范。
先谈谈编写css的排列顺序:
重置(reset)和默认(base)(tags):消除默认样式和浏览器差异,并设置部分标签的初始样式,以减少后面的重复劳动!你可以根据你的网站需求设置!
统一处理:建议在这个位置统一调用背景图(这里指多个布局或模块或元件共用的图)和清除浮动(这里指通用性较高的布局、模块、元件内的清除)等统一设置处理的样式!
布局(grid)(.g-):将页面分割为几个大块,通常有头部、主体、主栏、侧栏、尾部等!
模块(module)(.m-):通常是一个语义化的可以重复使用的较大的整体!比如导航、登录、注册、各种列表、评论、搜索等!
元件(unit)(.u-):通常是一个不可再分的较为小巧的个体,通常被重复用于各种模块中!比如按钮、输入框、loading、图标等!
功能(function)(.f-):为方便一些常用样式的使用,我们将这些使用率较高的样式剥离出来,按需使用,通常这些选择器具有固定样式表现,比如清除浮动等!不可滥用!
皮肤(skin)(.s-):如果你需要把皮肤型的样式抽离出来,通常为文字色、背景色(图)、边框色等,非换肤型网站通常只提取文字色!非换肤型网站不可滥用此类!
状态(.z-):为状态类样式加入前缀,统一标识,方便识别,她只能组合使用或作为后代出现(.u-ipt.z-dis{},.m-list li.z-sel{}),具体详见命名规则的扩展相关项。
看看demo:
/* 重置 */div,p,ul,ol,li{margin:0;padding:0;}/* 默认 */strong,em{font-style:normal;font-weight:bold;}/* 统一调用背景图 */.m-logo a,.m-nav a,.m-nav em{background:url(images/sprite.png) no-repeat 9999px 9999px;}/* 统一清除浮动 */.g-bdc:after,.m-dimg ul:after,.u-tab:after{display:block;visibility:hidden;clear:both;height:0;overflow:hidden;content:'.';}.g-bdc,.m-dimg ul,.u-tab{zoom:1;}/* 布局 */.g-sd{float:left;width:300px;}/* 模块 */.m-logo{width:200px;height:50px;}/* 元件 */.u-btn{height:20px;border:1px solid #333;}/* 功能 */.f-tac{text-align:center;}/* 皮肤 */.s-fc,a.s-fc:hover{color:#fff;}
这里需要注意一下分类:
布局(grid)(.g-);
模块(module)(.m-);
元件(unit)(.u-);
功能(function)(.f-);
皮肤(skin)(.s-);
状态(.z-)。
在你样式中的选择器总是要以上面前五类开头,然后在里面使用后代选择器。
如果这五类不能满足你的需求,你可以另外定义一个或多个大类,但必须符合单个字母+"-"为前缀的命名规则,即 .x- 的格式。
特殊:.j-将被专用于JS获取节点,请勿使用.j-定义样式。
命名需要简约但是又不能失去语义:
/* 反对:表现化的或没有语义的命名 */.m-abc .green2{}.g-left2{}/* 推荐:使用有语义的简短的命名 */.m-list .wrap2{}.g-side2{}
可以通过添加数字和字母来区分相同语义的不同类命名:
.m-list、.m-list2、.m-list3等,都是列表模块,但是是完全不一样的模块)。
其他举例:.f-fw0、.f-fw1、.s-fc0、.s-fc1、.m-logo2、.m-logo3、u-btn、u-btn2等等。
有时候两个同类型的模块很相似,可以通过合并选择器来设置共性的样式:
/* 两个元件共性的样式 */.u-tip1,.u-tip2{}.u-tip1 .itm,.u-tip2 .itm{}/* 在分别是两个元件各自的样式 *//* tip1 */.u-tip1{}.u-tip1 .itm{}/* tip2 */.u-tip2{}.u-tip2 .itm{}
小写
在xhtml标准中规定了所有标签、属性和值都小写,CSS也是如此。
单行写完一个选择器定义
便于选择器的寻找和阅读,也便于插入新选择器和编辑,便于模块等的识别。去除多余空格,使代码紧凑减少换行。
如果有嵌套定义,可以采取内部单行的形式。
/* 单行定义一个选择器 */.m-list li,.m-list h3{width:100px;padding:10px;border:1px solid #ddd;}/* 这是一个有嵌套定义的选择器 */@media all and (max-width:600px){.m-class1 .itm{height:17px;line-height:17px;font-size:12px;}.m-class2 .itm{width:100px;overflow:hidden;}}@-webkit-keyframes showitm{0%{height:0;opacity:0;}100%{height:100px;opacity:1;}}
省略值为0时的单位
为节省不必要的字节同时也使阅读方便,我们将0px、0em、0%等值缩写为0。
.m-box{margin:0 10px;background-position:50% 0;}
使用单引号
省略url引用中的引号,其他需要引号的地方使用单引号。
.m-box{background:url(bg.png);}.m-box:after{content:'.';}
使用16进制表示颜色值
除非你需要透明度而使用rgba,否则都使用#f0f0f0这样的表示方法,并尽量缩写。
.m-box{color:#f00;background:rgba(0,0,0,0.5);}
根据属性的重要性按顺序书写
只遵循横向顺序即可,先显示定位布局类属性,后盒模型等自身属性,最后是文本类及修饰类属性。
| 显示属性 | 自身属性 | 文本属性和其他修饰 |
|---|---|---|
| display | width | font |
| visibility | height | text-align |
| position | margin | text-decoration |
| float | padding | vertical-align |
| clear | border | white-space |
| list-style | overflow | color |
| top | min-width | background |
举例子:
.m-box{position:relative;width:600px;margin:0 auto 10px;text-align:center;color:#000;}
如果属性间存在关联性,则不要隔开写。
/* 这里的height和line-height有关联性 */.m-box{position:relative;height:20px;line-height:20px;padding:5px;color:#000;}
私有在前,标准在后
先写带有浏览器私有标志的,后写W3C标准的。
.m-box{-webkit-box-shadow:0 0 0 #000;-moz-box-shadow:0 0 0 #000;box-shadow:0 0 0 #000;}
注释
/* 块状注释文字* 块状注释文字* 块状注释文字*/.m-list{width:500px;}.m-list li{height:20px;line-height:20px;/* 这里是对line-height的一个注释 */overflow:hidden;}.m-list li a{color:#333;}/* 单行注释文字 */.m-list li em{color:#666;}
hack
统一使用“*”和“_”分别对IE7和6进行Hack。如下代码所示:
/* IE7会显示灰色#888,IE6会显示白色#fff,其他浏览器显示黑色#000 */.m-list{color:#000;*color:#888;_color:#fff;}
选择器顺序
从大到小,从低到高,从先到后,从父到子。
从大到小说的是选择器的范围;从低到高说的是等级,从先到后说的是结构,从父到子说的是嵌套。
/* 从大到小 */.m-list p{margin:0;padding:0;}.m-list p.part{margin:1px;padding:1px;}/* 从低到高 */.m-logo a{color:#f00;}.m-logo a:hover{color:#fff;}/* 从先到后 */.g-hd{height:60px;}.g-bd{height:60px;}.g-ft{height:60px;}/* 从父到子 */.m-list{width:300px;}.m-list .itm{float:left;}
这里把等级单独提出了回顾:
| 选择器 | 等级(a,b,c,d) |
|---|---|
| style=”” | 1,0,0,0 |
| #wrapper #content {} | 0,2,0,0 |
| #content .dateposted {} | 0,1,1,0 |
| div#content {} | 0,1,0,1 |
| #content p {} | 0,1,0,1 |
| #content {} | 0,1,0,0 |
| p.comment .dateposted {} | 0,0,2,1 |
| div.comment p {} | 0,0,1,2 |
| .comment p {} | 0,0,1,1 |
| p.comment {} | 0,0,1,1 |
| .comment {} | 0,0,1,0 |
| div p {} | 0,0,0,2 |
| p {} | 0,0,0,1 |
图片本身
对于图片本身而言针对不同使用场景使用不同类型的图片,争取用较小的图片文件呈现较好的图像质量。
当图片色彩过于丰富且无透明要求时,建议采用jpg格式并保存为较高质量。
当图片色彩过于丰富又有透明或半透明要求或阴影效果时,建议采用png24格式,并对IE6进行png8退化(或在不得已情况下使用滤镜)。
当图片色彩不太丰富时无论有无透明要求,请采用png8格式,大多数情况下建议采用这种格式。
当图片有动画时,只能使用gif格式。
你可以使用工具对图片进行再次压缩,但前提是不会影响色彩和透明。
多图片合并
对于多图片合并,也就是css精灵,也有以下几点需要注意的地方:
单个图标之间必须保留空隙,空隙大小由容器大小及显示方式决定。这样做的好处是既考虑了“容错性”又提高了图片的可维护性。
图标的排列方式,也由容器大小及显示方式决定。排列方式分为以下几种:横向排列(容器宽度有限)、纵向排列(容器高度有限)、斜线排列(容器宽高不限),靠左排列(容器背景居左)、靠右排列(容器背景居右)、水平居中排列(容器背景水平居中)、垂直居中排列(容器背景垂直居中)。
合并后图片大小不宜超过50K,建议大小在20K-50K之间。
为保证多次修改后的图片质量,请保留一份PSD原始图,修改和添加都在PSD中进行,最后导出png。
合并注意事项
并不是把所有的图标都合并在一张图片里就是最好的,除了要控制图片大小之外还要注意以下方法。
按照图片排列方式,把排列方式一样的图片进行合并,便于样式控制。
按照模块或元件,把同属于一个模块或元件的图片进行合并,方便模块或元件的维护
。
按照图片大小,把大小一致或差不多的图片进行合并,可充分利用图片空间。
按照图片色彩,把色彩一致或差不多的图片进行合并,保证合并后图片的色彩不过于丰富,可防止色彩失真。
综合以上方法进行合并。
选择器最佳写法
/* 这是某个模块 */.m-nav{}/* 模块容器 */.m-nav li,.m-nav a{}/* 先共性 优化组合 */.m-nav li{}/* 后个性 语义化标签选择器 */.m-nav a{}/* 后个性中的共性 按结构顺序 */.m-nav a.a1{}/* 后个性中的个性 */.m-nav a.a2{}/* 后个性中的个性 */.m-nav .z-crt a{}/* 交互状态变化 */.m-nav .z-crt a.a1{}.m-nav .z-crt a.a2{}.m-nav .btn{}/* 典型后代选择器 */.m-nav .btn-1{}/* 典型后代选择器扩展 */.m-nav .btn-dis{}/* 典型后代选择器扩展(状态) */.m-nav .btn.z-dis{}/* 作用同上,请二选一(如果可以不兼容IE6时使用) */.m-nav .m-sch{}/* 控制内部其他模块位置 */.m-nav .u-sel{}/* 控制内部其他元件位置 */.m-nav-1{}/* 模块扩展 */.m-nav-1 li{}.m-nav-dis{}/* 模块扩展(状态) */.m-nav.z-dis{}/* 作用同上,请二选一(如果可以不兼容IE6时使用) */
统一语义理解和命名
| 语义 | 命名 | 简写 |
|---|---|---|
| 文档 | doc | doc |
| 头部 | head | hd |
| 主体 | body | bd |
| 尾部 | foot | ft |
| 主栏 | main | mn |
| 主栏子容器 | mainc | mnc |
| 侧栏 | side | sd |
| 侧栏子容器 | sidec | sdc |
| 盒容器 | wrap/box | wrap/box |
| 语义 | 命名 | 简写 |
|---|---|---|
| 导航 | nav | nav |
| 子导航 | subnav | snav |
| 面包屑 | crumb | crm |
| 菜单 | menu | menu |
| 选项卡 | tab | tab |
| 标题区 | head/title | hd/tt |
| 内容区 | body/content | bd/ct |
| 列表 | list | lst |
| 表格 | table | tb |
| 表单 | form | fm |
| 热点 | hot | hot |
| 排行 | top | top |
| 登录 | login | log |
| 标志 | logo | logo |
| 广告 | advertise | ad |
| 搜索 | search | sch |
| 幻灯 | slide | sld |
| 提示 | tips | tips |
| 帮助 | help | help |
| 新闻 | news | news |
| 下载 | download | dld |
| 注册 | regist | reg |
| 投票 | vote | vote |
| 版权 | copyright | cprt |
| 结果 | result | rst |
| 标题 | title | tt |
| 按钮 | button | btn |
| 输入 | input | ipt |
| 语义 | 命名 | 简写 |
|---|---|---|
| 浮动清除 | clearboth | cb |
| 向左浮动 | floatleft | fl |
| 向右浮动 | floatright | fr |
| 内联块级 | inlineblock | ib |
| 文本居中 | textaligncenter | tac |
| 文本居右 | textalignright | tar |
| 文本居左 | textalignleft | tal |
| 垂直居中 | verticalalignmiddle | vam |
| 溢出隐藏 | overflowhidden | oh |
| 完全消失 | displaynone | dn |
| 字体大小 | fontsize | fs |
| 字体粗细 | fontweight | fw |
| 语义 | 命名 | 简写 |
|---|---|---|
| 字体颜色 | fontcolor | fc |
| 背景 | background | bg |
| 背景颜色 | backgroundcolor | bgc |
| 背景图片 | backgroundimage | bgi |
| 背景定位 | backgroundposition | bgp |
| 边框颜色 | bordercolor | bdc |
| 语义 | 命名 | 简写 |
|---|---|---|
| 选中 | selected | sel |
| 当前 | current | crt |
| 显示 | show | show |
| 隐藏 | hide | hide |
| 打开 | open | open |
| 关闭 | close | close |
| 出错 | error | err |
| 不可用 | disabled | dis |
要避免以下典型错误:
不要以一个没有类别的样式作为主选择器,这样的选择器只能作为后代选择器使用,比如.m-xxx .class{}。
不要以没有语义的标签作为选择器,这会造成大面积污染,除非你可以断定现在或将来你的这个选择器不会污染其他同类。
不要在页面布局中使用后代选择器,因为这个后代选择器可能会污染里面的元素。
不要用布局去控制模块或元件,模块和元件应与布局分离独立。
不要通过模块或其他类来重定义或修改或添加已经定义好的功能类选择器和皮肤类选择器。
不要将选择器写的过于冗长,这会额外增加文件大小并且限制了太小范围的选择器,使树形结构过于严格应用范围过于局限,建议3-4个长度之内写完。
选择器并不需要完整反映结构嵌套顺序,相反,能简则简。
不要越级控制,如果.zzz是.m-yyy的后代选择器,那么不允许.m-yyy之外的选择器控制或修改.zzz。
此时可以使用.m-yyy的扩展来修改.zzz,比如.m-yyy-1 .zzz{}。