【问题标题】:Switching the CSS frameworks in Components在组件中切换 CSS 框架
【发布时间】:2017-11-27 19:40:12
【问题描述】:

我正在使用 Angular 开发一个 UI 应用程序,我可以选择以下一个或多个 CSS 框架:

  1. 引导程序 4
  2. 基础
  3. 角材料
  4. ng-bootstrap 或 ngx-bootstrap。
  5. 我可以购买的预制模板。
  6. 许多其他的或新的...

是否有设计 Angular 应用程序的最佳实践,以便更容易切换到不同的 CSS 框架?

我认为,一种选择是定义一个新的功能模块,它将导入特定 CSS 框架的所有控件,然后,我在其上编写一个包装器并在我的应用程序中使用它。

例如,我可以将md-buttoncustom-button 包装在我模块的组件模板中,并在我的应用程序中使用它。

这种方法是否可行,或者是否有我应该遵循的标准设计实践?

【问题讨论】:

    标签: css twitter-bootstrap angular angular-material angular2-template


    【解决方案1】:

    你可以这样做,但在我看来你是在浪费时间。您过去有多少次关闭设计框架?可能永远不会。

    组件的视图比按钮和输入等低级组件包含的要多得多。布局和响应能力都会影响视图的组成。例如,假设您使用材料设计并将md-button 包装在my-custom-button 中。随着应用程序的成熟,您无疑将在容器周围添加填充或边距,以保持这些控件,使其外观和感觉更加材质。切换到新设计模式的日子到了,你猜怎么着?即使您可以快速更换这些按钮以获得新外观,您仍将编辑所有视图以遵循新外观。也就是说,视图不仅仅是构成它们的低级组件,而且不值得用您自己的组件包装每个组件的开销。

    更有意义的是为每个组件创建单独的模板。

    假设您在 Material 中完成了整个应用程序,现在您想切换到 New Hotness。您首先要检查并重命名所有模板:

    login.component.html > login.component.material.html

    然后创建专门针对新框架的新模板:

    login.component.newhotness.html

    接下来,创建一个构建过程,该过程将根据一些配置在构建时交换templateUrl。使用此策略,您将能够轻松集成 IonicNativeScript 等技术,它们的视图不使用 HTML,而是完全不同的基于 XML 的语法。

    要点:

    • 不要用您自己的变体包装现有的库组件
    • 在单独的文件中创建组件模板
    • 当切换到新框架的那一天到来时,为每个组件创建新模板并使用描述包含它的框架的名称定义旧模板
    • 获得报酬! :)

    【讨论】:

      【解决方案2】:

      问题不在于 CSS 类名,而在于 HTML 结构。不久前我开始想知道它,并尝试创建一种中间语言,它可以生成符合 Bulma 的 HTML 或符合 Bootstrap 的 HTML,具体取决于我选择的 CSS 框架。它依赖于 Pug mixin,每个框架都有特定的实现。因此,我可以为表单字段编写此代码:

      form
        +m-input#name(m-label="Name" type="text")
        +m-input#password(m-label="Password" type="password" placeholder="Password")
      

      在 Bootstrap 的情况下,它会生成这个:

      <form>
          <div class="form-group">
              <label for="name">Name</label>
              <input id="name" m-label="Name" type="text" class="form-control">
          </div>
          <div class="form-group">
              <label for="password">Password</label>
              <input id="password" m-label="Password" type="password" placeholder="Password" class="form-control">
          </div>
      </form>
      

      ...但对于 Bulma 案例,它会生成:

      <form>
          <div class="field">
              <label for="name" class="label">Name</label>
              <div class="control">
                  <input id="name" m-label="Name" type="text" class="input">
              </div>
          </div>
          <div class="field">
              <label for="password" class="label">Password</label>
              <div class="control">
                  <input id="password" m-label="Password" type="password" placeholder="Password" class="input">
              </div>
          </div>
      </form>
      

      This post 涵盖了更深入的讨论,并提供了其他示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多