Vaadin ComboBox 将文本字段宽度设置为 0(CSS 阴影 dom)
Vaadin ComboBox set text-field width to 0 (CSS shadow dom)
我使用 Vaadin ComboBox 创建了一个下拉菜单,用户可以在其中设置将在网页的另一个元素中显示的状态。所以我真的不需要 ComboBox 的文本字段部分(图中的蓝线)。
在浏览器中手动将宽度设置为 0 可以得到完美的结果(没有可见的行,没有可用于焦点的文本输入区域),但是我无法使用代码实现此目的。请帮助我。
我使用了 this tutorial 中的示例(参见 vaadin-text-field-styles.css),它更改了我网页上的所有组合框。当前状态如下所示:
//Java-code:
comboBox.addClassName("RemoveTextField");
/* CSS-File */
:host([class="RemoveTextField"]) [part="input-field"] {
width: 0px;
}
没有使用CSS规则,我猜问题是.host-selector没有像我想的那样工作。因为我是一个 CSS 菜鸟,请教我如何使用选择器选择阴影之外的元素 dom。
另一种解决方案见文末。
处理嵌套的影子根时,样式设置有点棘手。 input-field
部分在 vaadin-text-field
的影子根内,它在 vaadin-combo-box
的影子根内。因此,无法从组合框中设置样式。
您可以为文本字段创建一些样式,例如 text-styles.css
:
[part="input-field"] {
width: 0;
}
接下来,您可以通过将此注释添加到流视图来将其应用于所有文本字段:
@CssImport(value = "text-styles.css", themeFor = "vaadin-text-field")
现在您所有的输入字段都为零宽度。为了让它只应用于组合框中的文本字段,您可以在其上设置 theme 属性:
myComboBox.getElement().setAttribute("theme", "my-combo");
然后你可以更新你的 text-styles.css
:
:host([theme="my-combo"]) [part="input-field"] {
width: 0;
}
那么这是如何工作的?
所有 Vaadin Web 组件都实现了一个 ThemableMixin
,它可以做几件事:
- 它使您能够在
@CssImport
中使用 themeFor="..."
将样式注入到 Vaadin 组件的影子根中。
- 它将您在组件上设置的任何
theme
属性传播到影子根内的任何子组件。
在浏览器开发人员工具中,您会看到 theme
属性已传播到 vaadin-text-field
,因此我们可以使用它来限制样式的范围。 仅传播主题属性,不适用于类、ids 等
如果你查看突出显示的 style
标签,你还会发现 text-styles.css
的内容已被注入那里(尽管内容可能太长,开发者工具无法查看)显示)。
备选方案
组合框可能不是最好的组件。看看 MenuBar or ContextMenu.
我使用 Vaadin ComboBox 创建了一个下拉菜单,用户可以在其中设置将在网页的另一个元素中显示的状态。所以我真的不需要 ComboBox 的文本字段部分(图中的蓝线)。
在浏览器中手动将宽度设置为 0 可以得到完美的结果(没有可见的行,没有可用于焦点的文本输入区域),但是我无法使用代码实现此目的。请帮助我。
我使用了 this tutorial 中的示例(参见 vaadin-text-field-styles.css),它更改了我网页上的所有组合框。当前状态如下所示:
//Java-code:
comboBox.addClassName("RemoveTextField");
/* CSS-File */
:host([class="RemoveTextField"]) [part="input-field"] {
width: 0px;
}
没有使用CSS规则,我猜问题是.host-selector没有像我想的那样工作。因为我是一个 CSS 菜鸟,请教我如何使用选择器选择阴影之外的元素 dom。
另一种解决方案见文末。
处理嵌套的影子根时,样式设置有点棘手。 input-field
部分在 vaadin-text-field
的影子根内,它在 vaadin-combo-box
的影子根内。因此,无法从组合框中设置样式。
您可以为文本字段创建一些样式,例如 text-styles.css
:
[part="input-field"] {
width: 0;
}
接下来,您可以通过将此注释添加到流视图来将其应用于所有文本字段:
@CssImport(value = "text-styles.css", themeFor = "vaadin-text-field")
现在您所有的输入字段都为零宽度。为了让它只应用于组合框中的文本字段,您可以在其上设置 theme 属性:
myComboBox.getElement().setAttribute("theme", "my-combo");
然后你可以更新你的 text-styles.css
:
:host([theme="my-combo"]) [part="input-field"] {
width: 0;
}
那么这是如何工作的?
所有 Vaadin Web 组件都实现了一个 ThemableMixin
,它可以做几件事:
- 它使您能够在
@CssImport
中使用themeFor="..."
将样式注入到 Vaadin 组件的影子根中。 - 它将您在组件上设置的任何
theme
属性传播到影子根内的任何子组件。
在浏览器开发人员工具中,您会看到 theme
属性已传播到 vaadin-text-field
,因此我们可以使用它来限制样式的范围。 仅传播主题属性,不适用于类、ids 等
如果你查看突出显示的 style
标签,你还会发现 text-styles.css
的内容已被注入那里(尽管内容可能太长,开发者工具无法查看)显示)。
备选方案
组合框可能不是最好的组件。看看 MenuBar or ContextMenu.