当前位置: 首页 > 科技观察

Bootstrap的CSS类名设计分析

时间:2023-03-13 22:47:09 科技观察

在构建像Bootstrap这样的CSS系统时,保持系统的简单性、稳定性和灵活性是非常重要的。这并不容易,尤其是对于组件数量可能变得相当大的大型团队和项目而言。为了改善这种情况,您不妨考虑用带前缀的类名替换链式类名。使用链式类名方案时,您可能会像这样编写一系列特定于组件的CSS选择器:.success{...}.btn.success{..}.alert.success{...}baseclass.success设置在这里,这可能涵盖了成功按钮和成功工具提示之间的所有共性。然后,在单个组件级别,我们需要扩展或覆盖它。然而,这种完全开放式的类名和链式风格,让开发者面临一些困惑和潜在的痛点:这个基类代表什么?哪些元素会在根级别受到影响(译注:什么意思?)哪些元素可以把.success类链自身是否可以进一步扩展到更多组件如果.success的一个实例使用白底绿字怎么办,另一个使用绿色背景上的白色文本?而这些问题只是冰山一角。这不一定是一个糟糕的解决方案,但如果可伸缩性、简单性和灵活性是您的绝对需求,那么它可能不是最佳解决方案。在这一点上,带前缀的类名方案可能更适合你。带前缀的类名引导开发人员朝着更简单、更易于维护的方向构建可扩展的CSS系统。当我们放弃常规的基类方法,用前缀限制每个组件的样式时,我们的代码就会变成这样:.btn-success{...}.alert-success{...}像这样一方面,基类设置在组件级别,而不是整个系统级别。换句话说,我们的基类变成了.btn和.alert而不是.success。所有组件之间不会有干扰的样式和行为,因为我们将组件的“成功状态”视为贯穿整个系统的一个概念。也就是说,“成功”状态下的各个组件的样式只是在概念层面进行了连接;如何实现这种风格被限制在每个独立的组件中。不用担心普通样式会用到什么地方,也不用担心意想不到的副作用。这种方式使每个组件更加稳定和灵活。构建组件是一项非常具有战略性和注重细节的工作。在像Bootstrap这样的系统中,组件需要在本质上是独立的,以提高模块分离和可定制性。这就是我们编写更好的代码和令人愉快的项目的方式。我的经历作者视角在最新版本的CMUI中,我基本上使用了文章开头提到的“链式类名”风格。例如,大按钮的结构可能如下所示:Largebutton在Bootstrap中,类似的元素可能如下所示:Largebutton一开始我觉得这两者没什么区别——前一个类名是用来挂载frame的预定义按钮样式的,后一个类名是用来挂载frame的预定义按钮样式的指定按钮的大小。将Bootstrap源码中的.btn-lg全部替换成.cmBtn.cmLarge,这不就和我的CMUI一样了吗?我什至觉得Bootstrap的类命名有点啰嗦,.btn和.btn-lg中的btn-不是重复了吗?CMUI仍然干净整洁!不过,看完这篇文章,我似乎也体会到了Bootstrap这种设计的好处。我的理解可能不是原作者的出发点,但也可能列出来仅供参考。这两种风格的类名在用户看来的区别不在于源码是怎么写的,而在于开发者(这里指使用Bootstrap的开发者)看到类名时的反应。我的理解是,不同的名称对开发人员有不同的含义。开发人员并不总是按照组件文档中的示例对组件的结构进行编码。例如,有时他们手头没有文档(或者不想找到它),或者文档中没有列出他们期望的样式。他们可能会抱着试一试的心态尝试修改或组合手头的几个类名,以产生一些新的风格效果。如果类名很宽泛(比如CMUI中的.cmLarge),很容易用它来尝试——例如,开发人员将.cmLarge类添加到一个ul.cmList元素中并期望得到一个大列表,但实际上CMUI不提供这种组合!这破坏了开发人员的期望并导致心理上的挫败感,从而导致最终放弃组件库(夸大)。但如果类名由“组件级”前缀限定(例如Bootstrap中的.btn-lg),那么它被开发者用来组合到其他组件中的可能性就很低了。即使一些异想天开的开发人员试图将.btn-lg更改为.dropdown-lg并将其应用于下拉菜单,他也应该在失败时做好准备。结语这样看来,Bootstrap的做法确实有它的好处,我的CMUI2.0不妨试试看。您如何评价这两种类名样式?不妨留下你的观点!原文链接:https://github.com/cssmagic/blog/issues/45