基于Vue组件的CSS命名规范

3,215 阅读4分钟
原文链接: github.com

CSS命名规范

每个 Vue 组件的最外层容器采用 组件名+root 的方式命名,如:

<template>
    <div class="paging-table-root">
        ...
    </div>
</template>

这样做是为了更快速定位一个组件,而不用先通过 vue-devtool 找到组件名,然后再去项目里找。

其余元素的命名按照下面的规则:

1、命名规则

按照 B--E-M 的书写格式,详情可见BEM介绍

B: 代表 Block

每个 Block 都由多个 Element 组成,应尽量保证每个组件只有一个 Block:

<template>
    <div class="paging-root">
        <ul class="paging-list">
            <li class="paging-item">
                <a class="paging-btn">上一页</a>
            </li>
            ...
            <li class="paging-item">
                <a class="paging-link">5</a>
            </li>
            ...
            <li class="paging-item">
                <a class="paging-btn">下一页</a>
            </li>
        </ul>
    </div>
</template>

当一个 Block 实在无法满足使用的时候,再将该 Block 按结构划分为多个部分,这几个部分作为其它具体元素的 Block。

<template>
    <div class="article-root">
        <div class="article-header">
            <ul class="header-list">
                <li class="header-item"></li>
            </ul>
        </div>
        ...
        <div class="article-main">
            <ul class="main-list">
                <li class="main-item"></li>
            </ul>
        </div>
    </div>
</template>

E: 代表 Element

每一个 Element 都应该具有独立性,可以用在 Block 的任何地方,而不需要做额外处理。

<template>
    <div class="comment-root">
        ...
        <div class="comment-header">
            <p class="comment-txt">重要的是命名的思想,而不是完全照搬。</p>
        </div>
        ...
        <div class="comment-main">
            <p class="comment-txt">赞同!</p>
        </div>
    </div>
</template>

另外每一个 Element 都可能存在不同的状态,比如选中状态,激活状态,以及大小颜色等。

<template>
    <div class="login-root">
        ...
        <input class="login-input" type="text">
        <input class="login-input login-input-error" type="text">
        ...
    </div>
</template>

M: 代表 Modifier

Modifier 是 Element 的修饰符,用来区分 Element 可能存在不同的状态。

在一些特殊情况下,通常是 UI 做的不够标准统一时候,单一的 Element 内外边距不能即满足独立可复用性,又满足 UI 样式。这时 Modifier 也可以用来表示元素的容器,比如:

<template>
    <div class="login-root">
        ...
        <div class="login-form-wrap">
            <form class="login-form">
                ...
            </form>
        </div>
    </div>
</template>

2、书写规则

每个组件的 <style> 标签都需要添加 scoped 属性:

<style scoped>
    ...
</style>

选择器之间禁止嵌套,便于代码阅读和后期维护,以及避免权重所带来的影响:

<!-- 好的写法 -->
<style scoped>
    .news-list {}
    .news-item {}
    .news-txt {}
</style>
<!-- 不允许的写法 -->
<style scoped>
    .news-list {}
    .news-list .news-item {}
    .news-item .news-txt {}
</style>

css样式书写时按照定位、盒模型、样式、功能的顺序,比如:

<style scoped>
    .news-list {
        /* 定位 */
        position: absolute;
        left: 0;
        z-index: 10;

        /* 盒模型 */
        float: left;
        display: block;
        flex: 1;
        align-items: center;
        width: 0;
        height: 0;
        padding: 0;
        margin: 0;
        border: 0;
        outline: 0;

        /* 样式 */
        background: #fff;
        color: #fff;
        font: italic bold 12px/20px arial,sans-serif;

        /* 功能 */
        transition: all 1s;
        transform: translate(10px, 10px);
        cursor: pointer;
    }
</style>

3、命名常用词汇

Block 与 Element 之间不需要进行层层嵌套,父级的 Element 也可以作为子级的 Block,这样能避免当元素嵌套较深时,class 需要写很长一串的问题。

常用块(Block)

结构类:header, nav, subnav, menu, submenu, main, aside, footer

内容类:summary, banner, article, login, register, form, news

对于一个简单的组件,优先使用组件名作为 Block,不用把组件名全写出来,选其中一个典型单词就可以,比如:

<div class="morning-news-root">
    <div class=news-header>
        <p class="news-title">早间新闻</p>
        <a class="news-btn" href="#">更多</a>
    </div>
    <ul class="news-list">
        <li class="news-item">特普朗退出TTP</li>
    </ul>
</div>

常用元素(Element)

结构类:header, main, content, footer

文本类:txt, link,

表单类:form, input, label

表格类:table, cloumn, row, cell

列表类:list, item, filed

按钮:button

常用修饰符(Modifier)

状态类:primary, success, warning, error, active

形状类:large, big, small

样式类:fl, center, middle, fr

容器类:box, wrap