Bootstrap(4)能否与Angular Material(2)集成?

29

我想使用Angular Material 2库,因为它有(越来越多的)组件。但是我习惯了Bootstrap和它的好处,如响应式工具和轻量级UI等常见功能。在Bootstrap中,我主要指的是其CSS部分,我几乎从不需要其JS功能。

例如,在Material库中,列表组件几乎没有样式,而Bootstrap则用其CSS提供了相应的样式。

我记得曾经看过一篇文章,说将它们组合在一起不是一个好主意,主要是因为它们全局的应用程序样式会发生冲突。我找不到那个来源,我很好奇 - 是否与当前版本有关?如果是这样,具体有什么冲突,如何解决?


如果你想要在Angular中使用Bootstrap元素,可以使用类似https://angular-ui.github.io/bootstrap/的东西。 - ESR
4个回答

17

由于Bootstrap是模块化的,一种替代方法是使用Angular Material,然后只从Bootstrap中选择你真正需要的部分。


注意: 无论您要导入什么内容,都应该先安装Bootstrap:

npm install bootstrap --save

在全局的style.scss文件中引入所需的sass文件:

 // Imports functions, variables, and mixins that are needed by other Bootstrap files
 @import "~bootstrap/scss/functions";
 @import "~bootstrap/scss/variables";
 @import "~bootstrap/scss/mixins";

例如,您可能希望使用Bootstrap Reboot以使所有浏览器更加一致地呈现元素并遵循Web标准。
然后,您只需要导入:
// Import Roboot
@import "~bootstrap/scss/reboot";

如果您想使用Bootstrap网格系统,那么您可以进一步添加以下内容:

@import "~bootstrap/scss/grid"; // add the grid

因此,您将能够在您的HTML模板中使用它:

<div class="container">
  <div class="row">
    <div class="col">
      One of three columns
    </div>
    <div class="col">
      One of three columns
    </div>
    <div class="col">
      One of three columns
    </div>
  </div>
</div>

您可能还想使用Bootstrap Utilities,在这种情况下,请添加:

@import "~bootstrap/scss/utilities"; // add css utilities

我的答案基于这里详细解释的内容:https://www.amadousall.com/the-good-parts-of-bootstrap-4-you-are-missing-in-your-angular-material-projects/


1
实际上,您可能希望跳过Reboot或在其上方添加自己的MD兼容的“修复”措施。例如,我发现当按钮处于聚焦状态时,Reboot会通过添加边框与MD按钮发生冲突,而干净的MD则没有边框。 - JustAMartin
@JustAMartin 我遇到了这个问题,我尝试只从Bootstrap中导入网格,因为这是我需要的,但在导入时会出现一些未定义的变量。 - sgClaudia98

9

Angular Material 2是一种新的库,仍处于积极开发阶段,因此您不应该期望在其中看到许多花哨的功能,但从长远来看,在您的angular应用程序中使用Material 2将带来许多好处。以下是一些概述:

组件开发工具包

在最近的版本中,Material 2团队引入了@angular/cdk,这是Material 2的核心,也为开发人员编写自己的第三方组件提供了良好的基础。目前还没有关于@angular/cdk的文档,但您可以跟踪该问题https://github.com/angular/material2/issues/2789以保持更新。

响应式设计

Material 2中没有内置的功能可提供响应式设计。对于此问题,您必须使用@angular/flex-layout,这与Material 2完全分离 - 基本上它是在Flexbox CSS之上的一个不错的抽象。使用它,您无需自己编写大量响应式css mediaQueries。

浏览器支持

Material 2: IE11+
Bootstrap 4 IE10+
Bootstrap 3 IE8+

Bootstrap + Material?

如果您想在应用程序中同时使用这两个框架,则可以自行决定。如果这样做,请检查捆绑包大小以确保其不会过大。


1
如果你将Material和Bootstrap的所有内容都加入其中,那么是的,你会有很大的负载。但是,你只需要使用你需要的部分,这样可以保持实际捆绑包的小巧。例如,Bootstrap实用类非常好用,而且不会与Material发生冲突。 - seBaka28
@seBaka28,是的,你说得对,我会根据你的评论更新答案。 - angularrocks.com

5
虽然Kuncevic的答案是正确的,但我认为我们还应该添加以下内容:
- Angular Material会隐式升级/降级DOM元素,而Bootstrap则不会。这意味着在Bootstrap中,你所看到的就是你得到的,而在Angular Material中,一些元素是自动渲染的。因此,即使你想要将两者结合起来,我也无法真正看到如何做到。加上Angular的view encapsulation,情况变得更加混乱。 - 我只能看到网格中有合作的余地。你可以使用Bootstrap来制作网格,并使用Angular Material来制作其他部分,但是使用Angular Flex Layout(正如Kunsevic已经提到的)你根本不需要这样做。这里有一个小的学习曲线,但如果你使用Angular的话,它是值得的。 - Bootstrap的CSS与Angular Material的CSS存在冲突。当它们一起使用时,我注意到某些元素,如浮动按钮内的图标,没有正确居中等。这不应该是一个困难的修复,但为什么要费事呢?你可以使用Angular Flex。
希望这有所帮助。

2
Angular Flex Layout 的唯一问题是它仍处于测试版阶段,似乎没有进展。 - steveareeno
2
这是一段时间以前写的。实际上,Angular Flex Layout看起来已经被放弃了。从那时起,我一直在使用Bootstrap,只用它的网格布局(我的答案中的选项2)。 - Kostas Siabanis

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接