css的组织方式:BEM规则

css命名规范——BEM css命名规范-BEM 阅读详情

why?

无论选择了什么样的css组织方法,你都会从更加结构化的css 和 Ui 结构中获益。有些方式不那么严格,更加灵活。而另一些方法则更加易于理解,适用于团队协作。

为什么要选择bem呢?它不像其他语法(smacss)那么复杂,但是仍然可以提供给我们优良的代码结构和易于识别的术语。

模块化

block永远不依赖于页面上的其他元素,因此不会遇到级联问题。而且易于从旧项目中迁移。只要从某一个块级元素开始即可。

可复用

以不同的方式组合独立的块级元素,重用它们,减少可维护的代码量。甚至可以构造一个基于block的库。

结构

bem法让css代码有良好的组织结构,既简单,又易于理解。

what?

概念

  • b – block
    一个本身就是有意义的独立实体。尽管一个block可以和其他block嵌套和共同发挥作用,但语义上所有blocks是平等的,并没有等级或者优先级之分。没有表现为DOM的整体实体(例如控制器或模型)也可以是块。

    块名称可以包含拉丁字母,数字和短划线。

    任何有class name的dom节点都可以成为block。

    在一页中,没有对其他Blocks、elements的依赖。

    e.g: header, container, menu, checkbox, input

  • e – element
    Block的一部分,没有独立的意义,而且在语义上依附于Block存在。
    e.g: menu item, list item, checkbox caption, header title

    元素名称可以包含拉丁字母,数字,短划线和下划线。主要是以两个下划线接在block之后,来表示从属关系。

    在一个block下的任何dom节点都可以是element。

    没有对同一页上其他blocks/elements的依赖。

    // 好例子
    .block__elem {
      color: #fff;
    }
    
    //坏例子
    .block .block__elem {
      color: #042;
    }
    div.block__elem {
      color: #042;
    }
    
  • m – modifier
    修饰符,一个block或者element上的flag,体现了外观或者行为的变化。

    修饰符名称可能包含拉丁字母,数字,短划线和下划线。以两个短划线接在element/block的类名之后,诸如.block--mod, .block__elem--mod,.block--color-black, block--color-red。在复杂修饰符中的空格用短划线来代替。

    e.g: disabled, highlighted, checked, fixed, size big, bg yellow

    修饰符是您添加到块/元素DOM节点的额外类名。仅将修饰符类添加到它们修改的块/元素,并保留原始类名。是添加不是替换。

     <!-- 好例子 -->
    <div class="block block--mod">...</div>
      <div class="block block--size-big
      	block--shadow-yes">...</div>
    
    <!-- 坏例子 -->
    <div class="block--mod">...</div>
    

    在block层级的修饰符下的元素,可以这么写

    
    .block--mod .block__elem {}
    
    

    例子:

    <form class="form form--theme-xmas form--simple">
      <input class="form__input" type="text" />
      <input
        class="form__submit form__submit--disabled"
        type="submit" />
    </form>
    
    .form { }
    .form--theme-xmas { }
    .form--simple { }
    .form__input { }
    .form__submit { }
    .form__submit--disabled { }
    

例子

http://getbem.com/assets/github_buttons.jpg

如上图,可以在按钮上应用任何想要的标签,如Button,a, div 等,可使用block--modifier-value语法。

.button {
	display: inline-block;
	border-radius: 3px;
	padding: 7px 12px;
	border: 1px solid #D5D5D5;
	background-image: linear-gradient(#EEE, #DDD);
	font: 700 13px/18px Helvetica, arial;
}
.button--state-success {
	color: #FFF;
	background: #569E3D linear-gradient(#79D858, #569E3D) repeat-x;
	border-color: #4A993E;
}
.button--state-danger {
	color: #900;
}

faq:

  1. 为什么要选择bem作为css模块化的解决方案?

精髓在于 块的独立性。

如果仅谈论CSS模块化解决方案,BEM的关键特性是块的独立性。 遵循CSS建议可以将块放入页面上的任何位置,并确保它不会受到周围环境的影响。 此外,如果您最近需要将另一个块嵌套到当前块中,则可以保证它们完全兼容。 换句话说,在维护Web应用程序时,您可以在页面中移动块,添加其他块并组合它们。

BEM CSS明确地定义了哪个CSS属于一个界面,因此使用它可以回答诸如“我可以删除这段代码吗?” 和“如果我改变这段代码,会发生什么以及哪些接口部分会受到影响?”的问题。

  1. 为什么要使用block–modifier,而不是将modifier直接和Block同时作用于一个元素上?

也就是说,为什么要避免使用menu__item button active?

    1. 因为同一个dom节点可以既是Block,又是element,所以需要确认一个修饰符是基于block的还是基于element的。如果写成<div class="menu__item button active"></div>,就无法区分menu__itme.active还是button.active了。而加上前缀后,button--active则明确地指出了active仅仅影响的是按钮。
    1. 另一点是CSS的优先级。组合的选择器比单一的类选择器优先级更高。写的时候还要注意计算优先级的问题。但如果使用了前缀式的修饰符,就可以肯定层叠的选择器会Overwrite 修饰符。(这一点在应用了scoped后不用考虑)。
    1. 结构更加分明。比如<div class="block block--mod">,可以清晰地看到Block的结构。但<div class="block mod">却不能起到同样的效果。当全局搜索block--mod时,尤其会感谢这种实践方式。
  1. 如何命名修饰符?能否直接把它的css作为依据命名修饰符?

不能。首先,.block__element--border-bottom-5px看上去奇丑无比,其次,在实践中,如果把5px改成了6px,那么还要连带选择器的名一起改,麻烦。而且,不能保证修饰符会永远只拥有某一个CSS属性,而且永远拥有它。所以,尽量还是选择语义上有意义的名字来命名修饰符。

  1. 类似block__elem1__elem2__elem3的元素嵌套元素怎么命名选择器?

根据BEM方法,块结构应尽量平整,您需要反映块的嵌套DOM结构。所以,对元素嵌套元素,可以都摊平到块级之下的子元素。如:

<div class='block'>
    <div class='block__elem1'>
        <div class='block__elem2'>
            <div class='block__elem3'></div>
            <div class='block__elem4'></div>
        </div>
    </div>
</div>

css结构应该为:

.block {}
.block__elem1 {}
.block__elem2 {}
.block__elem3 {}

这样,每一个element都只依赖于外层的block,可以很轻松地在block内部迁移代码,如下所示。

<div class='block'>
    <div class='block__elem1'>
        <div class='block__elem2'></div>
    </div>
    <div class='block__elem3'></div>
    <div class='block__elem4'></div>
</div>

【笔者言:】我对这一点有异议。假如block__elem2中是flex布局子元素elem3, elem4,那么在迁移在后者时,仍然需要改动其父级元素。建议根据具体情况灵活采用,必要时,可以把内部的element作为一个block,再进行新的嵌套。

  1. bem不支持全局的css重置吗?

BEM不会禁止使用css全局reset,但用BEM的方式重置会更有效。

BEM认为每一个块都是独立的,不依赖于global reset css存在,而且global reset通常是以tag作为选择器,这也违反了规则。相反,bem建议在每个块上进行重置。利用Mixin的方式,假设Menu__item 和 list__item都是li元素,则二者都需要引入li的重置代码。 您可能会担心具有相同重置规则的多个块将在结果代码中重复出现。 但这就是CSS优化器应该为您做的事情。 作为开发人员,您可以独立开发每个块,就好像同一页面上没有其他块一样。

.menu {
    @include reset-list;
}
.menu__item {
    @include reset-list-item;
}

/* ... */

.list {
    @include reset-list;
}
.list__item {
    @include reset-list-item;
}

另外,以这样的方式去reset 全局,还可以避免在引入第三方库的时候,reset代码和第三方库的代码起了冲突。

【笔者言:】这样做的坏处是增加了代码量,需要开发者控制每一个Block的样式,给每一个都加上mixin。从实践上来讲,我不反对全局加入css reset。

Css设计模式-理论篇之OOCSS、SMACSS与BEM CSS(Cascading Style Sheet,可译为“层叠样式表”或“级联样式表”)是一组格式设置规则,用于控制Web页面的外观。作为每个前端工程师入门第一门学习的语言来说,它简单易学的特点让许多初学者能够很快通过它来构建出一套富含色彩的网页,并且随着Css3的普遍流行与支持,新的特性无疑让这门简单的样式语言变得越来越强大,简单的写Css并不是一件多难的事情,而要写出一套可维护的Css却是一件 阅读详情

相关推荐

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 392

CSS的BEM规范

BEM规范学习 在实际项目中,经常可以看到以下类似这样的css样式,这种就是CSS命名规范——BEM思想 BEM 是块(block)、元素(element)、修饰符(modifier)的简写 主要缺点就是命名很长 __和--的区别 __表示的就是下级元素 --表示的是不同的形态 就是另一个类名,另一种样式,就像overview__row中有公共的样式,而overview__row--right中具有非公共的样式,是特有的样式 &符号表示嵌套的上一级 之所以是两个连接符和

Kylin的博客 3379

ARM的CI-700和Arteris的NoC对比

设计理念:CI-700注重于为移动和客户端SoC提供定制化的互连解决方案,而Arteris的NoC更侧重于提供灵活、可配置的网络互连技术,适用于多种应用场景。性能与功耗:CI-700通过系统级缓存和网状拓扑结构优化性能和功耗,而Arteris的NoC通过物理感知和多协议支持来提升性能和降低功耗。功能安全:Arteris的NoC提供了功能安全支持,这对于汽车和工业应用尤为重要,而CI-700虽然也关注安全性,但未明确提及功能安全支持。互操作性。

ygyglg的专栏 2619

『精』CSS 小技巧之BEM规范

BEM风格规范指的是 Block、Element、Modifier 这三者的简称,这个规范将 CSS 拆分成块、元素、修饰符,根本作用是帮助开发者快速理解HTML与 CSS 之间的关系。那么通过使用 BEM 能获得到什么好处呢?如果我们想制作一个组件的新样式,比如改个字体/背景色,可以很容易地看到有哪些样式项已经存在,只需要新增一个修饰符即可,甚至可能意识到一开始就不需要编写任何样式,有一个预先存在的修饰符可以满足我们的需求。

贤哲XianZhe的博客 2751

power bi 演唱会-佐罗

我是业务分析人员,注重使用性,因此,课程不到 30% 的内容就可以解决目前为止我碰到的所有业务问题,剩下的 70% 内容是帮助我提升,优化,升华,精益求精用的,比如第三方工具,比如代码运行速度优化,比如查询逻辑优化等等。系统性上来说,结构明晰,安排上非常有条理,层层递进;《BI 真经》,中有真经二字,略显夸大,而当我第一次证明了这点的时候,我也非常惊讶,这就是我做以下所有事情的一切动力。《BI 真经》综合考量思想性,系统性,本质性,创新性,通用性,技巧性,启发性,对比其他课程有压倒性的显著优势。

v_1090213742的博客 911

西门子1200,与V90和步科MD60第三方伺服PN通讯

需要注意的是回零方式的选择,因为V90是绝对值编码器,这里回零模式选择模式7,系统自动根据编码器反馈以及组态的机械参数,计算出轴的位置,并且掉电保持。在线访问中,找到对应的网卡,以及下面扫描到的设备,可以在线修改ip地址和profinet名称,注意一定要和组态中的完全一致。以上硬件组态上完成,主要是gsd文件导入后,添加硬件,建立连接,修改ip和profinet名称,添加报文。1- 博图V18内,设备组态,网络视图中,拖入V90以及MD60伺服,并与PLC创建连接。向厂家索要GSD文件,PN的描述文件。

weixin_37596954的博客 2461

【CSS】BEM 命名规范

最近团队要考虑代码风格统一Bem 是块(block)、元素(element)、修饰符(modifier)的简写,由 Yandex 团队提出的一种前端 CSS 命名方法论。- 中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。__ 双下划线:双下划线用来连接块和块的子元素_ 单下划线:单下划线用来描述一个块或者块的子元素的一种状态BEM 是一个简单又非常有用的命名约定。让你的前端代码更容易阅读和理解,更容易协作,更容易控制,更加健壮和明确,而且更加严密。

STATICHIT静砸的博客 4207

Python多版本共存指南:用CMD命令一键切换3.6和3.8解释器(含pip使用技巧)

本文详细介绍了在Windows CMD环境下实现Python多版本(如3.6和3.8)共存与一键切换的完整方案。通过文件重命名策略、环境变量优化和自定义脚本,开发者可快速切换Python解释器版本,并管理各版本独立的pip依赖库,确保项目环境隔离与兼容性。

weixin_29035405的博客 423

CSS架构之BEM设计模式

B代表:Black(块),独立实体,独立的意义,每个页面都可以看做是多个Block组成,见下图1-1;E代表:Element(元素),block 的一部分,没有独立意义,是组件下的一个元素,多个元素形成一个组件,见下图1-2;M代表: Modifier (修饰符),block 或 element 上的标记,是描述Block或Element的属性或状态,同一Block或Element可以有多个Modifier。

肥晨开发的学习之路 9633

BLDC方波控制 vs. FOC:技术选型指南与未来演进

本文深入对比BLDC电机方波控制与FOC技术的核心差异,分析两者在成本、性能和应用场景上的权衡。方波控制凭借低成本和易实现性,在电动工具和家电领域优势明显;而FOC则以平滑高效控制见长,适用于高端精密应用。文章为工程师提供了实用的技术选型指南,并展望了未来技术融合的发展趋势。

yhn4567890的博客 1170

SAP后台JOB保姆级教程:从SM36创建到SM37监控,手把手教你搞定ABAP程序定时任务

本文详细解析SAP后台JOB从创建到监控的全流程,重点介绍SM36创建和SM37监控的操作步骤与最佳实践。通过真实案例演示如何配置定时任务、处理常见故障及实施企业级管理策略,帮助ABAP开发者高效管理后台程序执行。

weixin_30838873的博客 430

CSS 代码组织和管理规范BEM,OOCSS,SMACSS,ACSS

本文主要讨论的是大型项目中 CSS 代码的组织方式。首先介绍的是前端项目开发方法学 BEM。BEMBEM 是一种前端项目开发的方法学,由 Yandex 公司提出。BEM 的名称来源于该方法学的三个组成部分的英文首字母,分别是块(Block)、元素(Element)和修饰符(Modifier)。这三个不同的组成部分称为 BEM 实体。块块即是通常所说的 Web 应用开发中的组件或模块。每个块在逻辑上和

lwf的博客 3301

[Unity3D]水族馆游戏教程四

文章目录0.接上篇1.速度控制器2.修改FishAI3.修改后的效果4.总结 0.接上篇 上一篇,实现了鱼AI的随机游动、自动转向,并且学习了如何分析调试过程中遇到的报错。 本篇将继续优化鱼AI。 1.速度控制器 上一篇虽然实现了鱼的随机游动,但是可以看到,鱼在转向的时候,会显得很突然。因此先要解决这个问题。 我们的思路是,让鱼在刚转向的时候,速度由慢到快,等到游动到快要到达目标点的时候,速度减慢...

延澈左的专栏 1035

Atitit.css 规范 bem 项目中 CSS 的组织和管理

Atitit.css 规范 bem  项目中 CSS 的组织和管理     1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似)。3 1.4. 修饰符(modifier)的3 2. 块的独立性4 3. 独立的CSS4 3.1. 为独立的CSS类命名5 4. BEM争议最大的就是它

attilax的专栏 2433

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

问答:如何规划CSS 中 的命名方式 如何看待 CSS 中 BEM 的命名方式?

好多盆友 很纠结 css命名规则 怎么弄,还没起步就被绊住了,那么今天蝈蝈就针对这个问题来讨论一下 没什么技术 含量,但却对效率开发至关重要的 “问题”。 下文是一些知乎大神的个人经验总结,如果觉得有用请点赞 留言!    JS前端实用开发QQ群 :147250970  欢迎加入~! 如何看待 CSS 中 BEM 的命名方式? BEM的意思就是块(block)、元素(elemen

小北哥哥和北妈 6164

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

CSS-BEM命名规范

CSS-BEM命名规范,让维护css不在头疼 相信大部分前端工作人员都不太喜欢写CSS,更不要说修改别人的CSS的样式了。 本文将简单介绍CSS-BEM使用规范,让自己/他人维护起CSS不在头疼。 前言 BEM(块、元素、修饰符)是一种基于组件的 Web 开发方法。其背后的想法是将用户界面划分为独立的块。这使得即使使用复杂的 UI 也能轻松快速地进行界面开发,并且允许重用现有代码而无需复制和粘贴。该笔记将围绕BEM核心模块,块(block)、元素(element)、修饰符(modifier)进行简述。 贴

qq_35469342的博客 1896

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

BEM命名规则

BEM的意思就是块(block)、元素(element)、修饰符(modifier),是由Yandex团队提出的一种前端命名方法论。这种巧妙的命名方法让你的CSS类对其他开发者来说更加透明而且更有意义。BEM命名约定更加严格,而且包含更多的信息,它们用于一个团队开发一个耗时的大项目。 重要的是要注意,我使用的基于BEM的命名方式是经过Nicolas Gallagher修改过的。这篇文章中介绍的这...

温小卜 2068

css之bem命名

是三层嵌套,不符合 BEM 的扁平化命名原则。

ypgf的博客 1067

BEM前端命名规则

1、block不影响自身布局,也就是说不能设置margin和position属性。 2、不能在BEM中使用元素选择器和ID选择器。 3、elementy只能作为block的一部分使用,不能独立使用。 附上官网介绍http://getbem.com/introduction/ 介绍 在较小的宣传册网站上,您如何组织自己的风格通常不是一个大问题。你进去,写一些CSS,甚至可能是一些SA...

小菜鸡程序媛的挣扎史 667

BEM规范:构建可维护的CSS

BEM是一种命名约定,旨在使CSS代码具有更好的可读性和可维护性。块(Block):块是页面上具有独立功能的可重用组件。可以将块视为页面上的一个模块,它可以包含其他块或元素。块的类名以一个描述性词汇作为前缀,使用连字符进行连接,例如:.block。元素(Element):元素是块的组成部分,它们不能独立存在,并且具有与块相关的语义。元素的类名由块的类名作为前缀,使用双下划线连接,例如:.block__element。修饰符(Modifier):修饰符用于改变块或元素的外观、状态或行为。

wxid_mtnujb6ipc0322的博客 1007

CSS命名规范之BEM

What is BEM? BEM:Block(块) Element(元素) Modfier(修饰符),是由Yandex团队提出的一种前端命名方法论。根据这个规范,能够创建出可以复用的前端组件和前端代码。(BEM是一个高可用、强大的、简单易用的命名规范) 编程方法论中常见的一个就是面向对象编程(OOP),这种方法用在了许多的语言中。BEM和OOP类似的,是用代码和一系列模式来描述实际情况的方法,...

LQ55 1119

css类名命名规则_书写Css的一些规范(基础篇)

一、Css书写顺序:1.位置属性(position, top, right, z-index, display, float等) 2.大小(width, height, padding, margin)3.文字系列(font, line-height, letter-spacing, color- text-align等) 4.背景(background, border等)5.其他(animati...

weixin_34688110的博客 5463

问答:怎样规划CSS 中 的命名方式 怎样看待 CSS 中 BEM 的命名方式?

好多盆友 非常纠结 css命名规则 怎么弄,还没起步就被绊住了。那么今天蝈蝈就针对这个问题来讨论一下 没什么技术 含量。但却对效率开发至关重要的 “问题”。 下文是一些知乎大神的个人经验总结,假设认为实用请点赞 留言! JS前端实用开发QQ群 :147250970欢迎...

aoe41606的博客 111

问答 如何规划CSS 中 的命名方式 如何看待 CSS 中 BEM 的命名方式

问答 如何规划CSS 中 的命名方式 如何看待 CSS 中 BEM 的命名方式

qq_43682537的博客 267

BEM命名规范

BEM命名规范

太阳与星辰的博客 966

BEM 和 CSS Modules

BEM 和 CSS Modules 简介 CSS 入门简单,深入就比较难,样式简单维护难。 因为 CSS 是全局性的,所以很容易就出现样式冲突的问题。为解决这个问题。最通常的做法是 CLASS 命名写长一点或者加一层父级选择器从而降低冲突的几率。但是这样 CSS 的命名就变得很混乱。因此就出现了这样一种解决方案:命名约定。例如:BEM、OOCSS、AMCSS、SMACSS。其中使用最为广泛的是 ...

左手121 942
上一篇: 消息服务实践
下一篇: 打包工具比较:webpack VS rollup VS parcel
十方魔
博客等级 码龄10年 202粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值