详细介绍:Streamlit:CSS——从基础到实战美化应用

news/2025/10/20 13:18:43/文章来源:https://www.cnblogs.com/wzzkaifa/p/19152422

文章目录

  • 一、前言
  • 二、CSS 是什么
  • 三、Streamlit 中 CSS 的 3 种核心用法
    • 方法 1:用st.markdown()嵌入 CSS(兼容所有版本)
    • 方法 2:用st.html()嵌入 CSS(Streamlit 1.10 + 版本)
    • 方法 3:外部 CSS 文件(适合复杂样式)
  • 四、实例效果展示:美化销售数据应用

一、前言

在上一篇博客中,我们已经学会用 Streamlit 快速搭建数据应用:从st.title()设置标题st.dataframe()展示数据,到st.button()实现交互,短短几行代码就能跑通核心功能。但实际项目中,默认的 “灰白底色、简单按钮、左对齐标题” 往往不够美观

比如企业应用需要匹配品牌色,个人项目想突出重点数据,这时候CSS(层叠样式表)就成了关键工具:它能突破 Streamlit 默认样式限制,自定义组件外观、布局甚至交互效果,让应用从 “能用” 升级为 “好用又好看”。

二、CSS 是什么

先明确基础概念:CSS 本身是用于描述网页元素样式的语言(如颜色、字体、间距),而在 Streamlit 中,CSS 的核心作用是 “修改 Streamlit 生成的网页组件样式”—— 因为 Streamlit 本质是将 Python 代码转化为网页,其组件(按钮、表格、标题等)都会对应网页中的 HTML 标签和类名(如按钮对应标签,类名为stButton),我们通过 CSS 选择器定位这些组件,再定义样式规则即可实现自定义。

简单说:Streamlit 负责 “搭骨架”(功能),CSS 负责 “穿衣服”(美化)。

三、Streamlit 中 CSS 的 3 种核心用法

Streamlit 没有专门的 “CSS 接口”,但提供了两种嵌入 CSS 的常用方式,结合基础选择器就能满足大部分需求。以下是实操方法(附代码示例):

方法 1:用st.markdown()嵌入 CSS(兼容所有版本)

Streamlit 的st.markdown()支持渲染 HTML,只需添加unsafe_allow_html=True参数,就能嵌入

import streamlit as st
# 嵌入CSS:用<style>标签包裹,通过类名定位Streamlit组件st.markdown("""<style>/* 1. 自定义标题样式(定位<h1>标签) */h1 {color: #2E86AB; /* 品牌蓝色 */text-align: center; /* 居中对齐 */font-family: '微软雅黑', sans-serif; /* 字体 */margin-bottom: 30px; /* 底部间距 */}/* 2. 自定义按钮样式(定位Streamlit按钮类名.stButton) */.stButton > button {background-color: #A23B72; /* 按钮底色:粉色 */color: white; /* 文字白色 */border: none; /* 取消边框 */border-radius: 8px; /* 圆角 */padding: 10px 20px; /* 内边距:上下10px,左右20px */font-size: 16px; /* 字体大小 */}/* 3. 按钮hover效果(鼠标悬浮时) */.stButton > button:hover {background-color: #F18F01; /* 底色变橙色 */transform: scale(1.05); /* 轻微放大(1.05倍) */transition: all 0.3s ease; /* 过渡动画:0.3秒生效 */}</style>""", unsafe_allow_html=True)# 测试样式:标题和按钮st.title("这是CSS美化后的标题")st.button("点击测试美化按钮")

效果如下:
在这里插入图片描述

关键说明:
需用 style 标签包裹 CSS 代码,且必须加unsafe_allow_html=True(Streamlit 默认禁止 HTML,开启后需确保 CSS 来源安全);
Streamlit 组件的类名可通过 “浏览器检查” 获取(右键组件→“检查”,查看 HTML 标签的class属性)。具体图示方法如下:

在这里插入图片描述

方法 2:用st.html()嵌入 CSS(Streamlit 1.10 + 版本)

Streamlit 1.10 版本后新增了st.html()组件,专门用于渲染 HTML/CSS,无需写unsafe_allow_html=True,代码更简洁。
示例:修改数据表格样式

import streamlit as st
import pandas as pd
import numpy as np
# 用st.html()嵌入CSS:更简洁,无需额外参数
st.html("""
<style>/* 1. 自定义表格容器样式(定位.stDataFrame) */.stDataFrame {width: 90% !important; /* 表格宽度90%(!important强制覆盖默认) */margin: 20px auto; /* 上下间距20px,左右自动(实现居中) */}/* 2. 表格表头样式(定位表头类名) */[data-testid="stDataFrameHeader"] {background-color: #2E86AB !important; /* 表头底色蓝色 */}[data-testid="stDataFrameHeader"] th {color: white !important; /* 表头文字白色 */font-weight: bold !important; /* 文字加粗 */}/* 3. 表格行hover效果(鼠标悬浮行) */[data-testid="stDataFrameRow"]:hover {background-color: #F8F9FA !important; /* 行底色变浅灰 */}
</style>
""")
# 生成测试数据并展示表格(测试样式)
data = pd.DataFrame({
"产品": ["手机", "电脑", "平板"],
"销量": np.random.randint(1000, 5000, 3),
"利润": np.random.randint(200, 1000, 3)
})
st.dataframe(data)

效果如下
在这里插入图片描述

方法 3:外部 CSS 文件(适合复杂样式)

如果 CSS 规则较多(如多个页面共用样式),可单独创建.css文件,再用st.markdown()读取并嵌入。
步骤:
创建style.css文件,写入样式:

/* style.css */
h3 { color: #F18F01; } /* 对应 st.subheader() */
h2 { color: #F18F01; } /* 对应 st.header() */
.stSelectbox { margin: 10px 0; }

在 Streamlit 代码中读取文件:

import streamlit as st
# 读取外部CSS文件
with open("style.css", "r") as f:
css = f.read()
# 嵌入CSS
st.markdown(f"<style>{css}</style>", unsafe_allow_html=True)
# 测试样式
st.subheader("这是二级标题(橙色)")
st.selectbox("下拉框(有上下间距)", ["选项1", "选项2"])

效果如下
在这里插入图片描述

四、实例效果展示:美化销售数据应用

下面用一个完整实例,帮助直观感受 CSS 的作用。

  1. 需求
    搭建一个 “销售数据展示应用”
    包含:居中标题、美化按钮(点击显示数据)、带样式的表格,突出品牌色(蓝色 + 粉色)。、

  2. 完整代码(含 CSS)

import streamlit as st
import pandas as pd
import numpy as np
# ---------------------- 1. 嵌入CSS样式 ----------------------
st.markdown("""
<style>/* 标题样式 */h1 {color: #2E86AB;text-align: center;font-family: '微软雅黑', sans-serif;margin: 20px 0 30px 0;}/* 按钮样式 */.stButton > button {background-color: #A23B72;color: white;border: none;border-radius: 8px;padding: 10px 25px;font-size: 16px;margin: 0 auto; /* 按钮居中 */display: block; /* 块级元素,支持margin:auto */}.stButton > button:hover {background-color: #F18F01;transform: scale(1.05);transition: all 0.3s ease;}/* 表格样式 */.stDataFrame {width: 90% !important;margin: 25px auto;border-radius: 8px; /* 表格圆角 */box-shadow: 0 2px 8px rgba(0,0,0,0.1); /* 轻微阴影 */}[data-testid="stDataFrameHeader"] {background-color: #2E86AB !important;border-top-left-radius: 8px !important;border-top-right-radius: 8px !important;}[data-testid="stDataFrameHeader"] th {color: white !important;font-size: 14px;padding: 12px !important;}[data-testid="stDataFrameRow"] td {padding: 10px !important;text-align: center;}[data-testid="stDataFrameRow"]:hover {background-color: #F8F9FA !important;}
</style>
""", unsafe_allow_html=True)
# ---------------------- 2. 应用功能逻辑 ----------------------
st.title("2024年1月销售数据展示")
# 按钮控制数据显示
if st.button("点击查看销售数据"):
# 生成模拟销售数据
dates = pd.date_range(start="2024-01-01", end="2024-01-10", freq="D")
sales_data = pd.DataFrame({
"日期": dates.strftime("%Y-%m-%d"),
"产品类别": np.random.choice(["电子产品", "服装", "食品", "家居"], size=10),
"销售额(元)": np.random.randint(1500, 6000, size=10),
"订单量": np.random.randint(15, 60, size=10)
})
# 展示表格(应用CSS样式)
st.dataframe(sales_data, use_container_width=False)

效果如下在这里插入图片描述

五、总结:Streamlit 中 CSS 的核心要点
核心价值:CSS 是 Streamlit 应用 “颜值提升” 的关键,解决默认样式单调问题,适配个性化需求(品牌色、重点突出、交互体验);
常用方法:
简单样式用st.markdown()(兼容所有版本)或st.html()(1.10 + 版本更简洁);
复杂样式用外部.css文件,便于维护和复用;
关键技巧:
通过 “浏览器检查” 获取 Streamlit 组件的类名(如stButton、stDataFrame),确保 CSS 选择器精准;
用!important强制覆盖 Streamlit 默认样式(如表格宽度);
适度添加过渡动画(如transition),提升交互体验但避免过度花哨;
注意事项:
unsafe_allow_html=True需谨慎使用,确保 CSS 代码安全(避免引入恶意脚本);
样式需适配不同屏幕(可添加响应式规则,如@media (max-width: 768px) { … })。
掌握 CSS 后,你可以进一步探索更复杂的美化:比如自定义侧边栏样式、添加数据卡片动画、实现暗黑模式等。下一篇博客我们可以聚焦 “Streamlit 自定义组件与 CSS 的深度结合”,如果你有具体的美化需求,也可以随时提出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlServer 事务复制的两个参数immediate_sync,allow_anonymous

SqlServer 事务复制的两个参数immediate_sync,allow_anonymousSqlServer的事务复制中,immediate_sync和allow_anonymous两个参数会影响到复制的后台行为和分发库(distribution)的数据保留方式,这两个参数单从名字…

OO之接口-DAO模式代码阅读及应用

1. StudenDaoListImpl.java 与 StudentDaoArrayImpl.java 有何不同?StudenDaoListImpl 使用 ArrayList 存储学生对象,可以动态扩容,无需指定初始大小。StudentDaoArrayImpl 使用固定长度的 Student[] 数组存储学生对…

个微协议,微信号二次开发/ipad协议

优势 我们是一家专业服务企业数字化微信管理服务的技术团队,服务于需求SCRM、机器人、营销系统、社群小助手等具有研发能力的企业,同时我们也接收因使用Xp方案、ipad方案、PC方案导致被批量封号的企业,我们合作伙伴目…

Win11设置默认打开全部右键菜单

前言Win11 的右键菜单默认是折叠起来,很多功能需要点击“显示更多选项”才能显示,非常不方便。 方法打开 CMD 运行下面命令,然后重启电脑即可。reg add HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c…

屏幕显示发白难题的硬件工程深度排查:架构兼容性边界分析

屏幕显示发白难题的硬件工程深度排查:架构兼容性边界分析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

发现概率

5.1.3 发现概率模型的求解 发现概率的核心特征是累积性与不可逆性: 单雷达需连续3个扫描周期(窗口大小 $w = 3$)探测成功才判定"发现",且一旦某时刻满足"发现"条件,后续所有时刻的发现状态需…

MySQL索引查看语句show index详解

一、概述 SHOW INDEX语句是MySQL中用于查看表索引信息的语句。它提供了有关表中索引的详细信息,包括索引名称、索引类型、关联的列等。 二、语法与概要描述 SHOW INDEX语句的语法如下: SHOW INDEX FROM table_name […

qzmoot 生活合集

qzmoot 生活合集欣赏穿蛋侠; 摸彭云; 跳缩小版《我是奶龙》。

yocto工程升级要点

需求 原有的工程是多年前基于yocto sumo开发,对应的linux kernel版本是4.14。 需求是要求linux kernel升级到5.10。 背景 工程由以下几部分组成,yocto sumo构建部分的代码,包括poky,bitbake等 目标平台支持多款第三…

微信机器人开发API!3步搞定微信聊天机器人

微信机器人开发API!3步搞定微信聊天机器人 WTAPI框架是一个能将个人微信各项功能提取成可供开发人员调用的一套私有API接口,比如微信的收发消息,发朋友圈,群聊,建群等等都是可以用API接口来做的。你可以用 微信机…

详细介绍:【Linux】Linux管道与进程池深度解析:从原理到实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

windows2019的域控服务器更新时间.251020

1 先找到合适的源 w32tm /stripchart /computer:ntp.aliyun.com #若是可以使用会显示如下图2 注册表配置确****保NTP客户端已启用:确认以下注册表路径的 E nabled 值为 1: HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo…

国内DOH解析速度测试(阿里 腾讯 360 Doh测速)

阿里 腾讯 360 Doh测速以前一直用阿里DOH,上个月开始明显感觉网页打开速度异常慢,怀疑是阿里DOH限速,验证过程如下: 测试工具:Python3.14 aiohttp matplotlib numpy dnspython 库 地理位置:阳江(距离省会偏远的落后城市…

WatchAlert 轻量级AI日志告警 - Docker安装部署

💎 WatchAlert 是什么? 🎯 专注可观测性与稳定性,为运维提效降本 WatchAlert 是一款专为云原生环境设计 的轻量级监控告警引擎,聚焦于可观测性(Metrics、Logs、Traces)与系统稳定性保障,提供从采集、分析到告…

2022ICPC区域赛济南站

补题链接QOJ:The 2022 ICPC Asia Jinan Regional Contest - Dashboard - Contest - QOJ.ac K. Stack Sort 思路:考虑 a 需要比 a+1 先出栈,所以如果读到 a,发现 a+1 还没被记录则需要多建一个栈。 void solve() {i…

java代码和c++代码相互调用的技术方案

java代码和c++代码相互调用的技术方案通过JNI桥接方式

详细介绍:MyBatis动态sql

详细介绍:MyBatis动态sql2025-10-20 12:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

计算机毕业设计PySpark+Hadoop+Hive+LSTM模型美团大众点评分析+评分预测 美食推荐环境(源码+论文+PPT+讲解视频)

计算机毕业设计PySpark+Hadoop+Hive+LSTM模型美团大众点评分析+评分预测 美食推荐环境(源码+论文+PPT+讲解视频)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

对话智能体泛化研究在线挑战启动

某中心推出DialoGLUE对话AI挑战赛,旨在推动任务型对话系统泛化能力研究。该挑战提供标准化数据集和基准模型,涵盖意图识别、槽位填充等四大任务,支持全数据与少样本两种评估模式。某中心启动在线挑战赛推动对话智能…

2025.10.20

t1 Baekjoon 21527 给定 \(n\times n\) 矩阵 \(a\),对于 \((i,j)\) 求 \((1,1)\) 到 \((n,n)\) 最短路径上与 \(a_{i,j}\) 相同数的个数的最大值。 唐氏症题。 每种 \(a\) 单独提出来,\(f_{i,j}\) 为 \((i,j)\) 的答…