优化进度条
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s

This commit is contained in:
2025-12-20 15:30:14 +08:00
parent 128fb60bad
commit 77e84f1086
3 changed files with 242 additions and 388 deletions

View File

@@ -905,28 +905,54 @@
})(); })();
// 进度条动画 // 进度条动画
function animateProgressBars (container) // function animateProgressBars (container)
{ // {
if (container._isAnimating) return; // if (container._isAnimating) return;
container._isAnimating = true; // container._isAnimating = true;
// const progressFills = container.querySelectorAll('.progress-fill');
// progressFills.forEach(fill =>
// {
// clearTimeout(fill._animateTimer);
// fill.style.width = '0';
// fill._animateTimer = setTimeout(() =>
// {
// const targetValue = fill.getAttribute('data-value');
// fill.style.width = targetValue + '%';
// setTimeout(() =>
// {
// container._isAnimating = false;
// }, 500);
// }, 100);
// });
// }
// 进度条动画 - 零HTML改动仅优化性能
function animateProgressBars (container){
// 性能优化1用WeakMap管理状态避免污染DOM属性
const animationState = new WeakMap();
const state = animationState.get(container) || { isAnimating: false };
// 防止重复触发
if (state.isAnimating) return;
state.isAnimating = true;
animationState.set(container, state);
const progressFills = container.querySelectorAll('.progress-fill'); const progressFills = container.querySelectorAll('.progress-fill');
progressFills.forEach(fill => progressFills.forEach(fill =>
{ {
clearTimeout(fill._animateTimer); clearTimeout(fill._animateTimer);
fill.style.width = '0'; // 性能优化2重置用transform而非width
fill._animateTimer = setTimeout(() => fill.style.transform = 'scaleX(0)';
// 性能优化3用requestAnimationFrame替代setTimeout对齐浏览器刷新
fill._animateTimer = requestAnimationFrame(() =>
{ {
const targetValue = fill.getAttribute('data-value'); const targetValue = fill.getAttribute('data-value');
fill.style.width = targetValue + '%'; // 性能优化4用transform替代width消除重排
setTimeout(() => fill.style.transform = `scaleX(${targetValue / 100})`;
{ });
container._isAnimating = false;
}, 500);
}, 100);
}); });
} }
function isElementInView (el) function isElementInView (el)
{ {
const rect = el.getBoundingClientRect(); const rect = el.getBoundingClientRect();

View File

@@ -1,106 +1,117 @@
.container { /* 你的原始基础样式保留,仅添加/修改性能相关属性 */
max-width: 14.4rem; .container {
/* min-width: 1280px; */ max-width: 14.4rem;
margin: 0 auto; margin: 0 auto;
border-radius: 12px; border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
} }
.progress-section {
max-width: 14.4rem;
/* min-width: 1280px; */
}
.progress-title {
font-size: 0.48rem;
color: #fff;
padding: 2.13rem 0 0.78rem 0;
font-family: "HarmonyOS-Medium";
}
.progress-item .label { .progress-section {
font-size: 0.4rem; max-width: 14.4rem;
color: #cbcfd8; }
margin-bottom: 0.08rem;
display: flex;
justify-content: space-between;
align-items: baseline;
line-height: 1;
margin-top: 0.3rem;
margin-bottom: 0.76rem;
}
.progress-item .label .device-name { .progress-title {
flex: 1; font-size: 0.48rem;
font-family: "HarmonyOS-Medium"; color: #fff;
} padding: 2.13rem 0 0.78rem 0;
font-family: "HarmonyOS-Medium";
}
.progress-item .label .baseline { .progress-item .label {
color: #cbcfd8; font-size: 0.4rem;
font-size: 0.6rem; color: #cbcfd8;
} margin-bottom: 0.08rem;
display: flex;
justify-content: space-between;
align-items: baseline;
line-height: 1;
margin-top: 0.3rem;
margin-bottom: 0.76rem;
}
.progress-item .label .value { .progress-item .label .device-name {
font-size: 0.4rem; flex: 1;
min-width: 0.8rem; font-family: "HarmonyOS-Medium";
text-align: right; }
margin-left: 0.16rem;
font-family: "HarmonyOS-Medium";
}
.colorLinearGradient {
background: linear-gradient(90deg, #7e51ff, #d5dfff);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.progress-item .label .value.m4-max {
color: #5e5ce6;
}
.progress-item .label .value.gray { .progress-item .label .baseline {
color: #86868b; color: #cbcfd8;
} font-size: 0.6rem;
}
.progress-bar-container { .progress-item .label .value {
display: flex; font-size: 0.4rem;
align-items: center; min-width: 0.8rem;
gap: 0.16rem; text-align: right;
} margin-left: 0.16rem;
font-family: "HarmonyOS-Medium";
}
.progress-bar { .colorLinearGradient {
flex: 1; background: linear-gradient(90deg, #7e51ff, #d5dfff);
height: 0.2rem; -webkit-background-clip: text;
max-height: 20px; background-clip: text;
min-height: 10px; color: transparent;
border-radius: 10px; }
overflow: hidden;
position: relative;
}
.progress-fill { .progress-item .label .value.m4-max {
height: 100%; color: #5e5ce6;
border-radius: 0.05rem; }
transition: width 1.2s ease-out;
width: 0;
position: relative;
}
.progress-fill.m4-max { .progress-item .label .value.gray {
background: linear-gradient(40deg, #7e51ff, #e1d5ff); color: #86868b;
} }
.progress-fill.m2-max { .progress-bar-container {
background: #bfc5d9; display: flex;
} align-items: center;
gap: 0.16rem;
}
.progress-fill.m1-max { .progress-bar {
background: #bfc5d9; flex: 1;
} height: 0.2rem;
max-height: 20px;
min-height: 10px;
border-radius: 10px;
overflow: hidden;
position: relative;
/* 性能优化1开启硬件加速减少重绘 */
transform: translateZ(0);
will-change: transform;
}
.progress-fill.baseline { .progress-fill {
background: #bfc5d9; height: 100%;
} border-radius: 0.05rem;
/* 性能优化2替换width动画为transform消除重排 */
transform: scaleX(0);
transform-origin: left center;
transition: transform 1.2s ease-out;
will-change: transform;
position: relative;
/* 移除原始的width: 0; */
}
/* 流光动效 */ /* 保留你所有原始的进度条颜色类 */
/* .progress-fill::after { .progress-fill.m4-max {
background: linear-gradient(40deg, #7e51ff, #e1d5ff);
}
.progress-fill.m2-max {
background: #bfc5d9;
}
.progress-fill.m1-max {
background: #bfc5d9;
}
.progress-fill.baseline {
background: #bfc5d9;
}
/* 流光动效(保留你的注释,如需启用可直接解开) */
/* .progress-fill::after {
content: ''; content: '';
position: absolute; position: absolute;
top: 0; top: 0;
@@ -115,88 +126,78 @@
); );
animation: shimmer 1.5s infinite; animation: shimmer 1.5s infinite;
} */ } */
@keyframes shimmer {
100% {
left: 150%;
}
}
@keyframes shimmer { /* 基准说明(保留原始样式) */
100% { .baseline-note {
left: 150%; margin-top: 0.3rem;
} font-size: 0.13rem;
} color: #86868b;
padding-top: 0.15rem;
border-top: 1px solid #e9e9eb;
}
/* 基准说明 */ .baseline-note sup {
.baseline-note { font-size: 0.1rem;
margin-top: 0.3rem; vertical-align: top;
font-size: 0.13rem; }
color: #86868b;
padding-top: 0.15rem;
border-top: 1px solid #e9e9eb;
}
.baseline-note sup { /* 保留你所有设计稿固定宽度类(完全不动) */
font-size: 0.1rem; .w1440 {
vertical-align: top; width: 14.4rem;
} }
.w1440 {
width: 14.4rem; .w1368 {
/* max-width: 1440px; width: 13.68rem;
min-width: 1280px; */ }
}
.w1368 { .w1243 {
width: 13.68rem; width: 12.43rem;
/* min-width: 1280px; */ }
}
.w1243 { .w964 {
/* width: 1243px; */ width: 9.64rem;
width: 12.43rem; }
}
.w964 { .w681 {
/* width: 964px; */ width: 6.81rem;
width:9.64rem; }
}
.w681 { .w1274 {
/* width: 681px; */ width: 12.74rem;
width: 6.81rem; }
}
.w1274 { .w1000 {
/* width: 1274px; */ width: 10rem;
width: 12.74rem; }
}
.w1000 { .font32 {
/* width: 1000px; */ font-size: 0.32rem !important;
width:10rem; }
}
/* .w1368 { .colorCBCFD8 {
width: 13.68rem; color: #646778 !important;
min-width: 1280px; }
}
.w1243 { .color8A8787 {
width: 12.43rem; color: #646778 !important;
} }
.w964 {
width: 9.64rem; .progress-p {
} color: #cbcfd8;
.w681 { font-size: clamp(16px, 1vw, 0.22rem);
width: 6.81rem; margin-top: 1.56rem;
} */ margin-bottom: 2rem;
.font32 { text-align: center;
font-size: 0.32rem !important; }
}
.colorCBCFD8 { .progress-p1 {
color: #646778 !important; color: #cbcfd8;
} font-size: clamp(16px, 1vw, 0.22rem);
.color8A8787 { margin-top: 1.56rem;
color: #646778 !important; text-align: center;
} }
.progress-p {
color: #cbcfd8;
font-size: clamp(16px, 1vw, 0.22rem);
margin-top: 1.56rem;
margin-bottom: 2rem;
text-align: center;
}
.progress-p1 {
color: #cbcfd8;
font-size: clamp(16px, 1vw, 0.22rem);
margin-top: 1.56rem;
/* margin-bottom: 1.66rem; */
text-align: center;
}

View File

@@ -1,173 +0,0 @@
.container {
max-width: 14.4rem;
/* min-width: 1280px; */
margin: 0 auto;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
}
.progress-section {
max-width: 14.4rem;
/* min-width: 1280px; */
}
.progress-title {
font-size: 0.48rem;
color: #fff;
padding: 2.13rem 0 0.78rem 0;
font-family: "HarmonyOS-Medium";
}
.progress-item .label {
font-size: 0.4rem;
color: #cbcfd8;
margin-bottom: 0.08rem;
display: flex;
justify-content: space-between;
align-items: baseline;
line-height: 1;
margin-top: 0.3rem;
margin-bottom: 0.76rem;
}
.progress-item .label .device-name {
flex: 1;
font-family: "HarmonyOS-Medium";
}
.progress-item .label .baseline {
color: #cbcfd8;
font-size: 0.6rem;
}
.progress-item .label .value {
font-size: 0.4rem;
min-width: 0.8rem;
text-align: right;
margin-left: 0.16rem;
font-family: "HarmonyOS-Medium";
}
.colorLinearGradient {
background: linear-gradient(90deg, #7e51ff, #d5dfff);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.progress-item .label .value.m4-max {
color: #5e5ce6;
}
.progress-item .label .value.gray {
color: #86868b;
}
.progress-bar-container {
display: flex;
align-items: center;
gap: 0.16rem;
/* 新增:让容器成为定位参考 */
position: relative;
}
.progress-bar {
flex: 1;
height: 0.2rem;
max-height: 20px;
min-height: 10px;
border-radius: 10px;
overflow: hidden;
position: relative;
/* 新增进度条本身宽度100%,通过父容器控制实际宽度 */
width: 100%;
}
/* ========== 核心优化:进度条填充层(去掉流光) ========== */
.progress-fill {
height: 100%;
border-radius: 0.05rem;
/* 移除width过渡改用transform性能更优 */
transition: transform 1.2s ease-out;
/* 初始状态向左偏移100%(完全隐藏) */
transform: translateX(-100%);
/* 固定宽度100%不再动态修改width */
width: 100%;
position: absolute;
left: 0;
top: 0;
}
/* 新增进度条激活状态通过JS添加此类名 */
.progress-fill.active {
transform: translateX(0); /* 偏移0完全显示 */
}
.progress-fill.m4-max {
background: linear-gradient(40deg, #7e51ff, #e1d5ff);
}
.progress-fill.m2-max {
background: #bfc5d9;
}
.progress-fill.m1-max {
background: #bfc5d9;
}
.progress-fill.baseline {
background: #bfc5d9;
}
/* 基准说明 */
.baseline-note {
margin-top: 0.3rem;
font-size: 0.13rem;
color: #86868b;
padding-top: 0.15rem;
border-top: 1px solid #e9e9eb;
}
.baseline-note sup {
font-size: 0.1rem;
vertical-align: top;
}
.w1440 {
width: 14.4rem;
}
.w1368 {
width: 13.68rem;
}
.w1243 {
width: 12.43rem;
}
.w964 {
width:9.64rem;
}
.w681 {
width: 6.81rem;
}
.w1274 {
width: 12.74rem;
}
.w1000 {
width:10rem;
}
.font32 {
font-size: 0.32rem !important;
}
.colorCBCFD8 {
color: #646778 !important;
}
.color8A8787 {
color: #646778 !important;
}
.progress-p {
color: #cbcfd8;
font-size: clamp(16px, 1vw, 0.22rem);
margin-top: 1.23rem;
margin-bottom: 5.04rem;
text-align: center;
}
.progress-p1 {
color: #cbcfd8;
font-size: clamp(16px, 1vw, 0.22rem);
margin-top: 1.56rem;
text-align: center;
}