134 lines
3.0 KiB
Vue
134 lines
3.0 KiB
Vue
<template>
|
|
<!-- #ifdef MP-HARMONY -->
|
|
<view></view>
|
|
<!-- #endif -->
|
|
<!-- #ifndef MP-HARMONY -->
|
|
<view class="loading-layer" v-if="isShow">
|
|
<view class="loading-anim" v-if="themeStyle">
|
|
<view class="box item">
|
|
<view class="border out item" :style="{'border-left-color':themeStyle.main_color, 'border-top-color':themeStyle.main_color}"></view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<!-- #endif -->
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'loading-cover',
|
|
props: {
|
|
initShow: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
isShow: true
|
|
};
|
|
},
|
|
components: {},
|
|
created() {
|
|
this.isShow = this.initShow;
|
|
},
|
|
methods: {
|
|
show() {
|
|
this.isShow = true;
|
|
},
|
|
hide() {
|
|
this.isShow = false;
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
@keyframes spin {
|
|
from {
|
|
transform: rotate(0deg);
|
|
}
|
|
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
.loading-layer {
|
|
width: 100%;
|
|
height: 100%;
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
z-index: 997;
|
|
background: #f8f8f8;
|
|
// 修复: 强制合成层, 让 spin 动画只在自身合成层跑, 不触发兄弟节点 (尤其是底部 TabBar) 重绘
|
|
// 兼容环境: 微信小程序 / 鸿蒙元服务 / H5 都受益
|
|
// - 微信小程序: spin 动画每帧导致兄弟 fixed 元素 TabBar 重绘
|
|
// - 鸿蒙元服务 JSVM: 同上, JSVM 重绘更明显
|
|
// - H5: will-change 提示浏览器持续合成
|
|
transform: translateZ(0);
|
|
-webkit-transform: translateZ(0);
|
|
will-change: transform;
|
|
}
|
|
|
|
.loading-anim {
|
|
position: absolute;
|
|
left: 50%;
|
|
top: 40%;
|
|
transform: translate(-50%, -50%);
|
|
}
|
|
|
|
.loading-anim > .item {
|
|
position: relative;
|
|
width: 70rpx;
|
|
height: 70rpx;
|
|
perspective: 1600rpx;
|
|
transform-style: preserve-3d;
|
|
transition: all 0.2s ease-out;
|
|
}
|
|
|
|
.loading-anim .border {
|
|
position: absolute;
|
|
border-radius: 50%;
|
|
border: 6rpx solid;
|
|
}
|
|
|
|
.loading-anim .out {
|
|
top: 15%;
|
|
left: 15%;
|
|
width: 70%;
|
|
height: 70%;
|
|
// P0: 硬编码主色 → var(--base-color),主题切换时 loading 主色跟着变
|
|
// 兼容: 微信小程序 / 鸿蒙元服务 — border-color 接受 var() 值无问题
|
|
// JS 端 :style 绑定已用 themeStyle.main_color 走 inline 风格(原行 9),CSS 端用 var() 双保险
|
|
border-left-color: var(--base-color, #FF4646);
|
|
border-right-color: #C5C5C5 !important;
|
|
// border-right-color: rgba($color: #000000, $alpha: 0) !important;
|
|
border-top-color: var(--base-color, #FF4646);
|
|
border-bottom-color: #C5C5C5 !important;
|
|
// border-bottom-color: rgba($color: #000000, $alpha: 0) !important;
|
|
animation: spin 0.6s linear normal infinite;
|
|
transform-origin: center center;
|
|
}
|
|
|
|
.loading-anim .in {
|
|
top: 25%;
|
|
left: 25%;
|
|
width: 50%;
|
|
height: 50%;
|
|
border-top-color: transparent !important;
|
|
border-bottom-color: transparent !important;
|
|
animation: spin 0.8s linear infinite;
|
|
transform-origin: center center;
|
|
}
|
|
|
|
.loading-anim .mid {
|
|
top: 40%;
|
|
left: 40%;
|
|
width: 20%;
|
|
height: 20%;
|
|
border-left-color: transparent;
|
|
animation: spin 0.6s linear infinite;
|
|
transform-origin: center center;
|
|
}
|
|
</style>
|