0

0

Vaadin Lumo 暗色主题与自定义主题的集成与覆盖实践

花韻仙語

花韻仙語

发布时间:2025-10-13 09:15:00

|

349人浏览过

|

来源于php中文网

原创

Vaadin Lumo 暗色主题与自定义主题的集成与覆盖实践

本文详细介绍了如何在vaadin应用中将lumo暗色主题设置为基础,并通过自定义主题进行局部样式覆盖。通过在`@theme`注解中指定`variant="dark"`,并利用css选择器`[theme~="dark"]`在自定义主题的`styles.css`文件中精确修改lumo变量和组件样式,实现暗色主题的定制化,从而构建既符合lumo暗色风格又具有个性化设计的vaadin应用。

Vaadin主题机制概述

Vaadin框架提供了强大的主题定制能力,允许开发者通过Lumo主题快速构建美观的用户界面,并通过自定义主题进一步实现个性化设计。Lumo主题本身支持“亮色”(light)和“暗色”(dark)两种变体。在实际开发中,我们常常希望以Lumo暗色主题为基础,然后针对特定组件或全局变量进行微调,以满足项目的设计需求。

通常,Vaadin应用的主题通过在主视图类或UI类上使用@Theme注解来指定。例如,@Theme("myTheme")会指示Vaadin加载名为myTheme的自定义主题。然而,要将Lumo暗色主题作为基础并进行覆盖,仅仅指定自定义主题名称是不够的,还需要明确激活Lumo的暗色变体。

激活Lumo暗色主题变体

要将Lumo暗色主题作为应用程序的基础主题,最直接且推荐的方式是在@Theme注解中明确指定variant = "dark"。这将确保Vaadin加载Lumo暗色主题的默认样式。

以下是一个示例,展示如何在Vaadin应用程序中激活Lumo暗色主题,并同时指定一个自定义主题(例如app-theme)来承载我们的个性化样式:

import com.vaadin.flow.component.page.AppShellConfigurator;
import com.vaadin.flow.theme.Theme;
import com.vaadin.flow.theme.lumo.Lumo; // 导入Lumo主题类

@Theme(value = "app-theme", variant = Lumo.DARK) // 指定自定义主题并激活Lumo暗色变体
public class AppShell implements AppShellConfigurator {
    // 可以在这里添加其他AppShell配置
}

在上述代码中,@Theme(value = "app-theme", variant = Lumo.DARK)表示我们的应用程序将使用名为app-theme的自定义主题,并且该主题将基于Lumo的暗色变体。

自定义主题样式覆盖

激活Lumo暗色主题后,我们可以在app-theme主题内部的styles.css文件中进行样式覆盖。Vaadin的Lumo主题大量使用了CSS自定义属性(CSS Variables),这使得覆盖特定样式变得非常简单。

为了确保我们的自定义样式只在暗色主题变体下生效,我们需要使用CSS选择器[theme~="dark"]。这个选择器会匹配所有具有theme="dark"属性的元素,而Vaadin在激活Lumo暗色变体时,会在html>元素上添加theme="dark"属性。

假设我们的自定义主题位于frontend/themes/app-theme/目录下,我们可以在frontend/themes/app-theme/styles.css文件中添加以下内容来覆盖Lumo暗色主题的默认变量:

豆包手机助手
豆包手机助手

豆包推出的手机系统服务级AI助手

下载
/* frontend/themes/app-theme/styles.css */

/* 全局Lumo变量覆盖,仅在暗色主题下生效 */
[theme~="dark"] {
    /* 覆盖基础背景色 */
    --lumo-base-color: hsl(210, 10%, 15%); /* 比Lumo默认暗色更深的背景 */

    /* 覆盖主色调 */
    --lumo-primary-color: hsl(170, 80%, 40%); /* 改变默认的蓝色为主绿色 */
    --lumo-primary-color-50pct: hsla(170, 80%, 40%, 0.5);
    --lumo-primary-color-10pct: hsla(170, 80%, 40%, 0.1);

    /* 覆盖文本颜色 */
    --lumo-body-text-color: hsla(210, 100%, 95%, 0.9); /* 调整正文文本颜色 */
}

/* 针对特定组件的样式覆盖,例如Button */
vaadin-button[theme~="dark"] {
    /* 覆盖按钮的背景色 */
    background-color: var(--lumo-primary-color);
    /* 覆盖按钮的文本颜色 */
    color: var(--lumo-primary-contrast-color);
    /* 移除边框 */
    border: none;
}

/* 如果要覆盖所有按钮的默认样式,可以不使用[theme~="dark"],但那样会影响亮色主题 */
/* vaadin-button {
    border-radius: 8px;
} */

在上述示例中:

  • 我们通过[theme~="dark"]选择器,针对元素(或任何被标记为theme="dark"的元素)定义了新的Lumo CSS变量值。这会影响所有使用这些变量的Vaadin组件。
  • 我们还展示了如何针对特定的Vaadin组件(如vaadin-button)在暗色主题下进行样式覆盖。

复制Lumo暗色变量作为基础

如果希望对Lumo暗色主题进行大规模的自定义,并且需要确保所有Lumo变量的计算都从一个已知的基础开始,可以考虑将Lumo暗色主题的所有CSS变量定义复制到你的自定义主题的styles.css文件中。

原始Lumo暗色主题的变量定义通常如下所示(这部分内容已在问题描述中提供):

/* frontend/themes/app-theme/styles.css */
html[theme~="dark"] { /* 注意这里使用html[theme~="dark"]以确保在根元素生效 */
    /* Base (background) */
    --lumo-base-color: hsl(214, 35%, 21%);

    /* Tint */
    --lumo-tint-5pct: hsla(214, 65%, 85%, 0.06);
    /* ... 复制所有Lumo暗色变量定义 ... */

    /* Primary */
    --lumo-primary-color: hsl(214, 90%, 48%);
    --lumo-primary-color-50pct: hsla(214, 90%, 70%, 0.69);
    /* ... 复制所有Lumo暗色变量定义 ... */
}

/* 在此之后,你可以继续添加你自己的覆盖样式 */
vaadin-button[theme~="dark"] {
    background-color: var(--lumo-primary-color); /* 此时会使用你上面定义的--lumo-primary-color */
    /* ... */
}

注意事项:

  • 选择器: 确保将这些变量定义放在html[theme~="dark"]选择器内部,这样它们只在暗色主题激活时生效。
  • 维护: 复制所有Lumo变量可能会导致主题文件较大,且在Lumo主题更新时可能需要手动同步。因此,更推荐按需覆盖,只修改你真正需要改变的变量。
  • 浏览器开发者工具 在进行样式覆盖时,强烈建议使用浏览器开发者工具检查元素的计算样式。这有助于确认你的CSS规则是否正确应用,以及是否存在优先级问题。

总结

在Vaadin应用中,将Lumo暗色主题作为基础并进行自定义覆盖的关键在于:

  1. 在@Theme注解中明确指定variant = Lumo.DARK来激活Lumo暗色变体。
  2. 在自定义主题的styles.css文件中,使用[theme~="dark"]选择器来限定样式规则,确保它们只在暗色主题下生效。
  3. 通过覆盖Lumo的CSS自定义属性(--lumo-...变量)来实现全局或组件级的样式调整。
  4. 根据需求,可以选择性地覆盖特定变量,或复制整个Lumo暗色主题的变量定义作为起点进行修改。

通过遵循这些步骤,开发者可以灵活地构建出既能利用Lumo暗色主题的专业外观,又能充分展现项目独特品牌和设计风格的Vaadin应用程序。

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

522

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

262

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

753

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

539

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

757

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

604

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

560

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

390

2023.08.22

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 19.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号