前端CSS命名规范-BEM的学习

此篇文章是在这篇文章的基础上的一个学习~https://www.w3cplus.com/css/bem-definitions.html

BEM的学习

1.基础概念

BEM - Block Element Modfier(块元素编辑器)是一个很有用的方法,它可以帮助你创建出可以复用的前端组件和前端代码。
其中,B代表block(块),E代表element(元素),M代表modifier(修饰符)
在这里插入图片描述
命名规则为
在这里插入图片描述
例:human__hair–red

2.块(Block)

那我们应该如何去划分一个块呢?
在这里插入图片描述
以上图为例子,我们来思考一下如何划分块?
块是一个独立的组件,像应用的一块积木。块可以是简单的,也可以是复合的(块可以包含块)。
我们将上图划分成以下模块:
在这里插入图片描述
即Head块(其中包含Menu块 Logo块 Search块 Auth块)、MainLayout块、Foot块。
在这里插入图片描述

3.元素(Element)

那我们再来试一试划分元素
在这里插入图片描述
一个元素是块的一部分,具有某种功能。元素只有处于他们应该属于的块的上下文中时才是有意义的。
在这里插入图片描述
我们来尝试着写一下他的html结构,并且使用BEM为其命名:

<form class="search">
    <input type="text" class="search__input">
    <button class="search__button"></button>
 </form>

其对应的CSS样式可以表示如下

.search__input
{
	some style
}

而我们平时用的命名可能是这样的

<form class="search">
    <input type="text" class="input">
    <button class="button"></button>
 </form>

其对应的CSS样式为

.input
{
	some style
}

我们仔细对比一下两种命名方式就会发现,使用BEM命名的有如下的优点
1.层级关系明显,可以立即知道这个样式在哪一块,会和哪些样式冲突。
2.独一无二的命名方式,可以比较有效的防止CSS的优先级竞争。

4.修饰符(Modifier)

我们经常需要创建一个和已存在的块/元素非常相似的块/元素,只是外观或行为有些许改变。这时候需要使用修饰符来表示。
比如下面的两个按钮,他们的宽度,大小字体颜色等都是一样的。我们可以只多添加一个修饰符来写不同的样式。
在这里插入图片描述
代码如下所示。

<form class="search">
    <button class = "search__button search__button--confirm">确定</button>
    <button class = "search__button search__button--cancel">取消</button>
</form>
/*为button设置统一的样式*/
        .search__button{
            width:60px;
            cursor: pointer;
            border-radius: 5px;
            color:white;
        }
        /*设置不同状态的样式-确定按钮*/
        .search__button--confirm{
            background-color: red
        }
        /*设置不同状态的样式-取消按钮*/
        .search__button--cancel{
            background-color: blue
        }

这样的优点也很显而易见:
相似的块/元素的样式可以复用,仅在修饰符的类中做修改即可。

5.淘票票页面导航栏BEM重命名

这一段是参考了[link]http://mp.weixin.qq.com/s?__biz=MzU4MzIzMjg1MA==&mid=2247484201&idx=1&sn=bb936a242f703d351df9674e4de0ebf4&chksm=fdad7f14cadaf602121bbd414891dcc19154e1ad9c8970b3d64f6173ea9d4e52113ca2e2daa9&mpshare=1&scene=24&srcid=0527b7DVjDsAhP8LeCdJ31RQ#rd
淘票票的导航栏如下所示
在这里插入图片描述
我们来看一下它的html结构

<!-- 原淘票票的导航栏 -->
    <div class="head-wrap" data-spm="header">
        <div class="head-content center-weap">
            <h1 class="logo"> <a target="_top" href=""></a> </h1>
        </div>
        <div class="cityWrap M-cityWrap">……</div>
        <div class="nav-warp">
            <ul class="nav">
                <li class="J_NavItem current">……</li>
                <li class="J_NavItem">……</li>
                <li class="J_NavItem">……</li>
            </ul>
        </div>
    </div>
    <!--原淘票票导航栏-->

我们可以看到 结构层次不够明显 很难去一眼看出每个元素之间的先后关系 比如J_NavItem与head-wrap的关系
我使用BEM命名方法为其重新命名了一下~是下面这样的 对应的 我们能很清楚的看出tppNav_navLi是tppNav的子元素。

 <!-- BEM 淘票票导航栏 -->
    <div class="tppNav">
        <!--logo-->
        <div class="tppNav__logoDiv">
            <h1 class="tppNav__logoH1">
                <a target="_top" href=""></a>
            </h1>
        </div>
        <!--选择城市-->
        <div class="tppNav__cityDiv">……</div>
        <!--首页/影片/影院-->
        <div class="tppNav_navDiv">
            <ul class=tppNav_navUl">
                <li class="tppNav_navLi tppNav_navLi--selected">……</li>
                <li class="tppNav_navLi">……</li>
                <li class="tppNav_navLi">……</li>
            </ul>
        </div>
    </div>
    <!-- BEM 淘票票导航栏 -->

也可以看一下我引入的那个链接的BEM将其命名成什么了~

6.优点总结

我个人认为,使用BEM命名法是很好的。有以下的优点:

1.将页面分成不同的独立的块,块与块之间的耦合度较低。可以轻松的应付页面中的块位置调整问题。
2.命名规则具有层次,无论是写代码的人还是改代码的人都能清楚了解块内的层次关系。修改删除添加样式
都简洁得多。
3.独特的命名规则使得命名冲突的可能性大大降低,并且能有效避免CSS优先级的竞争问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值