微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vaadin ComboBox 将文本字段宽度设置为 0CSS 阴影 dom

如何解决Vaadin ComboBox 将文本字段宽度设置为 0CSS 阴影 dom

我使用 Vaadin ComboBox 创建了一个下拉菜单用户可以在其中设置一个状态,该状态将显示在网页的另一个元素中。所以我真的不需要 ComboBox 的文本字段部分(图像中的蓝线)。

This is how it looks like now. The blue line should disappear.

在浏览器中手动将宽度设置为 0 会得到完美的结果(没有可见的线条,没有可用于焦点的文本输入区域),但是我无法使用代码实现这一点。请帮帮我。

我使用了 this tutorial 中的示例(请参阅 vaadin-text-field-styles.css),它更改了我网页上的所有 ComboBox。当前状态如下所示:

//Java-code:
comboBox.addClassName("RemoveTextField");

HTML-stack

/* css-File */
:host([class="RemoveTextField"]) [part="input-field"] {
    width: 0px;
}

没有使用 CSS 规则,我猜问题是 .host-selector 没有像我想象的那样工作。由于我是 CSS 菜鸟,请教我如何为 shadow dom 之外的元素使用选择器。

解决方法

另一种解决方案见文末。

处理嵌套阴影根时,样式有点棘手。 input-field 部分在 vaadin-text-field 的影子根内部,它在 vaadin-combo-box 的影子根内部。因此,它无法从组合框中设置样式。

您可以为文本字段创建一些样式,例如 text-styles.css

[part="input-field"] {
    width: 0;
}

接下来,您可以通过将此注释添加到 Flow 视图来将其应用于所有文本字段:

@CssImport(value = "text-styles.css",themeFor = "vaadin-text-field")

现在所有输入字段的宽度都为零。为了让它仅应用于组合框中的文本字段,您可以在其上设置主题属性:

myComboBox.getElement().setAttribute("theme","my-combo");

然后您可以更新您的text-styles.css

:host([theme="my-combo"]) [part="input-field"] {
    width: 0;
}

那么这是如何工作的?

所有 Vaadin 网络组件都实现了一个 ThemableMixin,它可以做一些事情:

  1. 它使您能够使用 themeFor="..." 中的 @CssImport 将样式注入 Vaadin 组件的阴影根。
  2. 它将您在组件上设置的任何 theme 属性传播到 shadow root 内的任何子组件。

在浏览器开发者工具中,您将看到 theme 属性已传播到 vaadin-text-field,因此我们可以使用它来限制样式的范围。 仅传播主题属性,它不适用于类、ID 等。

A screenshot of the DOM with the theme attribute propagated from the combo box to the text field

如果您查看突出显示的 style 标签,您还会发现 text-styles.css 的内容已被注入到那里(尽管内容可能太长,devtools 无法显示) .

替代解决方案

组合框可能不是最好的组件。看看 MenuBarContextMenu

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。