样式命名有多难?浅谈BEM命名规范⚡

简介: 样式命名有多难?浅谈BEM命名规范⚡

前言✍️


  • 最近在搭自己的组件库,关于CSS预处理器用的是SCSS
  • 对于样式的命名使用了BEM,借此机会分享一下。


怎么命名🔥


样式命名有多难

  • 我以前觉得这是一个特别特别难的问题,这难的有恐怖呢,这就像产品让我做一个页面但没有设计图甚至原型图只是几个框框的情况下让我做的特别好看,色彩特别鲜艳一样,真是有(tian)点(da)困(lei)难(pi)🤏。
  • 大家有没有遇到一种情况就是再写一个模块的时候它的内容给他样式命名container,那他的左边内容呢?右边内容呢?left-container?right-container?如果内容里面还有内容呢,原谅我英语不好,我还是会想用container,要疯🤷‍♂️。
  • class既要表达清楚这个样式代表什么又要不能有重复,样式重复的后果大家懂的都懂,所以我才说这对大部分前端来说是挺难的一个问题,但对一小部分前端程序员来说根本不值一提,为什么这么说呢?因为我遇见过名字按顺序onetwothree来排列的class名,我想这可能对他们来说不算什么事吧🤦‍♂️。
  • 开个玩笑,在正常情况下,我们对样式进行命名的时候都会去查对应模块的英文来进行命名(英文好的当我没说),起一个独一无二的名字。
  • 但事实上我们不能保证我们"当时认为独一无二的名字"就是"独一无二的",当我们给一个tab加动态时可能会用到actived来代表被激活被选中,用了这个之后本能的其他的模块动态还是会想用这个名字actived,如果有同感的可以留个赞了,说明我们是一类人哈哈哈😵。
  • 有的同学可能会说,哎呀能跑就行不冲突就行反正客户又不会看你源码管你写的好不好看,但试想一下如果这个项目不是你一个人开发呢,当涉及到更大、更复杂的项目时,你如何组织代码是提高效率的关键!如果你提桶了之后轮到别人接手呢?别人看着你的代码就会跟别人抱怨:"看!这人写的什么屎山!" 是不是你曾经也这样吐槽过别人呢🙇。


关于BEM🌊


BEM是什么

  • BEMBlock Element Modifier 是一种帮助您在前端开发中创建可重用组件和代码共享的方法,由 Yandex 团队提出的一种前端 CSS 命名方法论。
  • 所谓BEM说白了就是把样式按照BEM三种来进行命名。
  • BEM:
  • B - Block 一个独立的模块,一个本身就有意义的独立实体 比如:headermenucontainer
  • E - Element 元素,块的一部分但是自身没有独立的含义 比如:header titlecontainer input
  • M - Modifier 修饰符,块或者元素的一些状态或者属性标志 比如:smallchecked


BEM使用

  • 知道了BEM的基本概念后接下来就是使用了,上面我也说了,说白了BEM也就是把三个连接在一起组成一个class名,那怎么连接他们三呢?
  • BEM提出的一个概念是用连接符号来表达,它并不规定必须用什么连接符,但规定用不同连接符做团队内约定区分BEM 3类元素。
  • B其实可以理解成一个模块,就比如Elementel-buttonAnt Designant-btn
  • E的连接用官方的方式就是块名称加两个下划线加元素名称构成( __ )就比如Elementel-radio__input
  • M的连接用官方的方式就是.block__elem--mod,就比如Elementel-button--smallvantvan-button--danger


BEM的好处

  • 可以发现很多开源优秀的组件库都是用的BEM规范来命名,那为什么会这么受欢迎呢?
  • 要知道我们用一个技术或者框架或者规范目的都是只有一个,让自己更舒服,就好像编辑器装插件,不用原生js开发而用框架开发一个道理。
  • 方便查看BEM可以让开发人员在样式命名上就知道这个样式属于哪里,从名字就可以知道某个标记的含义,假设一个样式命名left-content,光是找这个样式在哪里就已经很麻烦了。
  • 结构明了在我们用scssless预处理器的时候都习惯嵌套很多层,但有了BEM命名后模块层级关系简单清晰,而且css书写上也不必作过多的层级选择。
  • 可复用性 在写了一个元素的样式后需要对他的修饰符进行拼接样式修改,我们在scss中可以使用@mixin做些处理拼接EM放到公共的scss中别的地方再进行复用,就比如elementmixins配置


示例

说了这么多光看文字也烦了吧,还是放个简单的代码示例出来大家品吧,下面是一个按钮的组件封装。

<template>
  <button
    class="zl-button"
    :class="[
      type ? 'zl-button--' + type : '',
      size ? 'zl-button--' + size : ''
    ]"
    type="button"
  >
    <slot />
  </button>
</template>
<script>
export default {
  name: 'ZlButton',
  props: {
    type: {
      validator (value) {
          return oneOf(value, ['default', 'primary', 'info', 'success', 'warning', 'danger']);
      },
      type: String,
      default: 'default'
    },
    size:{
      validator (value) {
          return oneOf(value, ['','medium', 'small', 'mini']);
      },
      type: String,
      default: ''
    }
  }
};
</script>
复制代码
  • zl-button可以看到这里用了B的连接。
  • zl-button--small可以看到这里用了B+M中间用--连接起来来代表块和修饰符连接。


写在最后👋


  • 对于样式的规范其实也没有那么难,只是平时为了追求速度而放弃了规范,实际上如果时间允许的话还是用主流的规范来约束自己不让自己的代码变成别人口中的屎山
  • 如果您觉得这篇文章有帮助到您的的话不妨🍉关注+点赞+收藏+评论+转发🍉支持一下哟~~😛


参考👈


如何看待 CSS 中 BEM 的命名方式?

GET BEM


往期精彩🌅


如何优雅的使用Vuepress编写组件示例(上)👈

如何优雅的使用Vuepress编写组件示例(下)👈

手牵手🧑‍🤝‍🧑学习Gulp不用愁

为了方便,我改了别人的轮子😅

相关文章
|
前端开发 Go C++
CSS命名规则规范整理
大家在写css的时候,经常会遇到关于命名的问题。页面上成百甚至上千的class或者id,我们就会越来越感到困扰。 所以,这样我们就很有必要整理自己的一套命名规范。
8569 0
CSS命名规则规范整理
|
5月前
|
前端开发
BEM命名规范——weui实战
BEM命名规范——weui实战
|
8月前
|
存储 缓存 算法
代码简洁之道:我们该如何规范代码的命名?
代码简洁之道:我们该如何规范代码的命名?
135 1
|
8月前
|
前端开发 开发者
【专栏】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。
【4月更文挑战第29天】BEM(Block-Element-Modifier)是一种前端命名规范和架构方法,旨在创建清晰、可维护的代码结构。它包括Block(独立功能单元)、Element(Block的子元素)和Modifier(表示状态或变体)。BEM的特点包括命名一致性、模块化设计、清晰结构和可复用性,适用于代码组织、样式管理、组件化开发和团队协作。虽然命名较长和学习成本是其局限性,但BEM在提升代码质量和效率方面具有显著优势,是前端开发的重要工具。
151 0
|
8月前
|
算法 开发者
【CMake 设计命名思路】自定义命令命名规范与风格指南
【CMake 设计命名思路】自定义命令命名规范与风格指南
110 0
|
8月前
|
前端开发
深入理解 BEM:前端开发中的命名约定革命
深入理解 BEM:前端开发中的命名约定革命
深入理解 BEM:前端开发中的命名约定革命
|
前端开发 开发者
前端祖传三件套CSS的各种选择器之组合/复合选择器
前端开发者经常使用CSS来定义网页样式,包括颜色、布局和字体等。在CSS中,选择器是指用于选择HTML元素并应用样式的模式。有许多不同类型的CSS选择器可供使用,但本文将着重介绍组合/复合选择器。
5338 0
前端祖传三件套CSS的各种选择器之组合/复合选择器
|
前端开发
前端祖传三件套CSS的语法规则/引入规则
当今,在开发网站或应用时,前端工程师使用的技术和工具越来越多。不过,最基础和重要的三项技能中的一项是CSS(层叠样式表)。CSS是在HTML文档中定义了元素的外观和样式的语言,如字体、背景颜色和边距等。在这篇文章中,我们将会重点关注于CSS的语法规则和引入规则。
100 0
编程基本功:典型的柳氏风格命名一例
编程基本功:典型的柳氏风格命名一例
85 0
编程基本功:典型的柳氏风格命名一例
|
前端开发 JavaScript
CSS的命名是规范的吗?应该如何优化?底层原理是什么?
CSS的命名是规范的吗?应该如何优化?底层原理是什么?
134 0