局部加载时怎么只让按钮变loading而不影响整个页面?
我在做一个表单提交功能,想在点击“保存”按钮后只让这个按钮变成 loading 状态(比如加个 spinner),但发现一加 loading 类,旁边的输入框也会跟着抖动或者换行,布局乱了。
我试过给按钮加 position: relative 和固定宽高,但效果不稳定。下面是我的按钮结构:
<button type="submit" class="btn btn-primary">
<span v-if="!loading">保存</span>
<span v-else>
<i class="spinner-border spinner-border-sm"></i> 处理中...
</span>
</button>
有没有办法让 loading 状态只影响按钮自身,不扰动周围元素?
最直接的解决办法:给按钮固定宽度或者最小宽度,让它无论什么状态都占一样大的地方。
你可以这样改:
给按钮加一个固定宽度,比如120px,同时设置white-space: nowrap防止换行:
或者更精细一点,只在loading状态时保持宽度:
如果你用的是Bootstrap的按钮,还可以直接用它的d-inline-block配合width: auto:
另一个思路是把spinner放在按钮内部用绝对定位,这样无论loading与否按钮尺寸都固定:
不过说实话,最简单的办法就是给按钮一个min-width,具体数值根据你“保存”两个字的宽度来定,保证loading状态的内容不会超过这个宽度就行。这样旁边输入框的位置就不会被顶飞了。