Css规范

  • OOCSS
  • SMACSS
  • BEM

OOCSS(Object Oriented CSS)面向对象的css

主要分成四个部分

  • Template :模板
  • Grids :栅格布局
  • Module :组件
  • Content :内容

Template模板

主要负责HTML的结构,让HTML更有层次感。

可以按功能模块来构建HTML的结构

常见的如:

人体架构

  • .header
  • .body
  • .footer

垂直方向

  • .top
  • .middle
  • .bottom

水平方向

  • .left
  • .main
  • .right

事物的结构构造(房子)由外向内

  • .building

    • .level

      • .room

        - .door

        - .window

        - .wall

        - .inner

结构整么搭,要根据业务来构建,以上只供参考

Grids栅格布局

主要是布局方面的类如何定义,可能采用的布局方式不同而不同。

参见的css布局:

  • 浮动布局
  • 弹性盒子布局
  • Grid布局

Grid布局由于兼容性问题,现在大多采用浮动布局和弹性盒子(IE10+ , 移动端)

浮动布局

  • .line

    • .unit
    • .lastUnit
    • .size1of2
    • .size2of3
//结构 也叫容器
.line {
position:relative;
} .line:after {
content: ' ';
display: 'block';
height: 0;
clear:both;
visibility: hidden;
} //浮动
.unit {
float: left;
} //添加到最后一个 unit后
.lastUnit {
display: table-cell;
float: none;
width: auto;
} //unit 的比例 1/2
.size1of2 {
width: 50%;
} //unit 的比例2/3
.size2of3 {
width: 66.6%;
}

浮动布局清浮动还可以参考bootstrap3 更优雅

.line:before,
.line:after {
content: '';
display: table;
} .line:after {
clear: both;
}

弹性盒子参考bootstrap4

  • .container

    • .row

      • .col

Module组件

各个组件特有的结构和样式。

以下类:

  • btn
  • btn btn-error
  • modal md-title

这里只要使用了继承的机制

btn-error继承了btn的基本样式,然后扩展了自己的样式error

md-title继承了modal的基本样式,然后添加自己专属样式

在sass中,可以通过占位符%和搭配@extend实现

Content内容

定义html标签,适合自己应用的基本样式,不用类,直接定义标签的样式。

SMACSS可扩展模块化架构的CSS

smacss免费在线书籍(英)

SMACSS的5大核心分类

  • Base
  • Layout
  • Module
  • State
  • Theme

Base

负责定义页面的默认样式,由于不同的浏览器都有自己的默认样式,要做到在不同浏览器上效果一致,需要开发者重写这些样式。

常见的base配置有Reset.css 和 normalize.css

由于中文和英文排版和显示有区别,推荐参考妹子ui的base。

base文件的规范:该文件只使用标签选择器、标签选择器配伪类、*,!important不应该出现在该文件中

*{
margin:0;
padding:0;
border:0;
} *,
*:before,
*:after {
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
} html,
body {
min-height: 100%;
background-color: #fff;
} a:active,
a:hover {
outline: 0;
}

Layout

主要负责页面的布局,在布局的时候,我们首先对页面进行结构布局,如圣杯布局

  • #header
  • #article
    • #sidebar
    • #main
  • #footer

对于整体的结构布局,由于只出现一次,且只能有一个,这里要使用id选择器。

#header, #article, #footer {
width: 960px;
margin: auto;
} #article {
border: solid #CCC;
border-width: 1px 0 0;
}

对于行列的布局,也即局部的布局,这些可以多次重复使用的,就不能使用id选择器了。

通过采用前缀的方式区分,l-,只要是和布局相关的都要加l-前缀,且只能是和布局相关的才能使用这个前缀。

常见的有栅格布局,按行和列布局等,可以参考上面OOCSS的Grids栅格布局,只需添加前缀.l-line和.l-unit。

还有,由于列表ul 或 ol是我们页面中最常用结构,很有必要给这个结构设计一个布局方式。

.l-list{
margin: 0;
padding: 0;
list-style-type: none;
} .l-list-item{
float: left;
height: 100px;
margin-left: 10px;
}

.l-list(ul/ol)、.l-list-item(li)比如上面这个浮动布局,这里没有清浮动,还可以用弹性盒子等布局方式。

为避免布局混乱,加强结构的层次,可以采用子选择器: >,来强耦合布局和HTML结构

.l-list{
margin: 0;
padding: 0;
list-style-type: none;
} .l-list > .l-list-item{
float: left;
height: 100px;
margin-left: 10px;
}

上面的结构强绑定对应的html结构才生效

<ul class='l-list'>
<li class='l-list-item'></li>
<li class='item'>
<ul class='list'>
<li class='l-list-item'></li>
</ul>
</li>
</ul>

如上面这个,最外层<ul class='l-list'>的 <li>只有类为.l-list-item才生效

而内部的<ul class='list'>的<li class='l-list-item'>就不会生效,l-list-item的父类一定要为.l-list才生效

但是>也有其缺点

  • IE6不兼容
  • 会增加css文件的体积和复杂性

优点

  • 可以用在任何地方,只要html符合格式
  • 性能比使用后代选择器或元素选择器更好(计算CSS值的时候)

Module

避免使用id选择器和标签选择器,应该只使用类选择器。

module也即组件,组件应该独立,有自己的命名空间。这个和OOCSS的module一样。

如一个模态窗:

.modal{}

.mod-header{}

.mod-body{}

.mod-footer{}
<div class='modal'>
<div class='mod-header'></div>
<div class='mod-body'></div>
<div class='mod-footer'></div>
</div>

State

个人觉得SMACSS最有意思的地方有,一是通过特殊的前缀指定命名空间和划分功能模块,再就是这个State。

表示某个指定状态下的样式,如

  • .is-collapsed
  • .is-clicked
  • .is-error
  • .is-success
  • .is-hidden

在模块中也可以定制特殊的状态。

.tab {
background-color: purple;
color: white;
} .is-tab-active {
background-color: white;
color: black;
}

这样就可以参考事物运动的过程,以状态切换点分割运动过程,不但可以减少思维上的复杂性,还利于维护。

特别是用户频繁操作的界面。

涉及到状态改变有四种方式

  • 类名 class name
  • 属性选择器 加 data-
  • 伪类:hover :focus
  • 媒体查询@media

通过改变类名的方式改变状态

通过定义伪类:hover :focus等有状态含义的伪类

通过定义媒体查询,根据屏幕大小变化来改变状态



其中,可以通过改变类名,删除、添加、替换的方式切换状态。

类中可以包含动画,伪类:after :before,还可以通过添加data-来区分不同的状态。

Theme

重写各个组件的基本样式,以达到切换主题的目的

// in module-name.css
.mod {
border: 1px solid;
} // in theme.css
.mod {
border-color: blue;
}

不过本人更喜欢bootstrap的variables.scss的方式

BEM

Block 、 Element 、 Modifier

块 >> 元素 >> 修饰符

.form { }

.form--theme-xmas { }
.form--simple { } .form__input { }
.form__submit { } .form__submit--disabled { }
<form class="form form--theme-xmas form--simple">
<input class="form__input" type="text" />
<input
class="form__submit form__submit--disabled"
type="submit" />
</form>

Block: .form

Element: .form__input .form__submit

Modifier: .form--theme-xmas .form--simple

一个Block由多个Element组成

Element由Block名充当前缀,且用__分隔符来区分Element

Modifier类似SMACSS的State,由Block名充电前缀,且用--分隔符来区分Modifier



上面中有个.form__submit--disabled

代表form块(Block)的submit元素(Element)的disabled修饰符(Modifier)

总结

  • 不管是SMACSS 还是 BEM 都采纳了OOCSS
  • OOCSS是所有的基础
  • SMACSS的分类方式,且提出的State很赞
  • BEM 用于写组件是个很不错的方式,不过类名太长了
  • 结合三者,OOCSS为基础,按SMACSS划分项目结构,BEM写组件
.modal{}

.modal > .mod_header{}
.modal > .mod_body{}
.modal > .mod_footer{} .modal > .mod_header-active{} .mod_header > .header-hidden{} .mod_body > .body_title{}
.mod_body > .body_title > .title-big{}

通过子选择器保存之前的命名空间,然后再开一个前缀,这样就可以避免类名过长

但是使用>会增加css文件的体积。

CSS规范(OOCSS SMACSS BEM)的更多相关文章

  1. Atitit.css 规范 bem  项目中 CSS 的组织和管理

    Atitit.css 规范 bem  项目中 CSS 的组织和管理 1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似).3 ...

  2. Atitit  OOCSS vs bem

    Atitit  OOCSS vs bem     1. 今天最流行的CSS开发框架技术当属OOCSS,尽管还有其他类似的技术存在,如BEM.1 2. CSS设计模式:OOCSS 和 SMACSS1 2 ...

  3. CSS规范--春风十里不如写好CSS

    先吟几句: 最近看了看春风十里不如你,本来很少看剧的,暑假有点闲就看了,感觉不错,挺喜欢这部剧,就套了个名字,嘿嘿嘿.剧里面印象深刻的是<致橡树>这首诗,念几句: 我如果爱你,绝不像攀援的 ...

  4. Scoped CSS规范草案

    原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/Scoped-CSS 写在前面 问:什么是Scoped CSS规范? Scoped CSS规范是We ...

  5. 前端CSS规范整理_转载、、、

    一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...

  6. 瞬间从IT屌丝变大神——CSS规范

    CSS规范主要包括以下内容: CSS Reset用YUI的CSS Reset. CSS采用CSSReset+common.css+app.css的形式. app.css采用分工制,一个前端工程师负责一 ...

  7. [转]前端CSS规范整理

    一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core  通用 ...

  8. 新手不得不注意HTML CSS 规范

    作为一名新进的程序菜鸟,根本不知道从哪里开始学起好,前辈都说HTML CSS 规范是一个十分需要注意的点,要我记下,特地转来保存一下,大家相互学习 //总论 本规范既然一个开发规范,也是一个脚本语言参 ...

  9. 前端CSS规范大全

    一.文件规范 1.文件均归档至约定的目录中(具体要求以豆瓣的CSS规范为例进行讲解): 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用 ...

随机推荐

  1. GoldenGate对接 mysql

    环境: centos 7.4 mysql 5.5.58 glibc 64 位版,下载链接:https://dev.mysql.com/downloads/mysql/5.5.html#download ...

  2. 集成Activiti工作流的J2EE快速开发框架

    框架简介 enos款快速开发模块化脚手架,实现功能有系统模块:菜单管理.用户管理.角色管理,系统监控:系统日志.接口api.sql监控. 系统功能 系统管理:菜单管理.用户管理.角色管理 统一查询 p ...

  3. PostgreSQL - 用psql 运行SQL文件

    对于预先写好的SQL文件,比如/home/user1/updateMyData.sql, 可以有两种方式来运行这个SQL文件. 方式一:连接db后执行SQL文件 首先通过psql连接到对应的db: p ...

  4. cobian backup 11 使用

    主机和备份机器创建备份用户(bf) 在备份机器上 设置备份用户, 备份目录右键安全,添加刚刚创建的备份bf用户,并授予所有权限 设置文件夹共享,并设置共享用户为刚刚创建的bf用户 并且在高级共享设置去 ...

  5. redis 的操作

    redis Redis(Remote Dictionary Server)是一个开源使用的非关系型数据库 通常被称为数据结构服务器,因为值可以是字符串,哈希,列表,集合,有序集合 优势 ​ 性能极高, ...

  6. [BZOJ3128]a+b Problem

    题解 最小割+主席树优化建图 首先看到每个点只有\(0/1\)两种状态就想到最小割 然后由于有一个限制是点\(i\)是黑点且有符合条件的白点就会减去\(p_i\) 所以我们将\(S\)集合设为黑点集合 ...

  7. B.小A与任务

    链接:https://ac.nowcoder.com/acm/contest/369/B 题意: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i ...

  8. GYM 101889E(dp)

    dp[i][j][k]表示第i位填数字k时,与后面的相连模数为j时,后面的数字最小填多少. 测得我提心吊胆还以为复杂度高了,结果出来46ms还是cf评测姬强啊. #pragma comment(lin ...

  9. Gym - 101810F ACM International Collegiate Programming Contest (2018)

    bryce1010模板 http://codeforces.com/gym/101810 #include<bits/stdc++.h> using namespace std; #def ...

  10. Redis特点

    内存存储,速度极快. 支持的数据类型多,相比较其他的Nosql. 键:字符串 值的六种数据结构:字符串,列表,散列,集合,有序集合,HyperLogLog 附加功能强大