正确实现按钮加载态需三步:按钮加 position: relative 和 overflow: hidden;spinner-border 用 absolute 居中+em 尺寸+显式 animation;文字用 display: none + disabled 同步控制。
直接往按钮里加 spinner-border 类,90% 会错位、文字上跳、点击穿透——不是动画没生效,是布局没约束。
否则 spinner-border 作为绝对定位元素找不到参照,会溢出或偏移。Bootstrap 默认不设这俩属性,必须手动补上。
<button> 元素直接加 style="position: relative; overflow: hidden;",或写 CSS 规则:button.loading { position: relative; overflow: hidden; }
position: relative,按钮自己才是定位上下文overflow: hidden 不仅防溢出,还避免 spinner 边框在高清屏上渲染模糊时“露边”默认 spinner-border 是行内元素、宽高固定 2rem,和按钮动态高度完全脱节。硬塞进去只会拉高按钮、顶跑文字。
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
em:按钮是 btn-md 就设 width: 1.5em; height: 1.5em;;btn-sm 用 1.2em;别写死 px 或用 scale()
border-width:放大到 4em 时,border-width: 0.5rem 才不虚边只靠 visibility: hidden 或 opacity: 0,按钮宽度会突变,导致布局抖动;不设 disabled,键盘用户仍能回车触发。
<span>,加载时执行:spanEl.style.display = 'none'; buttonEl.disabled = true;
aria-hidden="true",否则读屏器重复读 “Loading”disabled、移除 spinner 节点、清空 aria-busy
写了 @keyframes spin 却不动?Bootstrap 的 .spinner-border 类压根没声明 animation,浏览器根本不会播。
.spinner-border.custom-spin { animation: spin 0.75s linear infinite; }
button .spinner-border.custom-spin 或加 !important(慎用)transform-origin: center 必须显式设,否则旋转中心偏移,尤其在小按钮里明显scale() 缩放整个 spinner 元素——会导致点击热区偏移、边框抗锯齿失真真正卡住人的从来不是怎么写动画,而是 disabled 没同步、文字节点没清理、spinner 尺寸没随按钮字号缩放——这三处漏掉任一,加载态就变成 UI bug。