آموزش طراحی سایت و برنامهنویسی وب
سورس کد نوار پیشرفت گروهی (نوار مهارت) با data-percent و انیمیشن اسکرول
- هر نوار فقط یک ویژگی
data-percentمیخواهد؛ برای افزودن نوار جدید، یک بلوک HTML را کپی و عدد را عوض کنید. - با
IntersectionObserverنوارها فقط وقتی پر میشوند که کاربر واقعاً به آنها رسیده باشد. - عدد درصد همزمان با نوار از صفر شمرده میشود و در انتها ثابت میماند.
- کد بدون jQuery و کمتر از ۳۰ خط است و برای کاربرانی که حرکت را کاهش دادهاند، انیمیشن حذف میشود.
اگر در صفحهٔ «درباره ما»، رزومه یا بخش خدمات میخواهید چند عدد را کنار هم نشان دهید، نوار پیشرفت گروهی خواناتر از یک جدول خشک است. در این مطلب از طاووس وب نسخهٔ بهروز این سورس را میسازیم: چند نوار با مقدارهای مختلف که هنگام اسکرول به ترتیب پر میشوند و عددشان شمرده میشود. پیشنمایش نسخهٔ اولیه را هم میتوانید ببینید.
دموی زنده نوار پیشرفت گروهی
نوارها وقتی به این بخش برسید پر میشوند
مقادیر نمونه هستند؛ در سایت خودتان فقط عدد data-percent هر نوار را عوض کنید.
کد HTML نوار پیشرفت گروهی
هر نوار یک بلوک مستقل است. عدد درصد فقط در data-percent نوشته میشود و متن داخل b را جاوااسکریپت پر میکند:
<div class="skills">
<div class="skill" data-percent="92">
<div class="skill-head"><span>طراحی رابط کاربری</span><b>0%</b></div>
<div class="skill-track"><div class="skill-fill"></div></div>
</div>
<div class="skill" data-percent="74">
<div class="skill-head"><span>سئو تکنیکال</span><b>0%</b></div>
<div class="skill-track"><div class="skill-fill"></div></div>
</div>
<!-- برای نوار جدید، یک بلوک .skill دیگر اضافه کنید -->
</div>کد CSS نوارها
.skills { display: grid; gap: 18px; max-width: 560px; }
.skill-head {
display: flex; justify-content: space-between;
font-weight: 700; margin-bottom: 6px;
}
.skill-track {
height: 12px;
background: #EDE4FA;
border-radius: 20px;
overflow: hidden;
}
.skill-fill {
height: 100%; width: 0;
border-radius: 20px;
background: linear-gradient(90deg, #C9A3F5, #8224E3, #5F01AF);
transition: width 1.4s cubic-bezier(.2,.8,.2,1);
}
@media (prefers-reduced-motion: reduce) {
.skill-fill { transition: none; }
}کد جاوااسکریپت: پر شدن هنگام اسکرول
IntersectionObserver به مرورگر میگوید وقتی ۴۰٪ از بخش نوارها دیده شد خبر بدهد. بعد از اجرا، ناظر قطع میشود تا انیمیشن فقط یکبار اجرا شود:
const box = document.querySelector('.skills');
const skills = box.querySelectorAll('.skill');
const DURATION = 1400;
function countUp(el, target) {
let start = null;
function step(ts) {
if (!start) start = ts;
const k = Math.min(1, (ts - start) / DURATION);
const eased = 1 - Math.pow(1 - k, 3); // easeOutCubic
el.textContent = Math.round(target * eased) + '%';
if (k < 1) requestAnimationFrame(step);
}
requestAnimationFrame(step);
}
function fillAll() {
skills.forEach((s, i) => {
const p = Number(s.dataset.percent);
setTimeout(() => { // پر شدن پلهای
s.querySelector('.skill-fill').style.width = p + '%';
countUp(s.querySelector('b'), p);
}, i * 150);
});
}
const io = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
fillAll();
io.disconnect();
}
}, { threshold: 0.4 });
io.observe(box);چرا IntersectionObserver و نه رویداد scroll؟ رویداد اسکرول در هر ثانیه دهها بار اجرا میشود و اگر در آن محاسبهٔ موقعیت انجام دهید، اسکرول صفحه کند میشود. IntersectionObserver همین کار را بدون هزینه و فقط در لحظهٔ لازم انجام میدهد.
نکات طراحی نوار مهارت و آمار
- عدد بیمعنا ننویسید. «فتوشاپ ۸۷٪» برای کارفرما معنای روشنی ندارد. بهتر است نوار را برای شاخصهای قابل اندازهگیری مثل «پروژههای تحویلشده در موعد» استفاده کنید.
- تعداد را محدود کنید. ۴ تا ۶ نوار کافی است؛ بیشتر از آن، مقایسه سخت میشود.
- برچسب را روی نوار ننویسید. متن داخل نوار باریک در موبایل خوانده نمیشود؛ عنوان و عدد را بالای نوار بگذارید.
- کنتراست کافی. رنگ مسیر خالی باید آنقدر روشن باشد که مقدار پرشده بهوضوح دیده شود.

اگر تازه با جاوااسکریپت آشنا شدهاید، اول سورس کد نوار پیشرفت ساده را ببینید که منطق یک نوار را قدمبهقدم توضیح میدهد. برای چیدمان کارتهای آمار کنار نوارها هم آموزش CSS Grid کمکتان میکند.
صفحهٔ «درباره ما» شما اعتماد میسازد؟طاووس وب سایت شرکتی را طوری طراحی میکند که آمار و افتخارات شما در چند ثانیه دیده و باور شود.
طراحی سایت شرکتیسؤالات متداول نوار پیشرفت گروهی
چطور یک نوار جدید اضافه کنم؟
یک بلوک div با کلاس skill را کپی کنید، عنوان را عوض کنید و عدد data-percent را بنویسید. جاوااسکریپت بهطور خودکار نوار جدید را پیدا میکند.
چرا نوارها بدون اسکرول پر نمیشوند؟
چون عمداً فقط وقتی کاربر به بخش نوارها برسد اجرا میشوند. اگر نوارها بالای صفحه هستند، threshold را کم کنید یا fillAll را مستقیم صدا بزنید.
میتوانم رنگ هر نوار را جدا تعیین کنم؟
بله؛ برای هر .skill یک متغیر مثل style="--c:#1FAE57" بنویسید و در CSS، background نوار را var(--c) قرار دهید.
آیا این کد در المنتور کار میکند؟
بله، در ابزارک HTML المنتور قرار دهید. المنتور ابزارک نوار پیشرفت هم دارد، اما این کد سبکتر است و شمارش عدد را هم دارد.
نوار پیشرفت گروهی با نمودار میلهای چه فرقی دارد؟
نوار پیشرفت هر مقدار را نسبت به ۱۰۰٪ نشان میدهد؛ نمودار میلهای برای مقایسهٔ مقادیر مطلق (مثل فروش ماهانه) مناسبتر است.