css-命名和冲突避免

164 阅读5分钟

一、css的命名

1. BEM

定义
BEM全称 Block Element Modifier,分别表示为块、元素、修饰符

  • Block 该区域元素的元素性质。例:card、list、nav、board

(1)命名意义准确,具有唯一性
(2)可以放到任何位置,可以相互嵌套
(3)单词可以使用驼峰或单连字符

  • Element Block区域中的特定元素,用双下划线( __ )表示。例:card__name、list__item、nav__text、board__btn

(1)命名意义准确
(2)可以相互嵌套 (3)单词可以使用驼峰或单连字符

  • Modifier Element特定元素的具体样式或状态,用双连字符( -- )表示。例:card__name--red、board__btn--active

(1)命名意义准确
(2)单词可以使用驼峰或单连字符

优点:代码样式规范,便于阅读
缺点:代码冗长,书写繁琐

注意:
使用时,类名不是展示所有层级结构,这样会导致类名过长。
正确做法是只书写当前元素的性质Block和特定Element。

2. oocss

定义
oocss全称 Object Oriented Css,面向对象的css,即css模块化。

避免后代选择器和id选择器。使用class选择器代替标签选择器。提倡重用性。

使用原则:

  • 结构与样式分离
//定义多个样式不同的按钮

//结构
.btn{
    width:300px;
    height:150px;
    border-radius:75px;
}

//样式
.btn-red{
    color:white;
    font-size:24px;
    font-weight:bold;
    background-color:red;
    border:2px solid white;
}
.btn-yellow{
    color:white;
    font-size:24px;
    font-weight:bold;
    background-color:yellow;
    border:2px solid white;
}
//使用
<button class="btn btn-red">按钮</button>

结构:封装性属性。如,margin、padding、width、height、display、box-sizing
样式:表现性属性。如,color、border、backgound-color、box-shadow

借助@each可以定义多种主体样式:

$theme-colors{
warning:yellow,
success:green,
danger:red
}

@each $key,$value in $theme-colors{
    .btn-#{$key}{
        color:white;
        background-color:$value;
    }
}

此时我们就得到了.btn-warning.btn-success.btn-danger三种不同样式的类,当我们需要其他的类时,可以添加新的$theme-colors键值。此语法参考(css-sass脚本语言 - 掘金 (juejin.cn))过往文章。

  • 容器和内容分类
    我们可以借助BEM来说明。容器就相当于B性质,内容就相当于E特定。
.card{
    display:flex;
    justify-content:center;
    align-items:center;
    width:350px;
    height:350px;
}

.card .btn{
    width:100px;
    height:50px;
}

从这个例子中,我们可以分析得出,card是容器,而btn是内容。此时,我们看到btn这个类属于card的子类。当我们向使用btn时,我们会发现,无法复用btn,因为它的权重是0,0,2,0,要考虑权重问题,所以不能复用。

所以,我们需要拆出来,btn成为单独的类。

.card{
    display:flex;
    justify-content:center;
    align-items:center;
    width:350px;
    height:350px;
}

.btn{
    width:100px;
    height:50px;
}

容器:.container.header
内容:.btn.input

3.SMACSS

定义

SMACSS全称 Scalable and Moduler Architecture for CSS,可扩展的模块化css结构

在oocss的基础上,对元素进行结构分类和和指定命名,达到扩展和模块化。

image.png

结构分类包括以下几种:

  • Base

设置初始化样式

规则
(1)不使用idclass!important
(2)使用标签选择器、后代选择器、子代选择器、伪类选择器进行初始化设置

  • Layout

设置布局样式,分为主要布局样式和次要布局样式。

规则
(1)主要布局使用id选择器,不可重用
(2)次要布局使用class选择器,可重用
(3)次要布局使用l-layout-前缀进行设置
(4)具有oocss的容器和内容分离原则

  • Module

设置可重用元素样式,以元素前缀进行命名。

规则
(1)使用class选择器设置
(2)具有oocss的结构与样式分离原则

  • State

LayoutMoudule上应用特效或动作

规则
(1)可以嵌套在LayoutMoudule
(2)可以使用js改变样式
(3)使用is-前缀
(4)可以使用!inportant覆盖样式

  • Theme

用于视觉的LayoutMoudule样式

规则
(1)直接使用LayoutMoudule的class覆盖样式
(2)通过引用class相同命名的样式文件,根据引用顺序,达到覆盖样式

4.ITCSS

定义
ITCSS全称 Inverted Triangle CSS,可扩展可管理的框架,通过分层组织css文件,实现自下而上的特异性。

image.png

上层影响下层,下层继承上层

通过三个指标对css项目进行排序:

  • 通用到显性

作用范围越来越小,权重越来越大

  • 低特异到高特异

随着层级的增加,特异性随之增大,避免在低特异性选择器前写高特异性选择器。

  • 深远化到本地化

随着层级的增加,影响范围逐渐减小

项目分成以下七层:

  1. Settings

包含全局设置,不会生成实际的css。例如:颜色、字体、大小

  1. Tools

预处理,可以定义function和mixins,不会生成实际的css

  1. Generic

初始化基本全局样式

  1. Elements

初始化标签样式

  1. Objects

定义全局的可重用页面结构类

  1. Components

定义页面组件样式

  1. Utilities

使用important的层,覆盖任何规则

项目结构:

两种结构方式

  • 以层级做子文件夹,存放相应文件
  • 以层级作为前缀,进行文件命名

使用时,需要按层级顺序引入

5.Atomic CSS

ACSS 全称Atomic css,原子化css

image.png

  • Atoms(原子):为网页构成的基本元素。
  • Molecules(分子):由原子构成的简单UI组件。
  • Organisms(组织):由原子及分子组成的相对复杂的UI构成物。
  • Templates(模板):将以上元素进行排版,显示设计的底层内容结构
  • Pages(页面):将实际内容(图片、文章等)套件在特定模板,页面是模板的具体实例。

GitHub上面有一款开源的ACSS工具,叫做 Atomizer