ARTICLE DETAIL

资讯详情

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

rsuite ButtonGroup 分隔按钮:divided 属性的用法、实现原理与样式机制

rsuite ButtonGroup 分隔按钮:divided 属性的用法、实现原理与样式机制 前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载在 rsuite 中ButtonGroup的divided属性用于在按钮组内的相邻按钮之间绘制分隔线从而把一组功能相关的按钮在视觉上区分为独立的个体。本文以官方文档中“分隔按钮”示例为主线完整还原该示例的运行方式并深入源码剖析divided是如何从组件属性一路传导到data-dividedDOM 属性、再到 SCSS 边框规则生效的帮助你在实际业务中正确、可控地使用分隔按钮组。示例效果与完整代码分隔按钮的典型场景是一组操作按钮在逻辑上同属一个按钮组共享圆角、尺寸、禁用状态但在视觉上需要彼此独立例如文本编辑工具栏中的“加粗 / 斜体 / 下划线”三个按钮。官方示例对应仓库中 divided 示例片段展示了水平与垂直两种布局、default与primary两种外观组合import { Button, ButtonGroup, VStack, HStack } from rsuite; const ButtonGroupWithAppearance ({ appearance, vertical }) ( ButtonGroup divided vertical{vertical} Button appearance{appearance}Bold/Button Button appearance{appearance}Italic/Button Button appearance{appearance}Underline/Button /ButtonGroup ); const App () ( VStack spacing{12} HStack ButtonGroupWithAppearance appearancedefault / ButtonGroupWithAppearance appearanceprimary / /HStack HStack ButtonGroupWithAppearance appearancedefault vertical / ButtonGroupWithAppearance appearanceprimary vertical / /HStack /VStack ); ReactDOM.render(App /, document.getElementById(root));这个示例包含四个按钮组实例第一行default与primary两种外观的水平分隔按钮组第二行同样两种外观的垂直分隔按钮组通过vertical属性开启。divided与vertical相互正交开启vertical后分隔线的方向会从“按钮之间的竖线”自动切换为“按钮之间的横线”这一行为完全由样式层保证无需你额外处理。组件属性divided 如何落到 DOM 上divided是ButtonGroup的一个可选布尔属性在 ButtonGroup 组件定义 中声明为/** Add dividing lines between buttons */ divided?: boolean;。组件渲染时并不直接绘制任何线条而是把它作为数据属性透传到根元素上// src/ButtonGroup/ButtonGroup.tsx return ( ButtonGroupContext.Provider value{contextValue} Box as{as} {...rest} role{role} ref{ref} className{classes} >// src/ButtonGroup/test/ButtonGroup.spec.tsx it(Should add divided variation, () { render(ButtonGroup divided /); expect(screen.getByRole(group)).to.have.attr(data-divided, true); });参见 ButtonGroup 单元测试。此外该测试文件还验证了size、vertical、block、justified、组级disabled等属性的透传行为说明divided与其他布局属性一样都是“数据属性 样式消费”的模式。样式实现分隔线的真正来源分隔线样式全部定义在 ButtonGroup 样式文件 中按水平/垂直两种布局分别实现。水平布局默认给除最后一个按钮外的每个按钮加 1px 的右边框作为其与下一个按钮之间的分隔线// src/ButtonGroup/styles/index.scss .rs-btn-group:not([data-verticaltrue]) { [data-dividedtrue] .rs-btn { :not(:last-child) { border-right-width: 1px; } } }垂直布局同样的逻辑旋转 90 度改用下边框// src/ButtonGroup/styles/index.scss .rs-btn-group[data-verticaltrue] { [data-dividedtrue] .rs-btn { :not(:last-child) { border-bottom-width: 1px; } } }这与示例中“水平组出现竖分隔线、垂直组出现横分隔线”的现象完全吻合。需要注意几点实现细节边框宽度而非边框颜色规则只调整border-*-width。普通按钮default/primary外观本来就有边框因此divided实际上是把相邻按钮之间被“挤掉”的边框重新恢复出来。普通非 divided水平按钮组则是通过float: inline-start与首尾之外的按钮去掉左右圆角来“贴合”在一起的见 样式文件中的水平布局规则。ghost 外观的边框折叠对于appearanceghost的相邻按钮样式表通过-1px的外边距让两条 1px 边框重叠成一条水平用margin-inline-start: -1px垂直用margin-top: -1px。因此如果你用 ghost 按钮组合divided组分隔线同样保持 1px 粗。垂直布局下的圆角处理垂直组中除最后一个按钮外清除下圆角、除第一个按钮外清除上圆角见 样式文件保证整组呈现为一个连续的柱状块分隔线嵌在其内部。与 size、disabled 等组级状态的协同divided示例中每个按钮都显式写了appearance但size和disabled并不需要在每个按钮上重复声明。ButtonGroup通过 Context 向子按钮下发组级状态// src/ButtonGroup/ButtonGroup.tsx const contextValue useMemo(() ({ size, disabled }), [disabled, size]);子按钮在 Button 组件 中消费该 Context并在自身未显式指定时回退到组级值const buttonGroup useContext(ButtonGroupContext); // ... disabled buttonGroup?.disabled, size buttonGroup?.size || md,因此ButtonGroup divided sizelg会让组内所有按钮统一为lg尺寸——这一点由 样式测试 验证sizelg时按钮内边距为10px 14px单元测试 也逐一切换lg/md/sm/xs断言子按钮的data-size。组级disabled则会让所有子按钮同时带上data-disabledtrue与原生disabled属性见 测试用例。ButtonGroup完整 Props 参考divided只是按钮组的一组布局属性之一下表汇总官方文档给出的完整属性说明源自 ButtonGroup 文档中文页面与 组件接口定义 一致属性名称类型默认值描述blockboolean将按钮组显示为块级元素占据整个容器的宽度需配合vertical生效对应data-blockclassPrefixstring(btn-group)自定义 CSS 类前缀用于样式定制和主题适配disabledboolean禁用组内所有按钮dividedboolean在按钮组中显示分隔线本文主题justifiedboolean在水平布局中均匀分配按钮宽度等宽sizelg | md | sm | xs(md)为组内所有按钮设置统一尺寸verticalboolean采用垂直堆叠布局显示按钮组件根类名为rs-btn-group默认classPrefix为btn-group可通过 Storybook 故事 中的Size、Vertical、Block、Justified等场景对照观察各种布局形态。可访问性与使用建议从源码结构看ButtonGroup根节点默认渲染rolegroup见 组件源码源码注释中建议同时提供aria-label或aria-labelledby以便屏幕阅读器理解这组按钮的语义。divided是纯视觉属性它不改变键盘焦点顺序也不影响各按钮独立触发的行为分隔的每个按钮仍是独立可聚焦、可点击的button元素。若需要“外观整体、点击拆分”的分体式下拉按钮官方文档在“分体式按钮”一节提供了ButtonMenu的组合方案见 示例片段与divided的定位不同可按需选择。小结divided的使用成本极低——在ButtonGroup上加一个布尔属性即可——但其背后是 rsuite 组件库典型的“数据属性 属性选择器”样式机制组件把divided/vertical等状态写成data-*属性样式表按水平、垂直两套规则恢复相邻按钮间的 1px 边框ghost 外观则靠负边距折叠边框。理解这条链路后你可以放心地把divided与vertical、size、appearance、disabled任意组合并且清楚地知道视觉结果来自哪里、如何用classPrefix和自定义 CSS 覆盖它。赞分享前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载相关推荐Rsuite ButtonGroup 实战指南用 ButtonGroup 与 ButtonToolbar 构建一致、可控的按钮组布局Rsuite ButtonGroup 实战指南用 ButtonGroup 与 ButtonToolbar 构建一致、可控的按钮组布局 ButtonGroup前端UI组件Tachyons按钮设计基于原子类的多样化按钮样式实现Tachyons按钮设计基于原子类的多样化按钮样式实现 你是否还在为网页按钮设计耗费大量CSS代码是否因按钮状态变化导致样式冲突而头疼本文将展示如何使用T前端Rsuite ButtonGroup 外观定制详解appearance 的五种取值与>Rsuite ButtonGroup 外观定制详解appearance 的五种取值与 data appearance 实现原理 本文以 Rsuite 官方文档前端UI组件上一篇探索漫画艺术字体xkcd-font下一篇推荐文章Proton Mail Bridge与Import Export App——安全的邮件管理新选择创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表