当前位置: 首页 > Web前端 > CSS

关于css命名的一些思考,讨论css命名空间的可行性

时间:2023-03-31 11:21:15 CSS

本文主要讨论传统项目中的css命名,vue,react等单页应用可以使用css-module来解决这个问题,作为前端的小白,免不了要切图(写css,html静态部分),写css最头疼的就是给类命名,词汇量有限,又懒,想着类名比布局还难.在网上搜索了一下,发现css规范比较统一,接受度也比较高。但是css命名似乎没有完美的解决方案。张新旭大师简明法BEM命名法-达摩老师科普BEM简明法张新旭简明法是这样的:.fr{float:left;}.tc{text-align:center;}.pb8{padding-bottom:8px;}

简洁的方法重用率高,性能好,但是这么一堆class感觉有点像写内联样式,维护起来太难受了。毕竟,这是七年前张新旭写的一篇文章。BEM命名法BEM意为块(block)、元素(element)、修饰符(modifier),是Yandex团队提出的一种前端命名方法论。这种巧妙的命名方法使您的CSS类对其他开发人员更加透明和有意义。BEM命名约定更严格并且包含更多信息,它们被团队用于开发大型、耗时的项目。————摘自达摩先生的BEM科普BEM应该算是一个比较科学和系统的命名法。每个类都有一套BEM,自然不会混淆。不过这个冗长的类名写起来真的是软软的。虽然使用scss的&选择器可以省很多事,但是html中冗长的类名还是无法避免,pug之类的html模板也救不了我们。所以想知道有没有科学简洁的css命名方法,于是自己创建了一个命名空间方法,在我的项目中使用起来很开心。但是,这种方法还没有经过大型项目的测试。希望高手讨论一下可行性。命名空间方法的基本思想这种方法最好配合scss使用。思路是最外层使用唯一模块名,内层使用简单类名,最外层禁止使用简单类名。不同模块中,简单的类名可以任意使用,不会影响其他模块。例如:.m-header{.left{背景:红色;高度:10px;}.right{背景:黄色;高度:10px;}}.m-body{.left{背景:蓝色;高度:10px;}.right{背景:绿色;高度:10px;}}
结果是这样的:不懂scss的同学可以看看编译好的css:.m-header.left{背景:红色;高度:10px;}.m-header.right{背景:黄色;高度:10px;}.m-body.left{背景:蓝色;高度:10px;}.m-body.right{背景:绿色;高度:10px;}.left和.right在两个模块中(m-header和m-body,模块推荐使用m-前缀)没关系,只要我们在最外层定义一个唯一的类名即可,比如命名空间,不要在最外层使用简单的类名,以防止冲突。那么我们就可以在模块内部随意使用各种类名了。当然,我们可以在下一个模块中再次使用它们。妈妈再也不担心我词汇量不足想不出名字了。.top,.bottom,.left,.right上下左右,baba一个接一个。为了规范,建议使用更语义化的类名,当然不需要带长前缀。通用样式一个项目中可能有很多通用样式,但是只要我们遵循一些规则,就不会出现冲突。例如,我们对公共样式使用前缀“p-”。不要在其他地方使用'p-'作为前缀。我们也可以在scss中使用mixin、function、$variable来提高效率。.p-btn{font-size:14px;}.p-bg-green{background:green;} 深度嵌套的问题许多CSS规范规定嵌套不能超过四层。在下面的示例中,我们嵌套了6层。在scss中我们不能直接使用@at-root,它会将简单的类名暴露给最外层。使用&也避免不了嵌套太深。这时候我们需要使用@at-root后跟一个模块命名空间来防止嵌套太深,避免样式污染。当嵌套特别深时,建议启用子模块。(这里可能有漏洞,不知道大神们有没有更优雅的方案).m-header{.a{background:#000;.b{背景:#111;.c{背景:#222;@at-root.m-header.d{背景:#333;.e{背景:#444;}}}}}}编译成css:.m-header.a{background:#000;}.m-header.a。b{背景:#111;}.m-header.a.b.c{背景:#222;}.m-header.d{背景:#333;}.m-header.d.e{背景:#444;}使用子选择器让命名更随意如果你不想兼容旧的ie6,对于一些只对子(大部分)有效的样式,带上子选择器。再敲一个>,好处是css渲染效率更高,命名可以更随意,甚至可以这样,虽然不推荐。.m-header{>.a{高度:40px;背景:红色;>.a{高度:20px;背景:绿色;}}}12样式没有冲突:综上所述,命名空间法则规定最外层的css模块以m-为前缀,类名是唯一的。模块中元素的样式受后代或后代选择器约束,仅适用于本模块,使用简洁的语义命名。公共样式以p-为前缀。禁止在最外层使用简单的类名,可以添加特定的前缀,防止模块的风格被污染。这种方法类似于许多编程语言的命名空间。你应该看看私有变量和全局变量的味道。我的经验还很浅,不知道这个方法有没有什么大的漏洞。欢迎大家理性讨论,指出问题或改进。我用了一段时间,如果不是很复杂的项目(比如评论区大神提到的动态css和动态dom),问题不大。有几点需要改进:第一,为了避免嵌套太深,方便复用和维护,模块内部不使用嵌套,只使用scss写到二级。第二,不要使用父子选择器,因为dom父子关系经常变化,建议使用模块内唯一的CSS命名。这个方法确实很多人用过,比如网易的CSS规范——命名规则,我发誓我以前没见过:)