标签指示器动画(滑动指示条 + 内容淡入切换)
标签指示器动画组件:渐变指示条平滑滑动到目标标签并自适应宽度,内容面板淡入上移切换,支持窗口缩放重算,零依赖自研实现。
效果演示(真实可交互)
点击任意标签:渐变指示条从当前位置平滑滑向目标标签,并自动适配目标宽度;下方内容面板同步淡入并轻微上移,切换过程连贯跟手。标签栏是等宽布局,四个面板各含一个标题与一段说明文字。窗口缩放时指示条会自动重新定位,不会错位。
🏠 首页
这里是首页面板,展示站点最新动态与精选组件。
🧩 组件
这里是组件面板,涵盖 9 大分类共 138 个自研组件。
📖 文档
这里是文档面板,包含生成规范、参数说明与常见问题。
💡 关于
这里是关于面板,介绍粤喵组件站的定位与开源计划。
点击标签:指示条平滑滑动到目标标签,内容面板淡入切换
完整代码
HTML(标签按钮 + 独立指示条元素 + 面板组):
<div class="tia-tabs">
<button class="tia-tab active">首页</button>
<button class="tia-tab">组件</button>
<span class="tia-indicator"></span> <!-- 滑动指示条 -->
</div>
<div class="tia-panels">
<div class="tia-panel active">面板内容</div>
<div class="tia-panel">面板内容</div>
</div>
CSS(指示条绝对定位,位移与宽度都走过渡):
.tia-tabs { position: relative; display: flex; padding: 4px; }
.tia-indicator {
position: absolute; top: 4px; bottom: 4px; left: 4px;
border-radius: 9px; background: linear-gradient(135deg, #6c8cff, #8a5cff);
transition: transform .35s cubic-bezier(.4, .1, .2, 1),
width .35s cubic-bezier(.4, .1, .2, 1); /* 位移与宽度同步过渡 */
}
JS(测量目标标签偏移与宽度写入指示条,约 15 行):
const tabs = document.querySelectorAll('.tia-tab');
const panels = document.querySelectorAll('.tia-panel');
const indicator = document.querySelector('.tia-indicator');
const move = (tab) => {
indicator.style.width = tab.offsetWidth + 'px';
indicator.style.transform = `translateX(${tab.offsetLeft - 4}px)`;
};
tabs.forEach((tab) => {
tab.addEventListener('click', () => {
tabs.forEach((t) => t.classList.remove('active'));
tab.classList.add('active');
move(tab);
panels.forEach((p, i) => p.classList.toggle('active', i === [...tabs].indexOf(tab)));
});
});
move(document.querySelector('.tia-tab.active'));
window.addEventListener('resize', () => move(document.querySelector('.tia-tab.active')));
原理:指示条不是「动画到下一个位置」,而是每次点击后直接把目标 transform 与宽度写进样式,浏览器用 transition 平滑过渡。JS 的职责只有一个——用 offsetLeft 与 offsetWidth 读出目标标签相对标签栏的位置尺寸(容器 padding 4px 需在位移里扣除)。面板切换用透明度与 translateY 过渡实现淡入上移,比 display 切换多一层过渡的余地。
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 滑动时长 | transition 的 0.35s | 200-500ms,配合标准曲线 |
| 位移补偿 | offsetLeft - 4 | 对应容器 padding,改 padding 需同步 |
| 指示条高度 | top / bottom 值 | 控制指示条粗细 |
| 内容淡入 | .tia-panel 的过渡 | 可改位移方向为左右滑动 |
| 激活判定 | .tia-tab.active | 决定初始位置与缩放重算 |
兼容性与性能
- 仅依赖 transform 过渡与 offsetLeft 测量,Chrome 36+ / Safari 9+ / Firefox 49+ / Edge 全支持
- 动画只走 transform 合成路径,GPU 加速;指示条为单一元素,无多余节点
- resize 监听只在窗口缩放时执行一次测量,常驻开销为零
- 已加 role 语义与 aria 标注,配合原生 button 键盘可完整操作;如需箭头键切换,可在键盘事件里复用 move 逻辑
常见问题
Q: 指示条初始位置不在第一个标签上? 检查页面加载后是否执行了一次 move(激活标签)。JS 在绑定事件后立即调用一次,若标签内容异步渲染(如图片撑高),需在内容就绪后重新调用。
Q: 标签宽度变化时指示条没跟上? 指示条宽度在点击时写入,若标签文字或字号动态变化,需要在这些变化发生后重新调用 move。resize 监听只覆盖窗口缩放,不覆盖内容变化。
Q: 想要下划线式指示条而不是胶囊? 把指示条的 top 改为 auto、bottom 改为 0、高度设为 3px、圆角设为 2px,背景换成主题色即可;位移逻辑完全不变。
Q: 能商用吗? 可以。本组件为粤喵自研原创实现,免费商用无需署名。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。