上一篇
场景引入:
"嘿,我正在更新个人作品集网站,想在技能展示区加点动态效果...但不想用JavaScript!"上周五咖啡厅里,设计师小林咬着吸管嘟囔道,别担心,今天我要分享的纯CSS进度条技巧,能让你的技能栏像游戏角色属性一样流畅加载,而且完全不需要写一行JS代码!
我们先从最基础的HTML结构开始,这里用语义化的方式构建:
<div class="skill-container"> <h3>HTML5</h3> <div class="skill-bar"> <div class="skill-level" data-level="90%"></div> </div> </div>
解释一下:
skill-container
是整个技能项的包裹容器h3
里放技能名称skill-bar
是进度条的背景轨道skill-level
是实际进度的彩色条,data-level
属性存储百分比值现在上主菜——纯CSS动画实现:
/* 基础样式 */ .skill-bar { height: 20px; background: #e0e0e0; border-radius: 10px; margin: 10px 0; overflow: hidden; /* 关键!防止进度溢出 */ } .skill-level { height: 100%; width: 0; /* 初始宽度为0 */ background: linear-gradient(90deg, #ff7e5f, #feb47b); border-radius: inherit; animation: fillBar 1.5s ease-out forwards; /* 动画定义 */ } /* 关键帧动画 */ @keyframes fillBar { from { width: 0; } to { width: var(--target-width); } /* 通过CSS变量控制 */ }
重点技巧:
overflow: hidden
确保圆角效果完整forwards
让动画结束后保持最终状态要让不同技能显示不同进度,我们需要一些CSS变量技巧:
.skill-level { /* 添加这行到原有样式 */ --target-width: attr(data-level); /* 注意:这种写法需要配合下面JS替代方案 */ } /* 实际可行的纯CSS方案 */ .skill-container:nth-child(1) .skill-level { --target-width: 90%; } .skill-container:nth-child(2) .skill-level { --target-width: 80%; } /* 以此类推... */
2025年更新:虽然CSS的attr()
函数对width支持仍有限制,但我们可以用:has()
选择器配合nth-child实现纯CSS控制(需要现代浏览器支持)。
让进度条更专业的5个小技巧:
内阴影效果:
.skill-level { box-shadow: inset 3px 0 5px rgba(255,255,255,0.3); }
条纹动画背景:
background: linear-gradient(45deg, rgba(255,255,255,0.1) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0.1) 75%, transparent 75%); background-size: 20px 20px;
百分比文字显示:
.skill-bar::after { content: attr(data-level); position: absolute; right: 10px; color: white; font-size: 12px; line-height: 20px; text-shadow: 0 0 2px #000; }
悬停放大效果:
.skill-container:hover .skill-bar { transform: scaleY(1.2); transition: transform 0.3s; }
响应式调整:
@media (max-width: 600px) { .skill-bar { height: 15px; } }
组合起来:
<!DOCTYPE html> <html> <head> <style> .skill-container { margin-bottom: 20px; width: 80%; max-width: 500px; } .skill-bar { height: 20px; background: #e0e0e0; border-radius: 10px; margin: 5px 0; overflow: hidden; position: relative; } .skill-level { height: 100%; width: 0; background: linear-gradient(90deg, #4b6cb7, #182848); border-radius: inherit; animation: fillBar 1.5s ease-out forwards; box-shadow: inset 3px 0 5px rgba(255,255,255,0.3); } @keyframes fillBar { from { width: 0; } to { width: var(--target-width); } } /* 为不同技能设置不同进度 */ .skill-container:nth-child(1) .skill-level { --target-width: 90%; } .skill-container:nth-child(2) .skill-level { --target-width: 85%; } .skill-container:nth-child(3) .skill-level { --target-width: 75%; } </style> </head> <body> <div class="skill-container"> <h3>HTML5</h3> <div class="skill-bar" data-level="90%"> <div class="skill-level"></div> </div> </div> <div class="skill-container"> <h3>CSS3</h3> <div class="skill-bar" data-level="85%"> <div class="skill-level"></div> </div> </div> <div class="skill-container"> <h3>JavaScript</h3> <div class="skill-bar" data-level="75%"> <div class="skill-level"></div> </div> </div> </body> </html>
Q:为什么我的动画不播放?
A:检查是否正确定义了@keyframes
,以及动画名称是否匹配,另外确保元素初始宽度为0。
Q:如何在移动设备上优化性能?
A:可以适当减少动画持续时间(改为1s),或者为will-change: transform;
属性添加硬件加速。
Q:能做成环形进度条吗?
A:当然可以!使用CSS的conic-gradient
配合border-radius: 50%
就能实现,原理类似但需要调整动画关键帧。
2025年浏览器支持提示:目前所有主流浏览器都已支持CSS动画和变量,包括Safari 15+,如需支持老旧浏览器,可以添加@supports
查询提供降级方案。
本文由 奉桂华 于2025-08-02发表在【云服务器提供商】,文中图片由(奉桂华)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/517252.html
发表评论