在 Vaadin 中,如何在 Label 中设置样式而不影响整个页面

In Vaadin how can I set a style within a Label and NOT have it affect the whole page

例如,我在 Label 中设置了以下 html 代码:

Label label = new Label();
label.setContentMode(ContentMode.HTML);
label.setValue("<style> * { font-size: 12px; font-family: Arial; } </style> hello world");

上述代码的问题在于它将整个页面设置为 Arial 而不仅仅是 Label。如果我使用 RichTextArea,那么它只会将样式设置为该组件,但无论出于何种原因,Label 中定义的任何 css 样式都会应用于整个页面...

仅供参考 - 如果您将 RichTextArea 设置为只读,您会遇到完全相同的问题...

而不是添加内联样式。使用挂起 Vaadin 组件的 addStyleName 方法。

例子

Java:

Label label = new Label();
label.addStyleName("my-custom-style");

CSS:

.my-custom-style {
    font-size: 12px:
    font-family: Arial;
}

包括自定义样式表。

  • @StyleSheet("my-style-sheet.css") 添加到 Class / UI
  • 的顶部
  • 在相同包结构下的资源文件夹中创建 CSS 文件。

编辑:

因为这是在生成的报告中使用的,您不能使用上述解决方案:

而不是像您那样使用样式标签。如果将文本包装在 span 标记中,则可以使用内联样式将其专门应用于该标签:

label.setValue("<span style=\"font-size: 12px; font-family: Arial;\">Your text here</span>");

注意:请注意使用方法。您正在向潜在的 HTML 注入敞开心扉,需要采取一些措施来防止这种情况发生。

通常,您不应该向 Vaadin 组件添加内联样式。您应该在主题或自定义 CSS 文件的 CSS 文件中添加样式定义,并且如 @Jay 所述。

如果你真的想使用内联样式定义,那么你必须为它使用一个CssLayout

https://vaadin.com/docs/v8/framework/layout/layout-csslayout.html

隔离 HTML 树中的某些元素并不是真正的 Vaadin 问题。在 HTML5 中解决它的一种方法是使用带有 srcdoc 属性的 iframe(或者 src="data:...")。

这是一个如何将它与 Vaadin8 一起使用的示例,但请注意:一旦您在 Label 中处理 HTML,它就是 您的 对 quote/encode 那里的一切负责 -- 特别是,既然你提到,所有内容都来自用户!

// run with `spring run --watch <file>.groovy`
@Grapes([
@Grab('com.vaadin:vaadin-spring-boot-starter:2.0.1'),
@Grab('com.vaadin:vaadin-server:8.1.6'),
@Grab('com.vaadin:vaadin-client-compiled:8.1.6'),
])

import com.vaadin.ui.*
import com.vaadin.ui.themes.*
import com.vaadin.shared.*
import com.vaadin.shared.ui.ContentMode


@com.vaadin.spring.annotation.SpringUI
@com.vaadin.annotations.Theme("valo")
class MyUI extends UI {
        protected void init(com.vaadin.server.VaadinRequest request) {
        setContent(new VerticalLayout(
            new Label("<h1>Hello</h1><p>Lorem Ipsum</p>", ContentMode.HTML),
            new Label("""
                <iframe srcdoc="
                    <style type='text/css'>* { font-family: monospace; font-size: 36pt; background-color: green; }</style>
                    <h1>Test</h1>
                    <p>Lorem Ipsum</p>
                "></iframe>
            """, ContentMode.HTML),
            new Label("<h1>Hello</h1><p>Lorem Ipsum</p>", ContentMode.HTML),
        ))  
    }
}

我最终使用的是 BrowserFrame。唯一的问题是 BrowserFrame 的高度不能像带有 -1px 的标签那样动态调整大小。