ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Bokeh DOM 元素样式化指南:Styles 内联样式与 Stylesheet 样式表体系详解

Bokeh DOM 元素样式化指南:Styles 内联样式与 Stylesheet 样式表体系详解 Bokeh DOM 元素样式化指南Styles 内联样式与 Stylesheet 样式表体系详解【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh本文围绕 Bokeh 官方用户指南中“Styling DOM elements”dom.rst章节展开系统讲解在 Bokeh 输出中为 DOM 元素注入 CSS 样式的两条路径直接配置Styles内联样式以及通过InlineStyleSheet、ImportedStyleSheet及其全局变体引入样式表。读完本文你将掌握如何为Div、Slider等 UI 组件精确设置 CSS 属性、如何在页面head中全局注入样式并理解 Bokeh 在 Python 模型层与 BokehJS 渲染层之间处理 CSS 的底层机制。概述Bokeh 中的 CSS 注入机制Bokeh 在渲染 DOM 组件如Div、Slider、各种面板与图标时提供了若干相互补充的 CSS 注入手段。官方指南将之归纳为两类内联样式inline style通过bokeh.models.css.Styles直接配置元素的style属性作用于单一 DOM 元素样式表stylesheet通过四种样式表模型将一段完整 CSS 规则或外部 CSS 文件引入输出可作用于页面中多个组件。从源码看这两条路径分别对应 Python 模型层 src/bokeh/models/css.py 与 BokehJS 渲染层 bokehjs/src/lib/models/dom/stylesheets.ts、bokehjs/src/lib/models/dom/styles.ts 中的同名类Python 端的模型定义与 JS 端的属性声明一一对应序列化后在浏览器端落地为真实的 CSS 行为。使用 Styles 配置内联样式Styles类是 Bokeh 对 CSS 声明块的类型化封装。它的作用是生成 DOM 元素的style属性内容即等效于 HTML 中的style...内联样式。官方指南给出了一个网格布局示例from bokeh.models.css import Styles style Styles( displaygrid, grid_template_columnsauto auto, column_gap10px, ) grid Div(stylestyle)属性集覆盖全量 CSS 属性的类型化声明Styles的核心设计是每个 CSS 属性对应一个可空的字符串属性。在 src/bokeh/models/css.py 中Styles定义了 300 多个属性从常见的display、width、height、margin、padding、border、background_color、color、font_size、opacity、position、z_index、cursor到 Flexbox 布局的flex_direction、flex_grow、justify_content、align_items再到 Grid 布局的grid_template_columns、grid_template_rows、grid_gap、grid_area等一应俱全还包括transform、transition、animation、box_shadow、clip_path等进阶属性。所有属性均为Nullable(String)类型即不传即为None不会出现在最终生成的样式字符串中传入的字符串值会原样写入样式因此可以填写任何合法的 CSS 值如10px、auto、black 1px dashed。这一设计在 BokehJS 侧 bokehjs/src/lib/models/dom/styles.ts 中得到了同样的声明保证了两端属性的一致性。注意由于Styles直接对应 CSS 的style属性它的优先级高于外部样式表规则除非样式表使用了!important适合对单个元素做精确控制。实战用 Styles 搭建一个可调大小的网格面板仓库中的 examples/basic/layouts/css_layouts.py 是Styles的完整落地示例它把四个小图用 Grid 布局组织在一个容器中并允许用户拖动调整容器大小from bokeh.models.dom import Div, Styles from bokeh.plotting import figure, show p0 figure(width200, height200) # ... p1, p2, p3 同样创建 ... style Styles( width800px, height600px, displaygrid, grid_template_columnsauto auto, gap10px, resizeboth, overflowscroll, ) grid Div(stylestyle) box lambda p: Div(styleStyles(borderblack 1px dashed), children[p]) grid.children [box(p0), box(p1), box(p2), box(p3)] show(grid)要点解读displaygrid配合grid_template_columnsauto auto将容器设为两列网格两个子项一行共两行gap10px设置网格项之间的间距在官方指南示例中写作column_gap10px二者作用一致gap同时作用于行与列resizeboth允许用户在浏览器中拖拽改变容器尺寸overflowscroll保证内容超出时出现滚动条每个子图再套一层带虚线边框的Div演示了Styles的组合嵌套用法。四种样式表模型选择正确的注入方式当需要把一条完整的 CSS 规则而非单个元素的属性应用到页面时Bokeh 提供了四个样式表模型它们都继承自抽象基类StyleSheet定义于 src/bokeh/models/css.py模型等效 HTML注入位置是否全局InlineStyleSheetstyle typetext/css${css}/style所在组件的 shadow root或页面head否ImportedStyleSheetlink relstylesheet href${url}所在组件的 shadow root或页面head否GlobalInlineStyleSheetstyle typetext/css${css}/style始终追加到head是GlobalImportedStyleSheetlink relstylesheet href${url}始终追加到head是官方指南特别强调全局变体只会向head追加一次因此同一个样式表模型可以在多个 UI 组件之间共享而不会产生重复的style或link标签这在大型仪表盘中能显著减少 DOM 冗余。InlineStyleSheet内联 CSS 规则InlineStyleSheet接受一个css字符串属性必填等效于在页面中嵌入style标签。官方指南的示例为from bokeh.models import InlineStyleSheet, Slider stylesheet InlineStyleSheet(css.bk-slider-title { background-color: lightgray; }) slider Slider(value10, start0, end100, step0.5, stylesheets[stylesheet])这里通过选择器.bk-slider-title精准命中了滑块组件内部的标题元素并为其设置浅灰色背景。css属性在 Python 端 src/bokeh/models/css.py 中被定义为Required(String)即创建时必须提供在 BokehJS 端 bokehjs/src/lib/models/dom/stylesheets.ts 中underlying()方法将其包装为浏览器原生CSSStyleSheet并通过to_vdom()/to_element()渲染为style元素。关于注入位置源码注释揭示了关键细节InlineStyleSheet的样式表会优先追加到父级 shadow root当它被用在一个组件内部时否则才追加到head。因此如果希望在组件上下文中也保持全局生效应使用GlobalInlineStyleSheet。ImportedStyleSheet引用外部 CSS 文件ImportedStyleSheet接受一个必填的url字符串属性等效于link relstylesheet href${url}用于加载外部托管的 CSS 文件from bokeh.models import ImportedStyleSheet, Div stylesheet ImportedStyleSheet(urlhttps://example.com/custom.css) div Div(textHello, stylesheets[stylesheet])在 BokehJS 实现 bokehjs/src/lib/models/dom/stylesheets.ts 中underlying()会构造原生import ${url}规则并replaceSync到CSSStyleSheet同时to_vdom()渲染出link relstylesheet href{url}。与InlineStyleSheet一样它的默认注入位置也是组件 shadow root 或head取决于使用上下文。全局变体注入head并去重GlobalInlineStyleSheet与GlobalImportedStyleSheet分别继承自上述两个类行为上的差异在于两点注入位置固定为head不受组件 shadow root 上下文影响全局去重——BokehJS 端 bokehjs/src/lib/models/dom/stylesheets.ts 通过缓存底层dom.StyleSheet实例_underlying字段保证同一个模型在多次使用时只创建、注入一次。这意味着可以把主题样式、字体声明等公共规则做成一个全局样式表模型在多个Div、Slider、Button的stylesheets列表中重复引用页面最终只出现一份样式定义。将样式表挂载到模型stylesheets 属性上述样式表模型通过各 UI 模型的stylesheets属性接受样式表对象列表接入渲染流程。该机制在 BokehJS 侧由DomView实现bokehjs/src/lib/core/dom_view.ts 定义stylesheets()钩子每个视图通过重写该方法把自身需要的样式表汇集起来例如对话框bokehjs/src/lib/models/ui/dialog.ts会叠加dialogs_css、icons_css与自身定位样式抽屉bokehjs/src/lib/models/ui/drawer.ts叠加icons_css与drawers_css图标组件bokehjs/src/lib/models/ui/icons/builtin_icon.ts同样如此这些样式表最终经过 bokehjs/src/lib/core/stylesheets.tsx 中的StyleSheetComposer与compose_stylesheet合并、序列化后进入 DOM。因此用户传入的stylesheets[...]与组件内置的样式表是叠加关系你提供的规则会与 Bokeh 默认样式一同生效可以利用 CSS 层叠规则覆盖默认样式。完整示例为滑块添加自定义样式将官方指南的示例补全为一个可独立运行的脚本from bokeh.io import show from bokeh.models import InlineStyleSheet, Slider stylesheet InlineStyleSheet(css .bk-slider-title { background-color: lightgray; padding: 4px; border-radius: 4px; } ) slider Slider( value10, start0, end100, step0.5, titleCustom slider, stylesheets[stylesheet], ) show(slider)运行后滑块标题区域将呈现浅灰背景、内边距与圆角而滑块其余部分保持 Bokeh 默认样式。若希望这条规则同时影响页面中其他组件的同名元素可改用GlobalInlineStyleSheet并复用同一个实例。仓库中还提供了大量实践范例可供参考例如examples/styling/accessible-style/accessible_style.py为开关、按钮、下拉框、滑块分别定义InlineStyleSheet演示多组件样式的组织方式examples/advanced/extensions/font-awesome/fontawesome_icon.ts在 BokehJS 扩展中直接使用InlineStyleSheet组合图标字体样式examples/interaction/tools/hover_tooltip_advanced.py在提示框组件中使用Styles配置布局。总结与选择建议Bokeh 的 DOM 样式化体系可以归纳为一个简单的决策矩阵只改单个元素的一个或几个属性→ 使用Styles如Div(styleStyles(...))需要按选择器应用一段 CSS 规则且作用域限于某个组件→ 使用InlineStyleSheet需要加载外部 CSS 文件作用域限于某个组件→ 使用ImportedStyleSheet规则需要在多个组件之间共享、全局生效并去重→ 使用GlobalInlineStyleSheet/GlobalImportedStyleSheet。从实现层面看Python 端 src/bokeh/models/css.py 定义了完整且类型化的模型层BokehJS 端 bokehjs/src/lib/models/dom/stylesheets.ts 与 bokehjs/src/lib/core/stylesheets.tsx 负责把模型转换为原生CSSStyleSheet、style或link元素并在视图层通过stylesheets()钩子与组件内置样式合并。理解这两层的对应关系就能在需要深度定制 Bokeh 应用外观时准确选择合适的 CSS 注入方式。【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表