JGuang

边框流光

BorderBeam · Ant Design

交互预览
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

边框流光

为容器边框提供持续流动的装饰性高亮效果。

何时使用

  • 需要强化某个容器的视觉关注度,但又不希望引入业务状态语义时。
  • 适合登录面板、推荐卡片、AI 模块、重点 CTA 区域等场景。
  • 它是装饰性效果,不应替代焦点态、校验态或业务状态边框。

代码演示

  • 基础用法 · basic
  • 鼠标悬浮时显示 · hover
  • 多条流光 · count
  • 自定义容器 · custom-container
  • 渐变色 · customized-color
  • 动画时长 · duration
  • 尺寸 · size
  • 线宽 · line-width

API

通用属性参考:通用属性

BorderBeam

参数说明类型默认值版本全局配置
children装饰内容ReactNode-6.4.0×
color流光颜色配置,支持单色字符串或渐变停靠点数组。percent 使用 0 ~ 100 的输入区间,组件会在内部为尾部透明过渡预留空间string | { color: string; percent: number }[]-6.4.0×
count流光数量number16.6.0×
duration流光完成一圈动画的时间,单位秒number66.5.0×
lineWidth流光线宽,数字类型按像素处理number | string1px6.5.0×
outset流光层相对容器边缘的外扩距离,遇到裁剪容器时可设为 0number | string-6.4.0×
size流光可见段的尺寸,数字类型按像素处理number | string1006.5.0×

主题变量(Design Token)

类型、继承关系和原生令牌声明保持固定源码原文;默认值由原生主题计算,并可能受 ConfigProvider 覆盖。本表不伪造静态默认值。

原生 ComponentToken 未声明可直接提取的自有字段;共享令牌或继承关系以以下声明为准。

声明来源: vendor/components/border-beam/style/index.ts

import type { CSSObject } from '@ant-design/cssinjs';

import { Keyframes, unit } from '@ant-design/cssinjs';

import { genNoMotionRawStyle } from '../../style/motion';

import type { FullToken, GenerateStyle } from '../../theme/internal';

import { genStyleHooks } from '../../theme/internal';

import { genCssVar } from '../../theme/util/genStyleUtils';

import { DEFAULT_BORDER_BEAM_DURATION, MAX_BEAM_COLOR_STOP_PERCENT } from '../util';

export type ComponentToken = object;

interface BorderBeamToken extends FullToken<'BorderBeam'> {}

FAQ

开启减少动态效果后会怎样?

BorderBeam 会将流光视为装饰效果。当命中 prefers-reduced-motion: reduce 时,组件会隐藏 beam 效果。

color 中的 percent 表示什么?

percent 表示渐变停靠点的输入位置,取值范围为 0 ~ 100。组件会将这些停靠点映射到可见 beam 段内,并为尾部透明过渡保留空间,以保持流光尾迹连续可见。

size 的取值限制

流光由一个边长为 size 的方形渐变层生成。渐变层沿容器边框移动,遮罩只显示它与边框重叠的区域。size 设置的是渐变层边长,不按边框路径长度计算。

流光经过水平边框时,方形渐变层会向边框两侧各延伸约 size / 2。当 size 接近或超过遮罩覆盖层高度的两倍,它可能同时覆盖上下边框。流光经过垂直边框时,宽度方向同理。

使用时应让 size 明显小于遮罩覆盖层短边的两倍:size < 2 × min(width, height)。遮罩覆盖层通常与被装饰容器大小接近,outset 会改变其尺寸。圆角、lineWidth 和渐变透明区域也会影响重叠开始可见的位置。

为什么 BorderBeam 没有效果?

BorderBeam 需要通过 children 获取实际 DOM 节点,并将流光层插入到该节点中。请确保被包裹的内容是原生 DOM 元素,或是正确透传 ref 到 DOM 的 React 组件,否则组件无法定位真实容器,也就无法渲染流光效果。

流光层使用 position: absolute 定位,因此被索引到的 DOM 节点还需要提供定位上下文,通常可以为它设置 position: relative。BorderBeam 不会主动检测或修正子节点的定位样式。

为保证性能,children 是否可以插入以及其定位信息会在初始化时判断,后续不会持续监听子节点结构或定位样式变化。

如何让流光边框跟随容器圆角?

BorderBeam 会将流光层渲染为实际容器的子节点,并通过 border-radius: inherit 直接继承容器圆角。对于 Card 这类单容器子节点,流光边框会自动与容器圆角对齐;若子节点结构较复杂,请确保圆角设置在实际容器根节点上。

圆角通过 CSS 继承实时生效,无需在初始化时读取或重新测量。后续通过 className、响应式样式或 CSS 变量修改容器圆角时,流光层也会自动同步。

原生通用属性

Tips: 以下通用属性适用于 antd 大部分组件,不支持的组件会单独说明。

参数说明类型默认值
style自定义样式CSSProperties-
className自定义类名string-
rootClassName添加在组件最外层的 classNamestring-
autoFocus自动获取焦点,仅对表单类、链接、交互容器等可聚焦元素生效booleanfalse

安装并复现示例

npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

使用 ConfigProvider 和原生 App,并单独配置 dayjs 语言。每个示例在查看代码中列出完整源码文件和额外固定依赖。示例名称用于选择演示,不是组件通用属性。主题、语言与 SSR 初始化见资源安装指南。

原生类型参考

源码查看器包含未修改的原生实现和以下声明文件,继承类型仍位于原生包中。代码中的英文注释保留为源码参考。

  • vendor/components/border-beam/BorderBeam.tsx
  • vendor/components/border-beam/BorderBeamEffect.tsx
  • vendor/components/border-beam/style/index.ts
  • vendor/components/border-beam/util.ts

来源与许可

https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd

保留原生中英文正文与可执行示例;官网专用的嵌入章节和令牌表格在本地展开。Ant Design 使用 MIT 许可,另列依赖的许可证也需保留。上传预览禁止向外发起请求,不提供后端服务。