Spinner 忙碌动画

用于忙碌动画场景的 MoriUI 组件。

导入

import { Spinner } from 'moriui'

示例

概览

基础旋转加载图标。

正在处理支付…
¥100.00
<script setup lang="ts">
  import { Item, ItemContent, ItemMedia, ItemTitle, Spinner } from 'moriui'
</script>

<template>
  <div class="flex w-full max-w-xs flex-col gap-4">
    <div class="rounded-xl bg-muted p-4">
      <Item variant="muted">
        <ItemMedia>
          <Spinner role="status" aria-label="加载中" />
        </ItemMedia>
        <ItemContent>
          <ItemTitle class="line-clamp-1">
            正在处理支付…
          </ItemTitle>
        </ItemContent>
        <ItemContent class="flex-none justify-end">
          <span class="text-sm tabular-nums">¥100.00</span>
        </ItemContent>
      </Item>
    </div>
  </div>
</template>

尺寸

四种不同尺寸。

<script setup lang="ts">
  import { Spinner } from 'moriui'
</script>

<template>
  <div class="flex items-center gap-6">
    <Spinner size="xs" />
    <Spinner size="sm" />
    <Spinner size="default" />
    <Spinner size="lg" />
  </div>
</template>

按钮

按钮内的加载状态。

<script setup lang="ts">
  import { Button, Spinner } from 'moriui'
</script>

<template>
  <div class="flex flex-col items-center gap-4">
    <div class="flex gap-2">
      <Button disabled size="sm" variant="outline">
        <Spinner data-icon="inline-start" />加载中…
      </Button>
      <Button disabled size="sm" variant="secondary">
        <Spinner data-icon="inline-start" />请稍候
      </Button>
      <Button disabled size="sm">
        <Spinner data-icon="inline-start" />处理中
      </Button>
    </div>
  </div>
</template>

徽记

徽记内的加载状态。

同步中 更新中 处理中
<script setup lang="ts">
  import { Badge, Spinner } from 'moriui'
</script>

<template>
  <div class="flex items-center gap-4">
    <Badge>
      <Spinner data-icon="inline-start" />同步中
    </Badge>
    <Badge variant="secondary">
      <Spinner data-icon="inline-start" />更新中
    </Badge>
    <Badge variant="outline">
      <Spinner data-icon="inline-start" />处理中
    </Badge>
  </div>
</template>

输入组合

输入框旁的加载状态。

验证中…
<script setup lang="ts">
  import { ArrowUp } from '@lucide/vue'
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, Spinner } from 'moriui'
</script>

<template>
  <div class="flex w-full max-w-md flex-col gap-4">
    <InputGroup>
      <InputGroupInput placeholder="发送消息…" disabled />
      <InputGroupAddon align="inline-end">
        <Spinner />
      </InputGroupAddon>
    </InputGroup>
    <InputGroup>
      <InputGroupInput placeholder="正在验证…" disabled />
      <InputGroupAddon align="inline-end">
        <Spinner /> 验证中…
        <InputGroupButton class="ml-auto" variant="default">
          <ArrowUp />
          <span class="sr-only">发送</span>
        </InputGroupButton>
      </InputGroupAddon>
    </InputGroup>
  </div>
</template>

RTL

旋转图标在 RTL 页面中。

جاري معالجة الدفع…
١٠٠٫٠٠ دولار
<script setup lang="ts">
  import {
    DirectionProvider,
    Item,
    ItemContent,
    ItemMedia,
    ItemTitle,
    Spinner
  } from 'moriui'
</script>

<template>
  <DirectionProvider direction="rtl">
    <div class="flex w-full max-w-xs flex-col gap-4" dir="rtl">
      <div class="rounded-xl bg-muted p-4">
        <Item variant="muted" dir="rtl">
          <ItemMedia>
            <Spinner role="status" aria-label="جاري التحميل" />
          </ItemMedia>
          <ItemContent>
            <ItemTitle class="line-clamp-1">
              جاري معالجة الدفع…
            </ItemTitle>
          </ItemContent>
          <ItemContent class="flex-none justify-end">
            <span class="text-sm tabular-nums">١٠٠٫٠٠ دولار</span>
          </ItemContent>
        </Item>
      </div>
    </div>
  </DirectionProvider>
</template>

使用说明

尺寸

size 支持 xs、sm、default、lg,通过 CSS 变量控制旋转图标的大小。

RTL

Spinner 的旋转方向与书写方向无关。

变体

Spinner 的 size 支持 xs、sm、default、lg。

可访问性

Spinner 默认输出 role="status" 和 aria-label="Loading"。在按钮等具有自身语义的容器中使用时,应确保容器提供适当的加载状态描述。

API 参考

属性类型默认值说明
Spinner size'xs' | 'sm' | 'default' | 'lg''default'旋转图标的尺寸。
Spinner classHTMLAttributes["class"]undefined合并到旋转图标容器的调用方类。