ARTICLE DETAIL

资讯详情

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

Reflex 通用样式属性(Style and Layout Props)完全指南:用 Python snake_case 驱动全部 CSS 能力

Reflex 通用样式属性(Style and Layout Props)完全指南:用 Python snake_case 驱动全部 CSS 能力 Reflex 通用样式属性Style and Layout Props完全指南用 Python snake_case 驱动全部 CSS 能力【免费下载链接】reflex️ Web apps in pure Python 项目地址: https://gitcode.com/GitHub_Trending/re/reflexReflex纯 Python Web 框架允许开发者将任意 CSS 属性直接作为组件的 props 使用实现不离开 Python 代码即可完成全部界面样式定制。本文基于仓库 docs/styling/common-props.md 的完整属性清单结合 样式总览、响应式布局 与底层实现 style.py、单元测试 test_style.py系统讲解属性命名转换规则、常用属性速查表、三层样式体系与源码级原理。读完本文你将能够熟练使用 30 常用样式属性理解 snake_case 到 CSS 的映射机制并能在内联、组件级、全局级三个维度上灵活组合它们。核心机制任何 CSS 属性都是组件 prop在 Reflex 中组件可以接受任何 CSS 属性作为 prop 传入。也就是说你在传统前端中写在style...里的声明在 Reflex 里可以直接写成 Python 关键字参数import reflex as rx rx.box( Hello Reflex, height150px, # 等价于 height: 150px background_colorbrown, # 等价于 background-color: brown border_radius10px, )snake_case 命名规则CSS 属性名中的连字符hyphen无法直接作为 Python 标识符因此 Reflex 规定CSS 属性名中的连字符替换为下划线即可得到合法的 Python 参数名。例如 CSS 的z-index在 Reflex 中写作z_indexrx.box(Stacked, z_index5, positionabsolute, top0, left0)这一转换在编译期由format_style_key完成底层调用format.to_camel_case将下划线键名还原为 camelCase 形式后输出为 CSS 属性见 style.py。简写属性的自动展开除了一对一的命名转换Reflex 还内置了一张简写映射表STYLE_PROP_SHORTHAND_MAPPING见 style.py让你可以用更语义化的键名一次设置多个底层 CSS 属性Reflex 写法展开后的 CSS 属性padding_xpaddingInlineStart,paddingInlineEndpadding_ypaddingTop,paddingBottommargin_xmarginInlineStart,marginInlineEndmargin_ymarginTop,marginBottombgbackgroundbg_colorbackgroundColorfont_familyfontFamily,--default-font-family例如margin_y2rem会被展开为marginTop: 2rem与marginBottom: 2rem。这一行为在单元测试中有明确断言见 test_style.py{margin_y: 2rem}被正确转换为{marginTop: 2rem, marginBottom: 2rem}padding_x与padding_y的组合也通过测试验证test_style.py。常用样式属性速查表以下清单完整收录了 common-props.md 中列出的全部常用属性说明与示例值均继承自原文档按用途分类整理。每个属性都对应一份 CSS 参考说明可在 MDN 的对应属性页查阅完整语法示例值展示了合法取值形态。盒模型与尺寸属性作用示例值width设置元素宽度150px,20em,75%,autoheight设置元素高度150px,20em,75%,automax_width/min_width设置宽度上限/下限阻止 width 的实际值超过/低于该值150px,20em,75%max_height/min_height设置高度上限/下限阻止 height 的实际值超过/低于该值150px,7em,75%margin一次性设置四边外边距在元素周围创造额外空间1em,5% 0,10px 50px 20px,10px 50px 20px 0margin_x/margin_y沿 x 轴/y 轴设置外边距正值远离相邻元素负值靠近1em,10%,10pxmargin_top/margin_right/margin_bottom/margin_left分别设置上/右/下/左外边距1em,10%,10pxpadding一次性设置四边内边距在元素内部创造额外空间1em,10px 50px 30px 0,0,10px 50px 20pxpadding_x/padding_y沿 x 轴/y 轴创建元素内部空间1em,10%,10pxpadding_top/padding_right/padding_bottom/padding_left分别设置上/右/下/左内边距1em,10%,20pxborder边框简写同时设置border_width、border_style、border_colorsolid,dashed red,thick double #32a1ce,4mm ridge rgba(211, 220, 50, .6)border_top/border_bottom/border_right/border_left分别设置上/下/右/左边框同时设置对应方向的 width/style/colorsolid,dashed red,thick double #32a1ce,4mm ridge rgba(211, 220, 50, .6)border_color设置边框颜色每侧可用border_top_color、border_right_color、border_bottom_color、border_left_color单独设置red,red #32a1ce,red rgba(170, 50, 220, .6) green,red yellow green transparentborder_radius圆角边框单个半径产生圆形角两个半径产生椭圆形角30px,25% 10%,10% 30% 50% 70%,10% / 50%border_width设置边框宽度thick,1em,4px 1.25em,0 4px 8px 12pxbox_shadow为元素外框添加阴影多个效果用逗号分隔由相对元素的 X/Y 偏移、模糊与扩散半径及颜色描述10px 5px 5px red,60px -16px teal,12px 12px 2px 1px rgba(0, 0, 255, .2),3px 3px red, -1em 0 .4em olive布局与定位属性作用示例值display设置元素按块级还是行内盒处理以及其子元素使用的布局流式、网格或弹性block,inline,inline-block,flex,inline-flex,grid,inline-grid,flow-rootalign在 flex 布局中控制项目在交叉轴上的对齐在 grid 布局中控制项目在其网格区域内沿块轴的对齐等价于align_itemsstretch,center,start,end,flex-start,baselinejustify定义浏览器在 flex 容器主轴、grid 容器内联轴上的项目间/环绕空间分配等价于justify_contentstart,center,flex-start,space-between,space-around,space-evenly,stretchflex_grow设置 flex 增长因子决定弹性容器剩余空间分配到该项目主轴尺寸的比例1,2,3position设置元素在文档中的定位方式top、right、bottom、left决定定位元素的最终位置static,relative,absolute,fixed,stickytop/bottom/right/left设置定位元素positioned element的垂直/水平位置对非定位元素无效0,4em,10%,20pxz_index设置定位元素及其后代、flex/grid 项目的层叠顺序z-index 更大的重叠元素覆盖更小的auto,1,5,200背景与视觉属性作用示例值background一次性设置全部背景样式属性颜色、图像、原点、尺寸、重复方式等价于bggreen,radial-gradient(crimson, skyblue),no-repeat url(../lizard.png)background_color设置元素背景色brown,rgb(255, 255, 128),#7499eebackground_image在元素上设置一个或多个背景图像url(../lizard.png),linear-gradient(#e66465, #9198e5)backdrop_filter对元素背后的区域施加模糊、颜色偏移等图形效果url(commonfilters.svg#filter),blur(2px),hue-rotate(120deg),drop-shadow(4px 4px 10px blue)文本与排版属性作用示例值color设置元素文本的前景色rebeccapurple,rgb(255, 255, 128),#00a400text_align设置块级元素或表格单元格内联内容的水平对齐start,end,center,justify,left,righttext_wrap控制元素内文本的换行方式wrap,nowrap,balance,prettywhite_space设置元素内空白字符的处理方式normal,nowrap,pre,break-spacesword_break设置当文本即将溢出其内容盒时是否在任意位置断行normal,break-all,keep-all,break-word三层样式体系中的属性使用这些通用属性并不仅限于单个组件上它们可以在 Reflex 的三种样式层级中使用详见 样式总览。按优先级从高到低内联Inline作用于单个组件实例的 props组件级Component作用于特定类型组件的样式字典全局Global作用于所有组件的全局样式字典。全局与组件级样式全局样式在rx.App(style...)中定义其中的键可以是任意合法 CSS 属性名以 snake_case 书写也可以指向具体组件类型、CSS 类或 IDimport reflex as rx style { # 全局默认字体与字号一处定义处处生效。 font_family: Comic Sans MS, font_size: 16px, # 全局选中高亮色。 ::selection: { background_color: blue, }, # 全局 CSS 类样式。 .some-css-class: { text_decoration: underline, }, # 全局 CSS ID 样式。 #special-input: {width: 20vw}, # 针对具体组件类型的默认样式。 rx.text: { font_family: Comic Sans MS, }, rx.divider: { margin_bottom: 1em, margin_top: 0.5em, }, rx.heading: { font_weight: 500, }, } app rx.App(stylestyle)组件类型作为字典键时会在编译前被求值为对应的组件创建函数由evaluate_style_namespaces处理测试见 test_style.py确保{rx.text: {...}}这样的写法真正生效。内联样式与 style prop内联样式直接作为 props 传入组件子组件默认继承父组件内联样式除非被自身样式覆盖rx.box( rx.hstack( rx.button(Default Button), rx.button(Red Button, colorred), ), colorblue, )当需要跨组件复用一组样式时可以使用styleprop 传入字典多个字典按传入顺序合并后者覆盖前者text_style { color: green, font_family: Comic Sans MS, font_size: 1.2em, font_weight: bold, box_shadow: rgba(240, 46, 170, 0.4) 5px 5px, rgba(240, 46, 170, 0.3) 10px 10px, } style1 { color: green, font_family: Comic Sans MS, border_radius: 10px, background_color: rgb(107,99,246), } style2 { color: white, border: 5px solid #EE756A, padding: 10px, } rx.vstack( rx.text(Hello, styletext_style), rx.text(World, styletext_style), ) rx.box(Multiple Styles, style[style1, style2])注意style1与style2是按传入顺序应用的后传入的样式覆盖先传入的同名属性。属性值的动态化Var 与响应式通用样式属性不仅能接收字符串字面量还能接收rx.Var状态变量与响应式值列表。在编译期样式字典中的 Var 会携带其 imports/hooks 元数据VarData合并进最终产物实现见 style.py因此你可以这样写class StyleState(rx.State): color: str hotpink rx.el.div(colorStyleState.color) # 状态驱动的颜色响应式属性值任何样式属性都可以传入一个值列表列表中的每一项对应一个屏幕断点详见 响应式布局rx.text( Hello World, color[orange, red, purple, blue, green], )该列表在编译期会被展开为一条条media screen and (min-width: ...)媒体查询默认断点为0 / 30em / 48em / 62em / 80em这一行为由format_as_emotion实现见 style.py并在 test_style.py 中以color[#111, ..., #555]映射到 5 条媒体查询的断言验证。也可以使用rx.breakpoints按命名断点书写rx.text( Hello World, colorrx.breakpoints(initialorange, smpurple, lggreen), )伪类与嵌套样式通过_hover、:focus等下划线/冒号前缀键可以编写伪类样式它们会被转换为 emotion 的自引用选择器_hover→:hover见 style.pyrx.box( rx.text(Hover Me, _hover{color: red}), )test_style.py 验证了_hover{color: hotpink}与:hover{color: red}最终都会编译为{:hover: {color: ...}}且伪类样式同样支持响应式列表值test_style.py。使用注意事项类名与 ID 中的下划线Reflex 会自动将 snake_case 标识符转换为 camelCase 再应用样式。因此自定义 class 名与 ID 建议使用连字符或 camelCase避免被误转换若需为依赖下划线类名的第三方库提供样式应改用外部样式表参考 自定义样式表。样式值必须是字面量或 VarEventHandler、组件实例等对象不能作为样式值否则会在编译期抛出ReflexError提示 cannot be used as style values。test_style.py 覆盖了组件传入left_icon、background、_hover.content等位置的校验场景。全量 CSS 能力本文列出的属性是使用频率最高的子集任何其他 CSS 属性如flex_direction、gap、opacity等都同样可以直接作为 prop 使用命名规则一致连字符换下划线完整的语法定义可查阅 MDN 对应属性文档。小结Reflex 的通用样式属性体系把整个 CSS 语言以 Python 习惯的 snake_case 形式直接暴露给开发者通过format_style_key完成命名转换、通过STYLE_PROP_SHORTHAND_MAPPING展开padding_x/bg等简写、通过format_as_emotion将响应式列表与伪类编译为最终 CSS。配合全局/组件级/内联三层样式体系和styleprop 复用机制你可以完全在 Python 代码中构建出一致、响应式、可维护的界面主题无需编写任何独立 CSS 文件。【免费下载链接】reflex️ Web apps in pure Python 项目地址: https://gitcode.com/GitHub_Trending/re/reflex创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表