[사양] CSS BEM 작성 사양


BEM 명명 규칙을 사용하면 이론적으로 css 코드의 각 줄에는 선택기가 하나만 있습니다. css 代码都只有一个选择器。

BEM代表“块(block),元素(element),修饰符(modifier)”,我们常用这三个实体开发组件。

在选择器中,由以下三种符合来表示扩展的关系:

-   中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。
__  双下划线:双下划线用来连接块和块的子元素
_   单下划线:单下划线用来描述一个块或者块的子元素的一种状态

type-block__element_modifier

块(block)

一个块是设计或布局的一部分,它有具体且唯一地意义 ,要么是语义上的要么是视觉上的。

在大多数情况下,任何独立的页面元素(或复杂或简单)都可以被视作一个块。它的HTML容器会有一个唯一的CSS类名,也就是这个块的名字。

针对块的CSS类名会加一些前缀( ui-),这些前缀在CSS中有类似 命名空间 的作用。

一个块的正式(实际上是半正式的)定义有下面三个基本原则:

  1. CSS中只能使用类名(不能是ID)。
  2. 每一个块名应该有一个命名空间(前缀)
  3. 每一条CSS规则必须属于一个块。

例如:一个自定义列表 .list 是一个块,通常自定义列表是算在 mod 类别的,在这种情况下,一个 list 列表的block写法应该为:

.list

元素(element)

块中的子元素是块的子元素,并且子元素的子元素在 bem 里也被认为是块的直接子元素。一个块中元素的类名必须用父级块的名称作为前缀。

如上面的例子,li.item

BEM은 "블록, 요소, 수정자"를 의미합니다. 우리는 일반적으로 이 세 가지 엔터티를 사용하여 구성 요소를 개발합니다.

block

🎜블록은 의미상으로나 시각적으로나 구체적이고 고유한 의미를 갖는 디자인이나 레이아웃의 일부입니다. 🎜🎜대부분의 경우 독립적인 페이지 요소(복잡하거나 단순)는 블록으로 간주될 수 있습니다. 해당 HTML 컨테이너에는 블록의 이름인 고유한 CSS 클래스 이름이 있습니다. 🎜🎜일부 접두사(ui-)가 블록의 CSS 클래스 이름에 추가됩니다. CSS의 이러한 접두사는 네임스페이스의 역할 🎜. 🎜🎜블록의 형식적(실제로는 준형식적) 정의에는 다음 세 가지 기본 원칙이 있습니다. 🎜
  1. CSS에서는 클래스 이름(ID 아님)만 사용할 수 있습니다.
  2. 각 블록 이름에는 네임스페이스(접두사)가 있어야 합니다.
  3. 각 CSS 규칙은 블록에 속해야 합니다.
🎜예: 사용자 정의 목록 .list는 블록입니다. 일반적으로 사용자 정의 목록은 mod 범주에 포함됩니다. , list 목록의 블록 쓰기는 다음과 같아야 합니다: 🎜
.list{}.list.select{}.list .item{}.list .item.active{}.list{}.list_select{}.list__item{}.list__item_active{}
🎜

LESS 书写规范

使用 .less 后缀的文件来存储变量、混合代码以及最终合并压缩。

접미사가 .less인 파일 사용 변수를 저장하고, 코드를 혼합하고, 최종 병합 압축을 수행합니다.

子less注解
lib-base.less预定义的变量,例如颜色、字号、字体
lib-mixins.less用于混合的代码,例如渐变、半透明的混合
lib-reset.less初始化
lib-ui.less颗粒化ui功能
xxx.less위의 예와 같이 선택된 목록과 활성화된 목록 항목을 나타냅니다.

<ul class="xxx">
    <li class="xxx__item">第一项
        <div class="xxx__product-name">我是名称</div>
        <span class="xxx__ming-zi-ke-yi-hen-chang">看类名</span>
        <a href="#" class="xxx__link">我是link</a>
    <li>
    <li class="xxx__item xxx__item_current">第二项 且 当前选择项
        <div class="xxx__product-name">我是名称</div>
        <a href="#" class="xxx__item-link">我是link</a>
    <li>
    <li class="xxx__item xxx__item_hightlight">第三项 且 特殊高亮
         <div class="xxx__product-name">我是名称</div>
        <a href="#" class="xxx__item-link">我是link</a>
    <li>
</ul>

LESS 쓰기 사양

lib-base.less색상, 글꼴 크기, 글꼴과 같은 사전 정의된 변수
자식 없음주석
🎜🎜lib-mixins.less🎜🎜그라디언트와 같은 혼합용 코드, 반투명 블렌딩🎜🎜🎜lib-reset.less🎜🎜초기화🎜🎜🎜lib-ui.less🎜🎜세부적인 UI 기능 🎜🎜🎜xxx.less🎜🎜모듈 스타일🎜🎜🎜🎜

.less 파일의 참조 순서는 최종 컴파일된 스타일의 범위와 우선순위에 영향을 미치므로 아래부터 사용자 지정 순서대로 참조해 보세요. .less 文件的引用顺序会对最终编译的样式的作用域和优先级产生影响,请尽量按照由底层到自定义的顺序来引用。

关于风格

书写原则

1. 原则上不会出现2层以上选择器嵌套

使用BEM原则,用命名来解耦,所有类名都为一层,增加效率和复用性

2. 两层选择器嵌套出现在.mod-xxx__item_current子元素的情况,如下:

使用推荐的嵌套写法

常规写法:

rrreee

推荐:

rrreee

对应的HTML结构如下:

rrreee

BEM 解决问题

组件之间的完全解耦,不会造成命名空间的污染,如:.mod-xxx ul li