Skip to content

Spinner 加载状态

使用 Spinner 组件可以展示一个 “加载中” 的工作状态

基础用法

示例代码
vue
<template>
  <epp-spinner />
</template>
<script lang="ts" setup>
</script>

尺寸

Spinner 组件的 size 可以接收通用的尺寸。

你也可以传入值来自定义尺寸。
vue
<template>
  <epp-spinner size="36px" />
</template>
<script lang="ts" setup>
</script>

颜色

通过color属性来传递色值。

Spinner通常与其他元素组件组合使用,所以不需要内置状态色,但你可以通过 var(--el-color-danger) 的方式使用状态颜色。
vue
<template>
  <el-space block size="large">
    <epp-spinner color="var(--el-color-danger)">
      <el-icon><Present /></el-icon>
    </epp-spinner>
    <epp-spinner color="#4a7fb1">
      <el-icon><ShoppingBag /></el-icon>
    </epp-spinner>
    <epp-spinner color="#b14a4a">
      <el-icon><Flag /></el-icon>
    </epp-spinner>
    <epp-spinner color="#b9bd47">
      <el-icon><GoodsFilled /></el-icon>
    </epp-spinner>
  </el-space>
</template>
<script lang="ts" setup>
import { Present, ShoppingBag, Flag, GoodsFilled } from '@element-plus/icons-vue';
</script>

自定义内容

Spinner 提供一个默认 slot 你可以插入任意的内容。

转圈
示例代码
vue
<template>
  <el-space block size="large">
    <epp-spinner color="var(--el-color-danger)" />
    <epp-spinner color="#999">
      <el-icon>
        <Present />
      </el-icon>
    </epp-spinner>
    <epp-spinner color="var(--el-color-danger)">转圈</epp-spinner>
    <epp-spinner animation="none" color="var(--el-color-primary)">
      <svg viewBox="0 0 105 105" xmlns="http://www.w3.org/2000/svg" fill="currentColor">
        <circle cx="12.5" cy="12.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="0s"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="12.5" cy="52.5" r="12.5" fill-opacity="0.5">
          <animate
            attributeName="fill-opacity"
            begin="100ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="52.5" cy="12.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="300ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="52.5" cy="52.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="600ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="92.5" cy="12.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="800ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="92.5" cy="52.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="400ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="12.5" cy="92.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="700ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="52.5" cy="92.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="500ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="92.5" cy="92.5" r="12.5">
          <animate
            attributeName="fill-opacity"
            begin="200ms"
            dur="1s"
            values="1;.2;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
      </svg>
    </epp-spinner>
    <epp-spinner animation="none" color="var(--el-color-success)">
      <svg viewBox="0 0 120 30" xmlns="http://www.w3.org/2000/svg" fill="currentColor">
        <circle cx="15" cy="15" r="15">
          <animate
            attributeName="r"
            from="15"
            to="15"
            begin="0s"
            dur="0.8s"
            values="15;9;15"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="fill-opacity"
            from="1"
            to="1"
            begin="0s"
            dur="0.8s"
            values="1;.5;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="60" cy="15" r="9" fill-opacity="0.3">
          <animate
            attributeName="r"
            from="9"
            to="9"
            begin="0s"
            dur="0.8s"
            values="9;15;9"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="fill-opacity"
            from="0.5"
            to="0.5"
            begin="0s"
            dur="0.8s"
            values=".5;1;.5"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle cx="105" cy="15" r="15">
          <animate
            attributeName="r"
            from="15"
            to="15"
            begin="0s"
            dur="0.8s"
            values="15;9;15"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="fill-opacity"
            from="1"
            to="1"
            begin="0s"
            dur="0.8s"
            values="1;.5;1"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
      </svg>
    </epp-spinner>
    <epp-spinner animation="none" color="var(--el-color-warning)">
      <svg viewBox="0 0 135 140" xmlns="http://www.w3.org/2000/svg" fill="currentColor">
        <rect y="10" width="15" height="120" rx="6">
          <animate
            attributeName="height"
            begin="0.5s"
            dur="1s"
            values="120;110;100;90;80;70;60;50;40;140;120"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="y"
            begin="0.5s"
            dur="1s"
            values="10;15;20;25;30;35;40;45;50;0;10"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </rect>
        <rect x="30" y="10" width="15" height="120" rx="6">
          <animate
            attributeName="height"
            begin="0.25s"
            dur="1s"
            values="120;110;100;90;80;70;60;50;40;140;120"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="y"
            begin="0.25s"
            dur="1s"
            values="10;15;20;25;30;35;40;45;50;0;10"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </rect>
        <rect x="60" width="15" height="140" rx="6">
          <animate
            attributeName="height"
            begin="0s"
            dur="1s"
            values="120;110;100;90;80;70;60;50;40;140;120"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="y"
            begin="0s"
            dur="1s"
            values="10;15;20;25;30;35;40;45;50;0;10"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </rect>
        <rect x="90" y="10" width="15" height="120" rx="6">
          <animate
            attributeName="height"
            begin="0.25s"
            dur="1s"
            values="120;110;100;90;80;70;60;50;40;140;120"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="y"
            begin="0.25s"
            dur="1s"
            values="10;15;20;25;30;35;40;45;50;0;10"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </rect>
        <rect x="120" y="10" width="15" height="120" rx="6">
          <animate
            attributeName="height"
            begin="0.5s"
            dur="1s"
            values="120;110;100;90;80;70;60;50;40;140;120"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="y"
            begin="0.5s"
            dur="1s"
            values="10;15;20;25;30;35;40;45;50;0;10"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </rect>
      </svg>
    </epp-spinner>
    <epp-spinner animation="none" color="var(--el-color-info)">
      <svg viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg" fill="currentColor">
        <circle r="6">
          <animate
            attributeName="cy"
            begin="0s"
            dur="2.2s"
            values="50;5;50;50"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="cx"
            begin="0s"
            dur="2.2s"
            values="5;27;49;5"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle r="6">
          <animate
            attributeName="cy"
            begin="0s"
            dur="2.2s"
            from="5"
            to="5"
            values="5;50;50;5"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="cx"
            begin="0s"
            dur="2.2s"
            from="27"
            to="27"
            values="27;49;5;27"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
        <circle r="6">
          <animate
            attributeName="cy"
            begin="0s"
            dur="2.2s"
            values="50;50;5;50"
            calcMode="linear"
            repeatCount="indefinite"
          />
          <animate
            attributeName="cx"
            from="49"
            to="49"
            begin="0s"
            dur="2.2s"
            values="49;5;27;49"
            calcMode="linear"
            repeatCount="indefinite"
          />
        </circle>
      </svg>
    </epp-spinner>
  </el-space>
</template>
<script lang="ts" setup>
import { Present } from '@element-plus/icons-vue';
</script>

旋转方向

animation 属性可以控制自动旋转的方向

向右旋转(Rotate right)

向左旋转(Rotate left)

禁止旋转(No Rotation)

如果你自定义的图示自带旋转动画,那可以通过 animation="none" 开关闭spinner组件的旋转效果
vue
<template>
  <el-space block size="large">
    <el-space size="large" direction="vertical">
      <epp-spinner animation="around-right">
        <el-icon>
          <Present />
        </el-icon>
      </epp-spinner>
      <p>向右旋转(Rotate right)</p>
    </el-space>

    <el-space size="large" direction="vertical">
      <epp-spinner animation="around-left">
        <el-icon>
          <Present />
        </el-icon>
      </epp-spinner>
      <p>向左旋转(Rotate left)</p>
    </el-space>

    <el-space size="large" direction="vertical">
      <epp-spinner animation="none">
        <el-icon>
          <Present />
        </el-icon>
      </epp-spinner>
      <p>禁止旋转(No Rotation)</p>
    </el-space>
  </el-space>
</template>
<script lang="ts" setup>
import { Present } from '@element-plus/icons-vue';
</script>

动画时间

duration 属性可以控制动画的持续时间

默认(Default) 2s

500ms

12s

如果你自定义的图示自带旋转动画,那可以通过 animation="none" 开关闭spinner组件的旋转效果
vue
<template>
  <el-space block size="large">
    <el-space size="large" direction="vertical">
      <epp-spinner>
        <el-icon>
          <Present />
        </el-icon>
      </epp-spinner>
      <p>默认(Default) 2s</p>
    </el-space>

    <el-space size="large" direction="vertical">
      <epp-spinner duration="500ms">
        <el-icon>
          <Present />
        </el-icon>
      </epp-spinner>
      <p>500ms</p>
    </el-space>

    <el-space size="large" direction="vertical">
      <epp-spinner duration="12s">
        <el-icon>
          <Present />
        </el-icon>
      </epp-spinner>
      <p>12s</p>
    </el-space>
  </el-space>
</template>
<script lang="ts" setup>
import { Present } from '@element-plus/icons-vue';
</script>

状态反馈

Spinner 除了展示一个旋转的图示以外,可以根据status变量来反馈一个结果。

默认方式(Default)
slot方式(Slot)
提交错误
Spinner提供 success warning error info 4个状态插槽,你可以根据类型自定义内容
vue
<template>
  <el-row>
    <el-col :span="12">
      <el-space direction="vertical">
        <h6>默认方式(Default)</h6>
        <epp-spinner :status="status" @click="handle('')" />
        <el-space size="small">
          <el-button :disabled="disabled" @click="handle('success')">Success</el-button>
          <el-button :disabled="disabled" @click="handle('error')">Error</el-button>
          <el-button :disabled="disabled" @click="handle('warning')">Warning</el-button>
          <el-button :disabled="disabled" @click="handle('info')">Info</el-button>
        </el-space>
      </el-space>
    </el-col>

    <el-col :span="12">
      <el-space direction="vertical">
        <h6>slot方式(Slot)</h6>
        <epp-spinner :status="status1" @click="handle1('')">
          <template #error>提交错误</template>
          <template #success>
            <el-icon>
              <GoodsFilled />
            </el-icon>
          </template>
          <template #warning>
            <el-icon>
              <AlarmClock />
            </el-icon>
          </template>
          <template #info>
            <el-icon>
              <Present />
            </el-icon>
          </template>
        </epp-spinner>
        <el-space size="small">
          <el-button :disabled="disabled1" @click="handle1('success')">Success</el-button>
          <el-button :disabled="disabled1" @click="handle1('error')">Error</el-button>
          <el-button :disabled="disabled1" @click="handle1('warning')">Warning</el-button>
          <el-button :disabled="disabled1" @click="handle1('info')">Info</el-button>
        </el-space>
      </el-space>
    </el-col>
  </el-row>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import { Present, AlarmClock, GoodsFilled } from '@element-plus/icons-vue';

const disabled = ref(false);
const disabled1 = ref(false);
const status = ref('');
const status1 = ref('');

const handle = (s) => {
  status.value = s;
  disabled.value = true;
  setTimeout(() => {
    status.value = '';
    disabled.value = false;
  }, 2000);
};
const handle1 = (s) => {
  status1.value = s;
  disabled1.value = true;
  setTimeout(() => {
    status1.value = '';
    disabled1.value = false;
  }, 2000);
};
</script>

Attributes

参数说明类型可选值默认值
size尺寸string-
color颜色string
animation旋转方向stringaround-left / around-right / nonearound-right
duration动画时间strings / ms2s
status状态反馈stringsuccess / error / warning / info

Slots

名称说明
-默认插槽
success成功状态的插槽
error错误状态的插槽
warning警告状态的插槽
info信息提示状态的插槽