BEM-掘金功能模块

1,028 阅读3分钟

1. BEM简介

BEM是对css命名的一种规范,将页面模块化,隔离样式,提高代码的复用性,减少后期的维护成本。BEM的意思就是Block(块)、Element(元素)、Modifier(修饰符),通过双下划线__或者双中划线--连接。

2. 为什么需要BEM命名法

隔离样式,避免css污染

BEM通过特殊的命名方式,给css创造一个“作用域”,能够有效避免css样式全局污染。例如:

// 普通命名
.title {}

// BEM命名
.juejin-hd__title {}

普通的命名方法,会作用于所有的class="title"的后代元素,这样就会影响到你不想选择的元素,造成样式污染。

而BEM命名方法,只会作用于class="juejin-hd__title"这一元素,不会影响其他元素,从而达到样式隔离的目的。

代码更易覆盖

当我们在进行组件开发时,打包后的.juejin-hd后面的哈希值是动态的,方便修改。

代码可读性更好

用BEM命名法,让我们在写代码时能够快速地定位到样式位置,更重要的是在进行团队开发时,让同伴们更容易读懂自己的代码。

3. 如何使用BEM命名法

  • page-开头,表示这是一个页面,而不是组件。
  • base-开头, base表示公共组件
  • the-开头, the表示某一特定组件

命名语义化,可以根据模块的功能而命名,如页面头部header、导航栏nav、主体main、侧边栏sidebar、底部footer等,这样整个页面看起来就比较清晰了,维护起来也比较方便。

4. BEM案例-掘金功能模块

接下来让我们用BEM命名法来写一下移动端掘金功能模块的结构吧...

QQ图片20220410214416.jpg

首先我们来分析一下上图功能模块的结构:

整个功能模块我们可以命名为juejin-fm

功能模块主要由两部分组成:头部主体部分

头部可以命名为juejin-fm__hd,其中标题命名为juejin-fm__title

主体部分可以命名为juejin-fm__bd,其中的7个小模块命名为juejin-fm__item

html代码:

<div class="juejin-fm">
        <div class="juejin-fm__hd">
            <span class="juejin-fm__title">更多功能</span>
        </div>
        <div class="juejin-fm__bd">
            <a href="#" class="juejin-fm__item">
                <img src="./icon/wodekecheng-.png" alt="">
                <p class="desc">我的课程</p>
            </a>
            <a href="#" class="juejin-fm__item">
                <img src="./icon/chuangzuozhezhongxin.png" alt="">
                <p class="desc">创作者中心</p>
            </a>
            <a href="#" class="juejin-fm__item">
                <img src="./icon/wodequanzi.png" alt="">
                <p class="desc">我的圈子</p>
            </a>
            <a href="#" class="juejin-fm__item">
                <img src="./icon/yuedujilu.png" alt="">
                <p class="desc">阅读记录</p>
            </a>
            <a href="#" class="juejin-fm__item">
                <img src="./icon/biaoqian.png" alt="">
                <p class="desc">标签管理</p>
            </a>
            <a href="#" class="juejin-fm__item">
                <img src="./icon/jianliguanli.png" alt="">
                <p class="desc">简历管理</p>
            </a>
            <a href="#" class="juejin-fm__item">
                <img src="./icon/yijianfankui.png" alt="">
                <p class="desc">意见反馈</p>
            </a>
        </div>
    </div>

css样式:

* {
    margin: 0;
    padding: 0;
}
body {
    background-color: rgba(211, 209, 209, 0.25);
}
a{
    text-decoration: none;
}
.juejin-fm {
    width: 94%;
    margin: 10px auto;
    background-color: #fff;
    border-radius: 10px;
}
.juejin-fm__hd {
    padding: 10px;
}
.juejin-fm__title {
    font-size: 18px;
    font-weight: bold;
}
.juejin-fm__bd {
    padding: 10px;
    display: flex;
    flex-wrap: wrap;
}
.juejin-fm__item {
    width:25%;
    text-align: center;
    line-height: 2.1em;
    color: black;
    padding-bottom: 10px;
}
img {
    width: 30px;
    height: 30px;
}
.desc {
    font-size: 14px;
    font-weight: 500;
    font-family: sans-serif;
}

移动端页面结果如下:

Snipaste_2022-04-10_21-51-57.png

图标来自:iconfont-阿里巴巴矢量图标库

5. 总结

使用BEM命名方法能够减少样式污染,提高代码的复用性,能一定程度上提高团队的开发效率减少后期软件的维护成本

参考文档:

bem什么意思_BEM命名法