CSS模块的设计原则:css
可重用前端
可维护编程
可扩展编程语言
.widget { background: yellow; border: 1px solid black; color: black; width: 50%; } #sidebar .widget { width: 200px; } body.homepage .widget { background: white; }
应用其他编程语言中类的概念,直接修改父组件的样式至关于修改类的定义,违反了开/闭原则
:对扩展开放;对修改闭合
ide
#main-nav ul li ul li div { } #content article h1:first-child { } #sidebar > div > h3 + p { }
依靠选择器与HTML元素标签组合,HTML代码很干净,可是CSS却变得凌乱,而且增长了CSS与HTML结构的耦合模块化
.widget { position: absolute; top: 20px; left: 20px; background-color: red; font-size: 1.5em; text-transform: uppercase; }
.widget
选择器同时设置了组件的位置、外观。组件的外观能够通用,可是位置却不能。布局
出现上述问题的愿意:一个
class
承担的样式太多。测试
项目的总体复杂度是必定的,但各个模块的复杂度不一样。设计
使用复杂的选择器、一个class
承担许多功能,能够简化开发的流程;可是维护与重用却很麻烦code
模块划分会增长CSS开发的复杂度,可是却同时下降CSS维护与重用的麻烦
CSS中尽量少的包含HTML结构:少使用嵌套层次深的选择器;
CSS只定义模块外观样式,在HTML页面上进行调用:更少的CSS被更多的HTML结构调用
对于抽象的样式能够定义在容器中
使用类选择器定义元素样式,将
class
应用在元素上便可;不要写嵌套深的CSS选择器
/* Grenade */ #main-nav ul li ul { } /* Sniper Rifle */ .subnav { }
一个组织结构良好的组件层能够解决HTML与CSS的耦合关系。CSS定义组件的外观,不定义位置和布局。在使用
background
、font
等简写属性时,注意其中关于位置和布局的样式(background-position
等)布局和位置由单独的布局类或单独容器元素构成。
对组件每一个子元素都使用命名空间,每一个元素在不一样语境使用修饰符扩展。下降现有类名冲突
使用BEM(
Block__Element--Modifier
)规则进行命名。
.btn .btn__item .btn__item--info .btn__item--danger
在《SMACSS》中提到,CSS能够被分红4中不一样的类:基础
base
、布局layout
、模块modules
和状态state
基础base
:包括复位原则和元素的初始值;
布局layout
:对整个站点内元素进行定位(相似网格系统)
模块modules
:可重用的视觉元素
状态state
:不一样状态触发的样式(经过JavaScript实现开启和关闭)
在Web前端中,
class
类名的做用有四种:HTML样式、JavaScript的hook、功能检测和自动化测试
为区别不一样功能的class
,建议为其增长前缀:js-
用于JavaScript操做