前端开发
在 React 项目里为卡片/按钮/输入框添加动画边框光束时…
适用于 React 18+ 项目中,为卡片、按钮、输入框或任意容器快速添加不阻塞交互的动画边框光束/发光效果。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 React 项目里为卡片/按钮/输入特定
解决思路
- 安装依赖:运行 `npm install border-beam`。
- 导入组件:`import { BorderBeam } from 'border-beam';`。
- 基本用法:用 `<BorderBeam>` 包裹内容元素,例如 `<BorderBeam><div style={{ padding: 32, borderRadius: 16, background: '#1d1d1d' }}>Your content here</div></BorderBeam>`;组件会自动检测第一个子元素的 `border-radius`,所有效果层使用 `pointer-events: none`,不会阻塞交互。
- 按尺寸预设选择:`size='md'` 用于卡片/面板的完整边框光晕(默认);`size='sm'` 用于图标按钮等小元素;`size='line'` 用于搜索栏/输入框的底部流动光效。
- 按颜色变体选择:`colorVariant='colorful'` 为彩虹光谱并动画色相(默认);`colorVariant='mono'` 为灰度且无色相动画;`colorVariant='ocean'` 为蓝紫色调;`colorVariant='sunset'` 为橙黄红色调;除 `mono` 外默认都会进行色相偏移循环。
- 按背景设置主题:`theme='dark'` 用于深色背景(默认);`theme='light'` 用于浅色背景;`theme='auto'` 检测系统 `prefers-color-scheme`。
- 控制强度:用 `strength={0.6}` 设置光束透明度,范围 0(不可见)到 1(全强度,默认),只影响光束层不影响子元素;用 `brightness={1.5}` 和 `saturation={1.4}` 设置发光亮度和饱和度倍率。
- 播放/暂停并处理回调:用状态控制 `active={active}`,并传入 `onActivate={() => ...}`、`onDeactivate={() => ...}`;示例中通过按钮切换 `setActive(a => !a)`,在淡入/淡出完成时触发回调。
- 自定义时长和色相范围:用 `duration={3.5}` 设置动画周期秒数(默认 `md` 为 1.96,`line` 为 2.4);用 `hueRange={60}` 设置色相旋转范围角度(默认 30);用 `staticColors={true}` 完全禁用色相偏移。
- 自定义圆角:如果自动检测失效(例如圆角由 CSS class 设置),显式传入 `borderRadius={24}`。
- 传递 HTML 属性:包装 `<div>` 会转发所有标准 `HTMLDivElement` 属性,例如 `className`、`style`、`data-testid`。
- 实现悬停激活光束:用 `useState` 记录 `hovered`,在子元素上绑定 `onMouseEnter`/`onMouseLeave` 设置状态,并将 `active={hovered}`、`strength={0.85}`、`colorVariant='ocean'` 传给 `BorderBeam`。
- 实现搜索栏底部光束:使用 `<BorderBeam size='line' colorVariant='sunset' theme='dark'>` 包裹 `<input type='text' ... />`。
- 实现浅色主题卡片:使用 `<BorderBeam theme='light' colorVariant='colorful' strength={0.8}>` 包裹浅色背景卡片。
- 处理减少动态效果:组件不会自动响应 `prefers-reduced-motion`,需在消费端自行处理;可用 `window.matchMedia('(prefers-reduced-motion: reduce)').matches` 或 `useReducedMotion` hook,并将 `active={!reduceMotion}` 传给 `BorderBeam`。
- 参考完整 props:`children`、`size`、`colorVariant`、`theme`、`strength`、`duration`、`active`、`borderRadius`、`brightness`、`saturation`、`hueRange`、`staticColors`、`className`、`style`、`onActivate`、`onDeactivate`;按前述类型、默认值和描述使用。
- 理解实现层以排查/定制:`BorderBeam` 渲染一个包装 `<div>`,包含三个效果层,全部 `pointer-events: none`、绝对定位、不影响布局或交互:`::after` 为光束描边(锥形渐变遮罩到边框边缘),`::before` 为内发光层,`[data-beam-bloom]` 为外部泛光/发光子 `<div>`;动画使用 CSS `@property` 实现 GPU 加速的色相循环。
- 排查光束不可见:确保子元素有可见的 `background` 和 `border-radius`;检查 `strength` 不为 `0`;确认 `active` 为 `true`。
- 排查圆角不匹配:如果圆角来自 CSS class 而不是内联样式,显式传入 `borderRadius` prop。
- 排查效果覆盖内容/阻止点击:所有层默认 `pointer-events: none`;如果仍发生,检查包装器中的 CSS 冲突。
- 排查浏览器动画不工作:需要 CSS `@property` 支持:Chrome 85+、Safari 15.4+、Firefox 128+;可查看 caniuse.com/@property。
- 处理 SSR/Next.js:组件使用 DOM API 检测 border-radius;在 Next.js App Router 中用 `'use client'` 包裹为客户端组件。
适用边界 · 注意事项
- 不适用于非 React 18+ 项目,或不支持 CSS `@property` 的旧浏览器(低于 Chrome 85、Safari 15.4、Firefox 128)。
- 不适用于无法安装/引入 `border-beam` npm 包,或要求零第三方依赖的场景。
- 若需要组件自动响应 `prefers-reduced-motion` 且不愿自行添加判断逻辑,不适用(该组件本身不自动处理)。