你可能不需要 CSS 框架

CSS 框架已经存在了一段时间,并且在前端开发领域变得非常流行。这些框架提供了代码片段,您可以直接复制粘贴到您的网站中以构建整个布局和 UI。

您可能已经阅读了很多关于它们如何对您的项目有益的文章,但在这里我想做相反的事情:强调它们可能给您的网站或应用程序带来的一些缺点,以及如何避免或减轻这些缺点。

webangelist_001-1

当我问人们为什么使用某个特定的框架时,他们的回答通常属于以下一个(或多个)类别

  1. 速度:大多数人认为它会使开发更快。在项目的初始阶段,这可能是正确的。但是,这种收益可能是以技术债务为代价的——我们将看到债务是如何产生的——之后需要偿还,并且会产生利息。
  2. 最佳实践:有些人认为使用框架是最佳实践,尤其是那些刚开始前端开发的人。大量文章以及在训练营课程或提及框架的职位描述中包含框架,都强化了这种观点。
  3. 设计:许多开发人员只想发布一些东西,并且他们的项目没有设计师可用。CSS框架提供开发人员可以使用的一些基本设计。虽然这很有用,但结果是您的网站或应用程序最终看起来与互联网上所有其他最近的网站一样——但这是否会影响您的项目,则取决于您自己决定。

技术债务

无论使用框架的原因是什么,框架都可能在您的项目中引入技术债务。有时拥有这种技术债务是有意义的,例如,如果您需要尽快发布一些东西,或者您正在构建一个稍后将被丢弃的原型。

但是,对于大型项目(如持续运营的网站或应用程序),这种技术债务可能会变得难以管理并阻碍开发。让我们看看为什么会发生这种情况。

无语义的 HTML 代码

这不是框架本身的问题,但我已经看到它在最流行的一些框架中发生了很多次。

例如,您可能正在阅读有关按钮样式的文档:您可能会找到一段代码片段,告诉您使用 CSS 类来设置禁用按钮,而不是将disabled属性添加到<button>标签本身。

有大量的<div><span>示例,在这些示例中,更具语义的标签会更合适。我们就不谈<div>嵌套在<div>中,再嵌套在<div>中的情况了…

过于具体的 CSS 选择器

同样,这不是框架固有的问题,而是在最流行的框架中观察到的现象:有一种趋势是使用非常具体的选择器来创建 CSS 规则。例如

.table-responsive > .table-bordered > thead > tr > th:first-child

如果您需要覆盖<th>的一些属性会发生什么?然后您需要创建更具体的选择器!您不能仅仅通过创建像这样的通用规则来解决问题

th.important-heading { color: #000; }

相反,您需要设置如下规则

.table-responsive > .table-bordered > thead > tr > th:first-child.important-heading {
  color: #000;
}

在实际应用中,没有人想编写这种代码。我们很快就会看到这些类型的规则出现

th.important-heading { color: #000; !important }

…这只会使问题更严重

不需要的规则

如果您包含了整个框架,而不是您真正需要的部分,那么您将拥有实际上没有使用的 CSS 规则

当然,您可以借助后处理工具来删除未使用的规则来减轻这种情况,但是一旦您开始使用 JavaScript 动态添加或删除类,您将永远无法 100% 确定您不需要该代码。

未使用的 CSS 不仅会使您的文件更大(这对于连接到蜂窝网络而不是 Wi-Fi 的移动设备来说可能是一个问题),还会使您的代码库更大,从而更难维护。

拥有您自己的观点和决策

所有框架都是有观点的。如果您没有强烈的观点,或者您的观点与框架相同,那么这不是问题。

但有时您确实有强烈的观点。例如,以下是一个框架提出的用于创建彩色文本标签的 HTML 代码

<span class=“label label-warning”>Out of stock</span>

我发现这些类是冗余的,因为我喜欢只使用我认为必要的类。如果那是我的代码,我可能只会使用一个类label-warning

如果您是某个特定 CSS 方法(如“块、元素、修饰符”)的粉丝,而您的框架没有使用该方法,该怎么办?

框架的替代方案

编写您自己的 HTML 和 CSS。如果您不喜欢框架生成的标记,则应该编写您自己的标记。如果框架提供的 CSS 规则使您的工作效率低下,则应该创建您自己的规则。

如果您需要网格,您可以今天就使用 Flexbox,它使创建布局比使用浮动 div 容易得多。如果您不熟悉 Flexbox,请查看此MDN 指南。如果您好奇代码可能是什么样子,这里有一个我使用 Flexbox 做的圣杯布局的实现

将来我们将拥有Grid!这将使创建布局变得轻而易举,您将再也不会想使用现有的网格框架了。这里有另一个圣杯布局的实现,这次使用的是 Grid。

(注意:要查看浏览器中实际的结果运行情况,请尝试使用Firefox Nightly或最新的Firefox 开发者版浏览器——它可以正常工作。要在任何其他 Firefox 版本中查看这些示例,您需要切换标志。转到浏览器中的about:config以启用layout.css.grid.enabled功能。)

如果您只需要一个 UI 小部件,例如自定义下拉菜单,并且您不想从头开始编写代码,您可以随时获取该部分(而不是整个框架),或者使用没有外部依赖项的第三方组件。

如果您需要一个设计可以使用,那么使用这些框架的一种合理方法是获取SassLess源代码,而不是生成的 CSS 文件。如果您这样做,您可以获取 mixin 并创建您自己的选择器,这将允许您拥有自己的标记。但请记住,您的网站也会与大量其他网站看起来完全一样!

如果您需要一种标准化项目中 UI 创建的方法,以便人们知道使用哪段代码以及如何添加新的界面元素,那么您需要的是样式指南(简而言之,您自己的自定义框架)。对于大型项目,您应该有一个!

总结

CSS 框架可能具有优势,但它们也有一些经常被忽视的缺点。请注意这些缺点,并了解您可以使用的工具和 API 来创建网站和应用程序的 CSS 和标记。

 

关于 Belén Albeza

Belén 是一位工程师和游戏开发者,在 Mozilla 开发者关系部门工作。她关心 Web 标准、高质量代码、可访问性和游戏开发。

更多 Belén Albeza 的文章…


32 条评论

  1. Brandon Zell

    “您今天可以使用 Flexbox”

    我不确定浏览器支持是否足够好,可以将 flexbox 用于所有内容:https://caniuse.cn/#search=flexbox

    2016年4月21日 12:07

    1. Belén Albeza

      嗨,Brandon,

      从您发布的同一链接中,您可以看到支持率> 94%。作为比较,border-radius没有达到 90%。

      所以是的,我认为您今天可以(应该)使用 Flexbox——除非您被迫支持旧版本的 Internet Explorer。

      2016年4月21日 12:17

      1. Brandon Zell

        确实,如果您查看全局统计数据,border-radius没有达到 90%,但它支持回溯到 IE 9 且没有错误。

        Flexbox 存在错误,即使在 IE 11 中(它并不古老)。我非常乐意开始使用 Flexbox,但鉴于当前的浏览器支持,我不敢轻易切换。

        2016年4月21日 13:12

        1. Philippe Lhoste

          我在我们的应用程序(SPA)中使用了 Flexbox 来布局页眉、两个侧边栏(或更少,取决于页面)和中心内容(以及其他内容):既不简单也不过于复杂。在 IE 10/11 中显示正常。

          您可以拒绝使用 Flexbox,直到无错误的实现广泛普及。或者现在就开始使用它,测试您的用法以确保它在所有地方都正常…

          好吧,就像任何 CSS 功能一样,我想。

          2016年4月22日 04:09

          1. Alex Mandl

            IE 的 6.1% 使用率主要是由于在日本的使用率较高。
            如果您为当地连锁超市或仅在国内销售商品的任何企业设计网站,请不要害怕使用 flexbox。
            https://en.wikipedia.org/wiki/Usage_share_of_web_browsers#/media/File:Browser_Market_Map_June_2015.svg

            2016年4月23日 06:21

        2. Chris

          我认为在这种情况下最好的做法是,如果时间允许,请继续使用 flexbox。您可以使用诸如 Modernizr 之类的功能检测,然后创建优雅的回退到浮动,例如,如果我们正在谈论布局。

          您甚至可以使用浏览器检测专门检测 IE 11(并非总是最佳实践,但有时是必要的)。

          推迟使用功能而不是拥抱新的强大功能和灵活性(双关语)在这样一个快速发展和不断改进的行业中似乎是违反直觉的。

          最终目标是拥有以最具未来发展前景的现代方式构建的项目,这些项目逐步增强并优雅地降级。

          所有这些都很好,但我们都有那些例外情况的项目,其中时间宝贵或预算不存在,但作为前端开发人员,我们的工作就是突破浏览器能力的界限,并在新技术可用时拥抱它们。

          这就是我的想法!

          2016年4月22日 12:23

        3. JAson Witt

          此外,如果 border-radius 不起作用,则您将无法获得圆角。如果 Flexbox 不起作用,则会破坏整个站点。

          2016年4月23日 07:04

    2. changke

      http://dowebsitesneedtolookexactlythesameineverybrowser.com/

      2016年4月23日 13:36

  2. John Bilicki

    终于有人在真正动脑筋了!当您进入另一家公司或之前启动的项目时,99.9% 的时间不是他们在那里偷懒并使用了框架,而是他们偷懒并使用了哪个框架。一部分责任在于,当这些技术的新手进入时,其他人会走过来,而不是教他们真正的代码,而是把框架往他们头上猛砸。有多少 WordPress 网站有 280KB 的 jQuery?即使只有一份副本,那也是更多的代码在那里什么也不做,而我能够在不到 70KB 的单个副本中加载所有内容,包括管理 JavaScript、CSS 和 XHTML5。

    框架的另一个错误论点是兼容性。JavaScript 中有一个很棒的东西叫做对象检测。此外,对于那些抱怨 CSS 兼容性的人来说,这并不难。我的平台会在适用时附加正确的前缀,而无需任何对单个用户代理的引用,因此我只会编写 W3C 标准,除了不是任何标准一部分的非常具体的供应商 DOM。

    然后看看框架以及它们做了什么。“clearfix”?真的?为了天哪,直接使用 .clear 就好了!此外,如果您需要经常清除,那么是时候看看为什么需要清除东西了!“pullleft”……Bootstrap 正如其首字母缩写所暗示的那样;它是一个由服务器人员开发的框架,他们不了解客户端开发。

    对于“我们没有足够的时间”,您告诉您的老板它需要花费那么多时间,如果他们不喜欢,那么他们要么需要给您分配更多时间,要么干脆避免做那个项目。如果您不让人们承认您的技术专长,拥有技术专长还有什么意义呢?

    有一种方法是正确做事,另一种方法是昂贵的方式,正确做事并不昂贵。

    2016年4月21日 14:59

    1. Dave Woodall

      Belén,很棒的文章!我读过一些关于单页应用程序的类似内容,这让我相信它们是他们自己的技能集,而不是我(一个 Rails 开发人员)的必需品。[1]

      约翰,我也很喜欢你的评论,你们两个给了我信心,让我相信自己的直觉,直接开始编码,因为我知道自己的编码能力足够好,不想因为你们两人提出的诸多理由而依赖框架。

      向上,向前!

      [1] http://blog.trackets.com/2014/09/29/tips-for-building-a-single-page-application.html

      2016年4月27日 13:41

  3. Jesús Perales

    简单来说就是“避免过度”。

    2016年4月21日 17:09

  4. Jason Knight

    自从人们开始使用框架的那一天起,我就一直以更强烈的语气表达这一点!充其量,它们是新手时代骗子艺术家胡编乱造的东西,可以作为令人作呕的流行语,用来给那些认为可以从福布斯杂志上获得可靠的技术建议的老板们留下深刻印象。(这就像从《大众电子》杂志上获取理财建议一样。)

    最糟糕的是,它们让那些不懂 HTML 或 CSS 就开始构建网站的人自欺欺人地认为自己能够胜任,同时还对有可访问性需求的用户竖起中指。

    因此,我自己也写了一篇关于这个主题的稍微有点侮辱性的文章,质疑那些使用像 Bootcrap 这样的愚蠢东西的人的心理素质,以及那些推广其使用的人的勇气!

    http://www.cutcodedown.com/article/HTML_CSS_and_JS_frameworks

    任何认为框架使他们的生活更轻松或更好的人,可能对 HTML 或 CSS 的了解都不够,甚至不应该在该主题上开口!!!

    2016年4月21日 18:19

    1. David

      试着和一些初级开发人员一起,用有限的预算完成一个项目。在我看来,这就是框架存在的意义。

      2016年4月30日 22:56

  5. Stefan

    在我看来,最佳实践是使用框架的 SASS 或 LESS 版本,并从核心开始。只有在需要时才添加其他功能。我完全不同意 Flexbox 已经可以随时使用了。如果你在任何一种即使是半企业性质的公司工作,你仍然需要支持 IE9,甚至大部分时间是 IE8。对于 IE10 及以上版本,几乎有完美的回退方案,但对于 IE8 和 IE9,可能永远都不会有。在处理支付流程等方面,你目前还不能使用 Flexbox。

    2016年4月22日 00:51

  6. Álvaro González

    在早期,内容和样式之间没有任何分离。网站充斥着嵌套表格、难以理解的非语义标记、内联字体和颜色、透明 GIF……

    CSS 的诞生是为了解决这个问题。现在,我们又陷入了嵌套 div、难以理解的非语义标记、内联类名和属性、CDN 资源……的困境。

    我可能是在变老了,变得越来越暴躁了。

    2016年4月22日 02:20

    1. Jason Knight

      你所说的关于 div 混乱的问题让我想起了我一位已故的朋友——Dan Schulz——在 HTML5 之前的时代对网页开发的评价。

      “那些为了布局而不断地使用毫无意义的嵌套表格的人,现在只是不断地使用毫无意义的嵌套 div”。

      ……而且这是真的。对于太多以任何方式随意输出标记的人来说,这正是变化所在,他们完全没有语义或 HTML 目标的概念,仍然使用标签来表示它们的显示方式而不是它们的含义,使用具有表现形式名称的类(参见像 OOCSS 这样的半智障废话,以及由此衍生的 Bootcrap),导致仍然使用三倍或更多所需的 HTML 来完成工作——与数十甚至数百 KB 的拙劣组合的 CSS 协同工作,而这些 CSS 其实只需要 16 KB 或更少即可完成。

      看看现在有多少所谓的专家实际上在攻击内容与表现分离的概念……看看所有被欺骗成认为自己是“设计师”的傻瓜,仅仅因为他们知道如何在 Photoshop 中摆弄图层……看看像 CSS 预处理器和框架这样彻头彻尾愚蠢的半智障白痴无知废话,竟然找到了足够蠢的人选择使用它们!

      所有这些都导致了更多工作、更多代码、占用更多带宽,并在过程中对可用性、可访问性和可持续性竖起中指——然后这些蠢货竟然厚颜无耻地称他们拙劣组合的垃圾比传统方法“更容易”,而这些垃圾需要更多工作和更多时间才能创建?

      2016年4月22日 16:25

      1. Julien

        不管你喜不喜欢,CSS 预处理器和 CSS 框架帮助了成千上万的人。每个项目都有不同的背景和解决方案。我经常为内部用户构建简单的 SPA,而 Bootstrap 在这些情况下非常方便。对于预算和时间线都比较充裕的大型项目,我会花时间构建自己的东西。

        2016年4月27日 11:35

      2. Nige

        Jason,你在第二个评论里听起来有点像个喷子。

        不管我们喜不喜欢,框架的使用情况总是由其自身的情况决定的。对症下药,伙计。

        并不是每个为网络创建内容的人都有多年的编码经验,你花了 20 多年才意识到这一点吗?期望这一点是不明智的。

        这篇文章本身对于那些不一定了解使用框架带来的缺点的人来说会很有帮助。但你的第二个评论听起来像是傲慢的开发人员在发表高论。

        网络是一个活生生的东西,就像所有活生生的东西一样,它也存在缺陷,并不是每个使用它以及为它构建/设计内容的人都是专家。这就是生活!

        2016年4月29日 08:04

  7. Thierry Koblentz

    你好,Belén,

    你列出了使用框架的三个理由

    – 速度
    – 最佳实践
    – 设计

    我想再补充一个重要的理由:缺乏技能或知识来创建自己无错误或问题的解决方案。

    例如,你说人们可以使用“Flexbox”而不是开箱即用的解决方案(例如 Bootstrap)来创建布局。但这意味着他们将通过切换到浏览器支持不佳的布局,为许多用户提供糟糕的体验。这怎么算明智的决定呢?框架确实存在成本(主要是性能),但至少它们解决了大多数人无法独自解决的问题。

    在我看来,目标应该是为最终用户提供满意的体验,而不是因为拥有 100% 的代码库而沾沾自喜。

    2016年4月23日 09:13

  8. Benjamin Gandhi-Shepard

    写得很好。我同意。如果你能写出比框架更好的 CSS,那就去做吧。我喜欢 Bootstrap 如何帮助无数开发人员创建外观不那么糟糕的网站。但我讨厌几年前那个时期,你必须精通 Bootstrap 才能被称为知识渊博的前端开发人员。

    2016年4月24日 10:32

  9. David Murcof

    是的,你绝对需要 CSS 框架。

    主要原因是文档。

    当我使用 Bootstrap 时,我的后端开发人员在查阅文档时可以轻松理解代码。因此,我不必发明没人理解的糟糕类并编写垃圾文档。

    绝对没有人关心这些额外的 CSS 字节。

    另一个好处是快速原型设计。当我要一遍又一遍地为每个该死的表单编写自己的样式时,这很耗时。我可以为表单、按钮等等编写一个标准的 CSS 文件……哦,等等!

    2016年4月25日 02:39

  10. Nico Burns

    嗯……这篇文章针对的是哪种 CSS 框架?我假设它主要针对 Bootstrap/Foundation 类型的框架,在这种情况下,它是有道理的。但是,我认为 Inuit.css/ITCSS 采用的方法更有帮助。它们更侧重于代码组织,并提供一些有用的标准样式(可以通过 SASS 扩展以避免使 HTML 代码混乱)。在我看来,这是两全其美:灵活性和无需从头开始编写所有内容。

    2016年4月25日 02:53

  11. Gary

    对于前端开发的新手来说,这是一篇非常重要的文章。在面试过程中,我见过很多人非常擅长 Bootstrap 或 Foundation,但在制作一个简单的预 CSS 响应式布局时却失败了。而且很多人仍然避免使用原生 CSS 动画。那些认真对待网页职业生涯的人必须学习核心 CSS,以制作响应式和高级动画。他们必须掌握 Sass/Less,而不是使用框架。

    2016年4月25日 03:00

  12. Dane

    我不喜欢 Bootstrap 和 Foundation 这样的大型框架,但我发现使用 Spacebase – http://spacebase.space150.com/ 可以帮助我学习很多最佳实践和辅助工具、可以与 SASS 一起使用的 mixin。

    2016年4月26日 09:16

  13. Phil M

    上面的一些评论听起来很傲慢和精英主义。

    网络被各种各样的人出于各种各样的原因使用。如果用户下载了几个额外的 KB,但这意味着按时交付网站与延迟或永远无法交付之间的区别,那又有什么关系呢?人们*真的*必须等到他们成为超级熟练的 CSS 忍者才能在这个行业工作吗?

    这篇文章本身相当平衡——它没有夸大其词;它只是指出使用框架可能会带来成本。

    没问题,你现在已经了解了,如果你认为成本可以通过收益来证明,你仍然可以继续使用该框架。了解你的目标用户以及他们将使用的设备,并根据此做出决策。

    忽略那些试图贬低像 Bootstrap 这样在各种用途上都成功的框架的精英主义评论(我与他们完全没有任何关联)。Bootstrap 和其他框架的开发是有原因的,它们满足了需求。当然,了解它们的目的并尽量避免不必要地滥用它们,但不要害怕使用它们。

    2016年4月26日 15:39

    1. Julien

      我完全同意你的观点。到目前为止,这是最好的评论。

      2016年4月27日 11:39

  14. Barbara Sykes

    对于前端开发的新手来说,这是一篇非常棒且重要的文章。感谢分享 :)

    2016年4月26日 23:28

  15. JAson Witt

    当 CSS 框架刚刚开始流行时,我看到一个论坛帖子说“自己构建一个,然后再使用别人的”。

    我牢记于心,并花了一个月左右的时间开发了自己的框架。对于那个时代来说,它相当不错,但是当我开始实际使用它时,我发现我只使用了其中的一小部分。在花费了所有时间构建框架之后,我意识到我的所有努力都白费了。

    如果你最终只使用 100 行代码,那么 4000 行 CSS 真的值得放到你的项目中吗?

    2016年4月27日 09:17

  16. Álvaro González

    对于那些将所有这些话题都视为精英式的书呆子内容的人(“谁在乎几个额外的 KB,你还在用调制解调器吗?”):一篇包含 5 段文章的典型报纸页面需要多长时间才能完全加载?在我的 30Mbps 有线连接中,从我的电脑(以太网)加载平均需要大约 15-20 秒,峰值超过一分钟。如果我用我的 2014 年平板电脑(Wi-Fi)浏览,则需要花费两倍的时间。而且你最好小心地滚动,因为这可能会很痛苦。是的,这并不是完全由于 CSS 造成的(每次我打开开发者工具时,都会看到数百个 HTTP 连接正在加载几 MB 的数据),但整体心态正在使网络变得比它应该的更难用。

    2016年4月28日 01:45

  17. SP

    我认为所有工具,包括 CSS 框架,都有其各自的用途。所以,虽然我不同意极端主义的评论(总的来说),但我确实同意应该谨慎使用它们——也就是说,你不会用一把大锤来压平一张纸上贴纸的一角。真正的问题在于这些框架的使用方式。遗憾的是,我刚刚看到这段代码来说明这一点“div.form-group.form-group-sm.form-inline.btn-group.btn-group-sm.has-warning”。哈哈,也许手写 CSS 在这里更有意义…… :)

    2016年4月28日 07:32

  18. Raj

    你好,

    我完全讨厌使用过于臃肿的框架,因为有一半时间我并不需要它们的定义样式,并且总是需要覆盖样式,从而导致 CSS 中出现更多臃肿。

    我发现只使用像 LOSS 这样的网格框架非常适合网页开发,它非常轻量级。

    至于 Flexbox,我们今天绝对可以开始使用它。我知道 IE 8 和 IE9 不支持它,但我们始终可以使用 Modernizr 回退到浮动。这都是为了让你的代码更具未来性。

    2016年4月29日 14:52

  19. Matthew TROW

    你提出了一些有效的观点,但是,我认为这样说也是正确的

    “在使用框架之前,先了解 CSS 的工作原理”。

    我们在框架和 CSS 后处理方面遇到的最大问题是缺乏对 CSS 最佳实践的基本了解。

    有趣的是,使用你描述的 label-warning 示例,实际上可以解决“过度具体的 CSS 选择器”的一些问题,因为它具有模块化。
    它还可以节省字节,因为核心 label 类具有通用属性,并且该类仅通过差异进行扩展。
    如果你只使用 label-warning,如果你的另一个 label 类型几乎完全相同,但文本为蓝色怎么办?——你可以复制整个类,包括相同的属性,或者你可以使用模块化方法,就像“label label-warning”一样。

    我真的认为“为什么应该使用”或“为什么不应该使用”这样的问题没有意义。
    因为精心制作的框架具有极强的模块化,你可以只选择你想要的部分。
    替代方案是

    1. 不断地重新创建相同的模式
    2. 编写你自己的框架

    这两个选项都有缺点。
    以最流行的框架为例,计算出该框架不仅需要多少人工时,还需要多少贡献者。你很难构建出质量相同的框架。

    最好使用你想要的框架部分,用你自己和其他人的代码扩展它,并回馈社区。
    为此,你需要了解 CSS——但使用框架实际上会教你如何编写有效的模块化 CSS。
    这是一个双赢的局面,一旦你掌握了一个框架,你就可以使用它的全部或部分,扩展它,与另一个框架混合,并保持代码精简。

    2016年5月4日 02:00

本文评论已关闭。