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暗色主题的默认变量:

/* 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应用程序。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

138

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

7

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

6

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

122

2026.01.26

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 24.3万人学习

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

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