【问题标题】:Polymer custom element styles with HTML imports具有 HTML 导入的 Polymer 自定义元素样式
【发布时间】:2014-05-22 23:36:18
【问题描述】:

我有一个自定义元素正在使用通过 HTML 导入导入的样式。

从 Chrome 稳定版 (35.0.1916.114) 和 Canary (37.0.2008.2 canary) 开始,这些样式不再应用于自定义元素内定义的模板。 Safari (7.04) 和 Firefox Aurora [29.0a2 (2014-02-11)] 看起来不错。

Chrome 有回归吗?

例如我的 imports.html 看起来像:

<link rel="stylesheet" href="/assets/stylesheets/libs/bootstrap.min.css" media="screen">
<script src="/assets/javascripts/libs/jquery.min.js" type="text/javascript"></script>
<script src="/assets/javascripts/libs/bootstrap.min.js" type="text/javascript"></script>

我的聚合物元素定义如下:

<link rel="import" href="imports.html">
<link rel="import" href="bower_components/polymer/polymer.html">

<polymer-element name="x-test">
<template>
  <select id="test">
    <option template repeat="{{ item in items }}" name="{{ item.id }}">
      {{ item.value }}
    </option>
  </select>
</template>
<script type="text/javascript">
  (function() {
    Polymer('x-test', {
      ... 
    });
  })();
</script>
</polymer-element>

正在使用的聚合物版本是:

"platform": "Polymer/platform#0.2.4",
"core-action-icons": "Polymer/core-action-icons#0.2.4"
"version": "0.2.4"

【问题讨论】:

    标签: css polymer


    【解决方案1】:

    Chrome 35 使用的是真正的 ShadowDOM,您会看到 ShadowDOM 样式封装的效果。 polyfill 版本不同是因为它不完全支持 ShadowDOM 样式范围。

    如果您希望 boostrap 样式应用于 shadow dom 中的元素,您需要在聚合物元素模板中包含样式表。否则,重写规则以使用::shadow/deep/

    更多信息:

    【讨论】:

    • 您是否建议在主机页面中使用单个引导导入(通过 HTML 导入)并使用 ::shadow/deep/ 或定义其模板引入样式的单个自定义元素,然后让浏览器对样式表的网络请求进行重复数据删除(因为这些样式可能嵌入到多个自定义元素中?)
    • 使用通用元素来拉入样式并不是一个可行的解决方案,因为通用元素的样式本身是有范围的。所以我想在每个需要它们的模板元素中包含样式表会更容易。
    • @ebidel ::shadow 和 /deep/ 已弃用,有什么替代选项?
    【解决方案2】:

    由于在每个模板元素中包含样式表并不容易,所以我认为应该提供一个特殊的引导程序,将/deep/ 添加到它的选择器中。

    比如breadcrumb,应该改成

    .breadcrumb {
      padding: 8px 15px;
      margin-bottom: 20px;
      list-style: none;
      background-color: #f5f5f5;
      border-radius: 4px;
    }
    .breadcrumb > li {
      display: inline-block;
    }
    .breadcrumb > li + li:before {
      padding: 0 5px;
      color: #ccc;
      content: "/\00a0";
    }
    .breadcrumb > .active {
      color: #999;
    }
    

    body /deep/ .breadcrumb {
      padding: 8px 15px;
      margin-bottom: 20px;
      list-style: none;
      background-color: #f5f5f5;
      border-radius: 4px;
    }
    body /deep/ .breadcrumb > li {
      display: inline-block;
    }
    body /deep/ .breadcrumb > li + li:before {
      padding: 0 5px;
      color: #ccc;
      content: "/\00a0";
    }
    body /deep/ .breadcrumb > .active {
      color: #999;
    }
    

    这并不容易,或者应该很容易做到……

    那么,@ebidel,有什么建议吗?

    【讨论】:

    • 为什么在每个使用它的元素中都包含 bootstrap 的 css 并不容易?大量使用 /deep/ 的 CSS 破坏了 Polymer 提供的样式封装。开始有点棘手,但总体上更好。相反,我认为最好有适当的引导程序元素的 Web 组件实现。
    • 在这种情况下,bootstrap 的 css 将被加载多次而不是一次。因此,如果所有自定义元素都应该具有相同的样式,则无需为每个自定义元素加载相同的 css。否则,css 应该单独加载,没有 bootstrap 的 less 不支持的 hack /deep/。从 ShadowDOM 的设计来看,css 不应该支持 style 的全局作用域,但是当时我没有什么可以测试没有聚合物。
    • 包含 Bootstrap 的 CSS(在每个自定义元素中)有效,但违反了 DRY 原则。不幸的是,选项似乎是:a)使用 /deep/ 并修改引导程序的样式或 b)在每个元素声明中包含 CSS。不确定,是否有其他方法可以解决此问题。
    • @Rahul,是的,因为在每个元素的声明中包含 css 违反了 DRY 原则,甚至聚合物在 layout.html 中包含 /deep/ css。所以我认为最好有一个/deep/ 版本的引导程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多