css 规范

# CSS文件的分类和引用顺序

通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类。

我们按照CSS的性质和用途,将CSS文件分成“公共型样式”、“特殊型样式”、“皮肤型样式”,并以此顺序引用(按需求决定是否添加版本号)。

公共型样式:包括了以下几个部分:“标签的重置和设置默认值”、“统一调用背景图和清除浮动或其他需统一处理的长样式”、“网站通用布局”、“通用模块和其扩展”、“元件和其扩展”、“功能类样式”、“皮肤类样式”。

特殊型样式:当某个栏目或页面的样式与网站整体差异较大或者维护率较高时,可以独立引用一个样式:“特殊的布局、模块和元件及扩展”、“特殊的功能、颜色和背景”,也可以是某个大型控件或模块的独立样式。

皮肤型样式:如果产品需要换肤功能,那么我们需要将颜色、背景等抽离出来放在这里。

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{}),具体详见命名规则的扩展相关项。

功能类和皮肤类样式为表现化的样式,请不要滥用!以上顺序可以按需求适当调整。

/* 重置 */

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;}

# CSS规范 - 命名规则

## 使用类选择器,放弃ID选择器

ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用。

## NEC特殊字符:"-"连字符

"-"在本规范中并不表示连字符的含义。

她只表示两种含义:分类前缀分隔符、扩展分隔符,详见以下具体规则。

分类的命名方法:使用单个字母+"-"为前缀

布局(grid)(.g-);模块(module)(.m-);元件(unit)(.u-);功能(function)(.f-);皮肤(skin)(.s-);状态(.z-)。

对以上的解释详情参见:分类方法中的“CSS内部的分类及其顺序”。

注:在你样式中的选择器总是要以上面前五类开头,然后在里面使用后代选择器。

  如果这五类不能满足你的需求,你可以另外定义一个或多个大类,但必须符合单个字母+"-"为前缀的命名规则,即 .x- 的格式。

  特殊:.j-将被专用于JS获取节点,请勿使用.j-定义样式。

## 后代选择器命名

约定不以单个字母+"-"为前缀且长度大于等于2的类选择器为后代选择器,如:.item为m-list模块里的每一个项,.text为m-list模块里的文本部分:.m-list .item{}.m-list .text{}。

一个语义化的标签也可以是后代选择器,比如:.m-list li{}。

不允许单个字母的类选择器出现,原因详见下面的“模块和元件的后代选择器的扩展类”。

通过使用后代选择器的方法,你不需要考虑他的命名是否已被使用,因为他只在当前模块或元件中生效,同样的样式名可以在不同的模块或元件中重复使用,互不干扰;在多人协作或者分模块协作的时候效果尤为明显!

后代选择器不需要完整表现结构树层级,尽量能短则短。

注:后代选择器不要在页面布局中使用,因为污染的可能性较大;

/* 这里的.itm和.cnt只在.m-list中有效 */

.m-list{margin:0;padding:0;}

.m-list .itm{margin:1px;padding:1px;}

.m-list .cnt{margin-left:100px;}

/* 这里的.cnt和.num只在.m-page中有效 */

.m-page{height:20px;}

.m-page .cnt{text-align:center;}

.m-page .num{border:1px solid #ddd;}

## 命名应简约而不失语义

/* 反对:表现化的或没有语义的命名 */

.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等等。

## 模块和元件的扩展类的命名方法

当A、B、C、...它们类型相同且外形相似区别不大,那么就以它们中出现率最高的做成基类,其他做成基类的扩展。

方法:+“-”+数字或字母(如:.m-list的扩展类为.m-list-1、.m-list-2等)。

补充:基类自身可以独立使用(如:class="m-list"即可),扩展类必须基于基类使用(如:class="m-list m-list-2")。

如果你的扩展类是表示不同状态,那么你可以这样命名:u-btn-dis,u-btn-hov,m-box-sel,m-box-hov等等,然后像这样使用:class="u-btn u-btn-dis"。

如果你的网站可以不兼容IE6等浏览器,那么你标识状态的方法也可以采取独立状态分类(.z-)方法:.u-btn.z-dis,.m-box.z-sel,然后像这样使用:class="u-btn z-dis"。

模块和元件的后代选择器的扩展类

有时候模块内会有些类似的东西,如果你没有把它们做成元件和扩展,那么也可以使用后代选择器和扩展。

后代选择器:.m-login .btn{}。

后代选择器扩展:.m-login .btn-1{},.m-login .btn-dis{}。

同样也可以采取独立状态分类(.z-)方法:.m-login .btn.z-dis{},然后像这样使用:class="btn z-dis"。

注:此方法用于类选择器,直接使用标签做为选择器的则不需要使用此命名方法。

注:为防止后代选择器的扩展类和大类命名规范冲突,后代选择器不允许使用单个字母。

  比如:.m-list .a{}是不允许的,因为当这个.a需要扩展的时候就会变成.a-bb,这样就和大类的命名规范冲突。

分组选择器有时可以代替扩展方法

有时候虽然两个同类型的模块很相似,但是你希望他们之间不要有依赖关系,也就是说你不希望使用扩展的方法,那么你可以通过合并选择器来设置共性的样式。

使用本方法的前提是:相同类型、功能和外观都相似,写在同一片代码区域方便维护。

/* 两个元件共性的样式 */

.u-tip1,.u-tip2{}

.u-tip1 .itm,.u-tip2 .itm{}

/* 在分别是两个元件各自的样式 */

/* tip1 */

.u-tip1{}

.u-tip1 .itm{}

/* tip2 */

.u-tip2{}

.u-tip2 .itm{}

防止污染和被污染

当模块或元件之间互相嵌套,且使用了相同的标签选择器或其他后代选择器,那么里面的选择器就会被外面相同的选择器所影响。

所以,如果你的模块或元件可能嵌套或被嵌套于其他模块或元件,那么要慎用标签选择器,必要时采用类选择器,并注意命名方式,可以采用.m-layer .layerxxx、.m-list2 .list2xxx的形式来降低后代选择器的污染性。

# CSS规范 - 代码格式

选择器、属性和值都使用小写

在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

很多不兼容问题可以通过改变方法和思路来解决,并非一定需要Hack,根据经验你完全可以绕过某些兼容问题。

一种合理的结构和合理的样式,是极少会碰到兼容问题的。

由于浏览器自身缺陷,我们无法避开的时候,可以允许使用适当的Hack。

统一Hack方法

统一使用“*”和“_”分别对IE7和6进行Hack。如下代码所示:

/* IE7会显示灰色#888,IE6会显示白色#fff,其他浏览器显示黑色#000 */

.m-list{color:#000;*color:#888;_color:#fff;}

建议并适当缩写值

“建议并适当”是因为缩写总是会包含一系列的值,而有时候我们并不希望设置某一值,反而造成了麻烦,那么这时候你可以不缩写,而是分开写。

当然,在一切可以缩写的情况下,请务必缩写,它最大的好处就是节省了字节,便于维护,并使阅读更加一目了然。

缩写方法请查阅css手册。

选择器顺序

请综合考虑以下顺序依据:

从大到小(以选择器的范围为准)

从低到高(以等级上的高低为准)

从先到后(以结构上的先后为准)

从父到子(以结构上的嵌套为准)

以下仅为简单示范:

/* 从大到小 */

.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 = 行内样式style。

b = ID选择器的数量。

c = 类、伪类和属性选择器的数量。

d = 类型选择器和伪元素选择器的数量。

选择器                 等级(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

# CSS规范 - 优化方案

值缩写

缩写值可以减少CSS文件大小,并增加可读性和可维护性。

但并非所有的值都必须缩写,因为当一个属性的值缩写时,总是会将所有项都设置一遍,而有时候我们不希望设置值里的某些项。

/*  比如我们用下面这个样式来让某个定宽的容器水平居中,我们要的只是left和right,

    而top和bottom不是这个样式要关心的(如果设置了反倒会影响其他样式在这个容器上的使用),

    所以这时我们就不需要缩写

*/

.f-mgha{margin-left:auto;margin-right:auto;}

/* 比如下面这个模块的样式设置,我们确实需要设置padding的所有项,于是我们就可以采用缩写 */

.m-link{padding:6px 12px;}

避免耗性能的属性

以下所举列的属性可能造成渲染性能问题。不过有时候需求大于一切……

/* expression */

.class{width:expression(this.width>100?'100px':'auto');}

/* filter */

.class{filter:alpha(opacity=50);}

选择器合并

即CSS选择器组合,可以一次定义多个选择器,为你节省很多字节和宝贵时间。

通常我们会将定义相同的或者有大部分属性值相同(确实是因为相关而相同)的一系列选择器组合到一起(采用逗号的方法)来统一定义。

/* 以下对布局类选择器统一做了清除浮动的操作 */

.g-hd:after,.g-bd:after,.g-ft:after{display:block;visibility:hidden;clear:both;height:0;content:".";}

.g-hd,.g-bd,.g-ft{zoom:1;}

/* 通常background总是会占用很多字节,所以一般情况下,我们都会这样统一调用 */

.m-logo,.m-help,.m-list li,.u-tab li,.u-tab li a{background:url(../images/sprite.png) no-repeat 9999px 9999px;}

.m-logo{background-position:0 0;}

/* 以下是某个元件的写法,因为确实很多元素是联动的或相关的,所以采用了组合写法,可以方便理解和修改 */

.u-tab li,.u-tab li a{display:inline;float:left;height:30px;line-height:30px;}

.u-tab li{margin:0 3px;}

.u-tab li a{padding:0 6px;}

背景图优化合并

图片本身的优化:

图像质量要求和图像文件大小决定你用什么格式的图片,用较小的图片文件呈现较好的图像质量。

当图片色彩过于丰富且无透明要求时,建议采用jpg格式并保存为较高质量。

当图片色彩过于丰富又有透明或半透明要求或阴影效果时,建议采用png24格式,并对IE6进行png8退化(或在不得已情况下使用滤镜)。

当图片色彩不太丰富时无论有无透明要求,请采用png8格式,大多数情况下建议采用这种格式。

当图片有动画时,只能使用gif格式。

你可以使用工具对图片进行再次压缩,但前提是不会影响色彩和透明。

多张图片的合并:

单个图标之间必须保留空隙,空隙大小由容器大小及显示方式决定。这样做的好处是既考虑了“容错性”又提高了图片的可维护性。

图标的排列方式,也由容器大小及显示方式决定。排列方式分为以下几种:横向排列(容器宽度有限)、纵向排列(容器高度有限)、斜线排列(容器宽高不限),靠左排列(容器背景居左)、靠右排列(容器背景居右)、水平居中排列(容器背景水平居中)、垂直居中排列(容器背景垂直居中)。

合并后图片大小不宜超过50K,建议大小在20K-50K之间。

为保证多次修改后的图片质量,请保留一份PSD原始图,修改和添加都在PSD中进行,最后导出png。

分类合并:

并不是把所有的图标都合并在一张图片里就是最好的,除了要控制图片大小之外还要注意以下方法。

按照图片排列方式,把排列方式一样的图片进行合并,便于样式控制。

按照模块或元件,把同属于一个模块或元件的图片进行合并,方便模块或元件的维护。

按照图片大小,把大小一致或差不多的图片进行合并,可充分利用图片空间。

按照图片色彩,把色彩一致或差不多的图片进行合并,保证合并后图片的色彩不过于丰富,可防止色彩失真。

综合以上方法进行合并。

如果CSS可以做到,就不要使用JS

让CSS做更多的事,减轻JS开发量。

用CSS控制交互或视觉的变化,JS只需要更改className。

利用CSS一次性更改多个节点样式,避免多次渲染,提高渲染效率。

如果你的产品允许不兼容低版本浏览器,那么动画实现可以交给CSS。

#  CSS规范 - 最佳实践

最佳选择器写法(模块)

/* 这是某个模块 */

.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时使用) */

统一语义理解和命名

布局(.g-)

语义  命名  简写

文档  doc     doc

头部  head    hd

主体  body    bd

尾部  foot    ft

主栏  main    mn

主栏子容器   mainc   mnc

侧栏  side    sd

侧栏子容器   sidec   sdc

盒容器 wrap/box    wrap/box

模块(.m-)、元件(.u-)

语义  命名  简写

导航  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

功能(.f-)

语义  命名  简写

浮动清除    clearboth   cb

向左浮动    floatleft   fl

向右浮动    floatright  fr

内联块级    inlineblock ib

文本居中    textaligncenter tac

文本居右    textalignright  tar

文本居左    textalignleft   tal

垂直居中    verticalalignmiddle vam

溢出隐藏    overflowhidden  oh

完全消失    displaynone dn

字体大小    fontsize    fs

字体粗细    fontweight  fw

皮肤(.s-)

语义  命名  简写

字体颜色    fontcolor   fc

背景  background  bg

背景颜色    backgroundcolor bgc

背景图片    backgroundimage bgi

背景定位    backgroundposition  bgp

边框颜色    bordercolor bdc

状态(.z-)

语义  命名  简写

选中  selected    sel

当前  current crt

显示  show    show

隐藏  hide    hide

打开  open    open

关闭  close   close

出错  error   err

不可用 disabled    dis

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 使用类选择器,放弃ID选择器 ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用。 NEC特殊...
    龍飝阅读 302评论 0 3
  • CSS文件的分类和引用顺序 通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类。...
    龍飝阅读 229评论 0 2
  • 文章转载自:https://www.cnblogs.com/Ry-yuan/p/7384149.html css语...
    王叮叮当当响阅读 441评论 0 0
  • 使用类选择器,放弃ID选择器 ID在一个页面中的唯一性导致了如果以ID为选择器来写CSS,就无法重用。 NEC特殊...
    小豌豆书吧阅读 179评论 0 1
  • 值缩写缩写值可以减少CSS文件大小,并增加可读性和可维护性。但并非所有的值都必须缩写,因为当一个属性的值缩写时,总...
    龍飝阅读 163评论 0 3