当前位置: 首页 > article >正文

Vue3加载中(Spin)

Vue2加载中(Spin)

可自定义设置以下属性:

  • 是否为加载中状态(spinning),类型:boolean,默认 true

  • 组件大小(size),类型:string,可选:small default large

  • 描述文案(tip),类型:string | slot,默认 ''

效果如下图:

①创建加载中组件Spin.vue: 

<script setup lang="ts">
interface Props {
  spinning?: boolean, // 是否为加载中状态
  size?: string, // 组件大小,可选small default large
  tip?: string // 描述文案 string | slot
}
withDefaults(defineProps<Props>(), {
  spinning: true,
  size: 'default',
  tip: ''
})
</script>
<template>
  <div :class="`m-spin-wrap ${size}`">
    <div class="m-spin" v-show="spinning">
      <div class="m-spin-box">
        <div class="m-spin-dot">
          <span class="u-dot-item"></span>
          <span class="u-dot-item"></span>
          <span class="u-dot-item"></span>
          <span class="u-dot-item"></span>
        </div>
        <p class="u-tip" v-show="tip">{{ tip }}</p>
      </div>
    </div>
    <div :class="['m-spin-content', {'m-spin-mask': spinning}]">
      <slot></slot>
    </div>
  </div>
</template>
<style lang="less" scoped>
.m-spin-wrap {
  position: relative;
  height: 100%;
  width: 100%;
}
.m-spin {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 9;
  .m-spin-box {
    text-align: center;
    .m-spin-dot {
      position: relative;
      display: inline-block;
      transform: rotate(45deg);
      -ms-transform: rotate(45deg); /* Internet Explorer */
      -moz-transform: rotate(45deg); /* Firefox */
      -webkit-transform: rotate(45deg); /* Safari 和 Chrome */
      -o-transform: rotate(45deg); /* Opera */
      animation: rotate 1.2s linear infinite;
      -webkit-animation: rotate 1.2s linear infinite;
      @keyframes rotate {
        100% {transform: rotate(405deg);}
      }
      .u-dot-item { // 单个圆点样式
        position: absolute;
        background: @themeColor;
        border-radius: 50%;
        opacity: .3;
        animation: spinMove 1s linear infinite alternate;
        -webkit-animation: spinMove 1s linear infinite alternate;
        @keyframes spinMove {
          100% {opacity: 1;}
        }
      }
      .u-dot-item:first-child {
        top: 0;
        left: 0;
      }
      .u-dot-item:nth-child(2) {
        top: 0;
        right: 0;
        animation-delay: .4s;
        -webkit-animation-delay: .4s;
      }
      .u-dot-item:nth-child(3) {
        bottom: 0;
        right: 0;
        animation-delay: .8s;
        -webkit-animation-delay: .8s;
      }
      .u-dot-item:last-child {
        bottom: 0;
        left: 0;
        animation-delay: 1.2s;
        -webkit-animation-delay: 1.2s;
      }
    }
    .u-tip {
      color: @themeColor;
      text-align: center;
    }
  }
}
.large {
  .m-spin .m-spin-box {
    .m-spin-dot {
      width: 36px;
      height: 36px;
      .u-dot-item {
        width: 12px;
        height: 12px;
      }
    }
    .u-tip {
      font-size: 16px;
      font-weight: 500;
      line-height: 20px;
      padding-top: 10px;
    }
  }
}
.default {
  .m-spin .m-spin-box {
    .m-spin-dot {
      width: 28px;
      height: 28px;
      .u-dot-item {
        width: 10px;
        height: 10px;
      }
    }
    .u-tip {
      font-size: 14px;
      font-weight: 500;
      line-height: 18px;
      padding-top: 6px;
    }
  }
}
.small {
  .m-spin .m-spin-box {
    .m-spin-dot {
      width: 18px;
      height: 18px;
      .u-dot-item {
        width: 7px;
        height: 7px;
      }
    }
    .u-tip {
      font-size: 14px;
      font-weight: 400;
      line-height: 16px;
      padding-top: 4px;
    }
  }
}
.m-spin-content {
  transition: opacity .3s;
}
.m-spin-mask {
  user-select: none;
  pointer-events: none;
  opacity: 0.4;
}
</style>

②在要使用的页面引入:

<script setup lang="ts">
import { Spin } from './Spin.vue'
import { ref } from 'vue'

const tip = ref('加载中...')
const spinning = ref(true)

</script>

<template>
  <div>
    <h2 class="mb10">Spin 加载中基本使用</h2>
    <Spin :tip="tip" :spinning="spinning" size="small" style="width: 800px;">
      <p class="spin-content">当 spinning 为 false 时,不显示 loading 状态;当 spinning 为 true 时,延迟`delay`ms时间后,显示 loading 效果;如果 spinning 状态在 `delay` 时间内结束,则不显示 loading 状态;如果不设置 tip 描述文案时,则只有 loading 效果水平垂直居中;如果设置了 tip 描述文案,则 loading 效果和 tip 描述文案一起水平垂直居中。</p>
    </Spin>
  </div>
</template>

<style lang="less" scoped>
.spin-content {
  border: 1px solid #91d5ff;
  background-color: #e6f7ff;
  padding: 30px;
}
</style>

http://www.kler.cn/a/7493.html

相关文章:

  • Spring中的Bean
  • [Linux]多线程详解
  • 贴代码框架PasteForm特性介绍之markdown和richtext
  • Rust学习(五):泛型、trait
  • 蓝队基础1
  • K8S 查看pod节点的磁盘和内存使用情况
  • 38--Django-项目实战-全栈开发-基于django+drf+vue+elementUI企业级项目开发流程-前台首页设计
  • 【vue】使用 el-upload+axis实现手动多文件上传的代码实现
  • 国内ChatGPt研发-中国chatGPT
  • VB execl函数 word文档 KBS
  • Canal增量数据订阅和消费——原理详解
  • ansible自动运维——看明白ansible.cfg配置文件
  • 【Linux】环境变量进程虚拟地址空间
  • MySQL 索引常见问题汇总,一次性梳理
  • React 组件的 children 数据使用
  • Android 10.0 系统framework发送悬浮通知的流程分析
  • 在CentOS 7 中安装Hive-1.2.2
  • 【一起撸个DL框架】1 绪论
  • FPGA纯verilog实现UDP通信,三速网自协商仲裁,动态ARP和Ping功能,提供工程源码和技术支持
  • 多线程-模拟抢红包,抽奖池
  • 设计模式-day03
  • ChatGPT给自己写的科普性文章,你们认为写的怎样
  • echarts tooltip文字太长换行
  • Java多线程与并发
  • 把ChatGPT接入我的个人网站
  • Docker容器理解