1

大家好,

我尝试使用聚合物为 <option> 元素创建本机元素扩展。这个想法是,为选项制作更复杂的描述性文本,为可用性设计样式。

可用性问题:

这不是什么大事,而是我正在研究可用性的一个项目(服务端渲染)。特别是视觉更新。所以我找到了一些项目的选择,这些项目的选项显示它们的信息未对齐且不易阅读。

<option value="1">Magnesium 43,005344632 kg</option>
<option value="2">Magnesium 0,001234556 kg</option>
<option value="3">Magnesium 1037,012443111 kg</option>

实际项目有时会显示超过 10 个具有不同中间十进制数字的此类选项。

我的想法:

在 <iron-component-page> 的帮助下,我使用聚合物 cli 准备好的项目设置来开发我的实验组件,该项目旨在构建独立的 web 组件(因此结果在 < iframe > 内呈现)。

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

<!--
`special-option` is an extension for option elements.
Example:

    <select name="options">
      <option is="special-option" value="1">option 1</option>
      <option is="special-option" value="2">option 2</option>
      <option is="special-option" value="3">option 3</option>
    </select>


### Styling

Custom property | Description | Default
----------------|-------------|----------
`--special-option` | Mixin applied to special-option | `{}`
`--special-option-container` | Mixin applied to the container of values | `{}`
`--special-option-value-a` | Mixin applied to the first value | `{}`
`--special-option-value-b` | Mixin applied to the second value | `{}`
`--special-option-value-c` | Mixin applied to the third value | `{}`


@demo demo/index.html
-->
<dom-module id="special-option">
    <template>
    <style is="custom-style">
      :host {
        @apply(--special-option);
      }

      #container {
        @apply(--special-option-container);
      }

      span {
        @apply(--special-option-values);
      }

      .value-a {
        @apply(--special-option-value-a);
      }

      .value-b {
        @apply(--special-option-value-b);
      }

      .value-c {
        @apply(--special-option-value-c);
      }
    </style>

    <div id="container">
      <span class="value-a"> [[valueA]] </span>
      <span class="value-b"> [[valueB]] </span>
      <span class="value-c"> [[valueC]] </span>
    </div>

  </template>

    <script>
        window.addEventListener('WebComponentsReady', function(e) {
            // imports are loaded and elements have been registered
            console.log('Components are ready');
            Polymer({
                is: 'special-option',

                extends: 'option',

                properties: {
                    /**
                     * First value to be shown.
                     * @type {String}
                     */
                    valueA: {
                        type: String,
                        reflectToAttribute: true
                    },
                    /**
                     * Second value to be shown.
                     * @type {String}
                     */
                    valueB: {
                        type: String,
                        reflectToAttribute: true
                    },
                    /**
                     * Third value to be shown.
                     * @type {String}
                     */
                    valueC: {
                        type: String,
                        reflectToAttribute: true
                    },
                },

            });
        });
    </script>
</dom-module>

一个使用样式标记扩展原生 <option> 元素的 web 组件。开发人员的样式可以通过将自定义 CSS 属性重写为“样式 API”来实现。

<style is="custom-style" include="demo-pages-shared-styles">
  option[is="special-option"] {
     --special-option-container: { @apply(--layout-horizontal); direction: ltr; } ;
     --special-option-values: { @apply(--layout-flex); @apply(--layout-horizontal); min-height: 3vh; } ;
     --special-option-value-a: { direction: rtl; min-width: 25px; max-width: 25px; } ;
     --special-option-value-b: { direction: rtl; min-width: 150px; max-width: 150px; } ;
     --special-option-value-c: { margin-left: 1vw; } ;
  }
</style>

在 <demo-snippet> 里面

<select name="options">
  <option is="special-option"  value="1" value-a="Magnesium" value-b="43,005344632" value-c="kg">
  </option>
  <option is="special-option"  value="2" value-a="Magnesium" value-b="0,001234556" value-c="kg">
  </option>
  <option is="special-option"  value="3" value-a="Magnesium" value-b="1037,012443111" value-c="kg">
  </option>
</select>

结果应该是中间值-b 始终具有最小宽度,因此对齐长值。

我试图解决这个问题的镜头,围绕着我如何填充(webcomponents-lite.js 或完整的 polyfill)以及我如何为 iframe 和第一页(自动呈现的文档页面)配置 window.Polymer 对象。

到目前为止的结果

与 dom: 'shady' 配置一样

到目前为止,我成功地让原生 <select> 使用这些扩展按钮。所以生命周期正在工作并且选项标签被扩展。

但是,虽然它在 Firefox 上按预期工作,但它在 chrome 中不起作用(选项仍然有效,但样式不适用)。

当我使用 dom: 'shadow' 配置 window.polymer 配置对象时,

  • 铬报告:

    Failed to execute 'createShadowRoot' on 'Element': Shadow root cannot be created on a host which already hosts an user-agent shadow tree. at HTMLOptionElement._createLocalRoot (http://localhost:9001/components/special-option/bower_components/polymer/polymer-mini.html:2001:6)

感谢@Supersharp,我得到了新的见解:由于 Webcomponents V1 不允许创建多个影子根(选项本身已经有一个),所以选择真正的影子 dom 还不是正确的方法。

  • Firefox 仍然产生了相同的结果(显然是因为 polyfill 强制使用 shady dom)

先前的问题

我做错了什么,或者即使在填充时,每个浏览器中的选项标签都无法实现这一点?

但正如聚合物文档所建议的那样,我现在正在尝试开发一个 polyfill 平台(配置dom: 'shady')。

问题

我是对的,这是不可能的(还)(即使使用阴暗的 dom polyfill)?所以我必须创建一整套 <select> 或 <form> 自定义元素集?

4

0 回答 0