CSS, HTML, JavaScript, سورس کد

سورس کد نوار پیشرفت ساده با جاوااسکریپت (تمرین قدم‌به‌قدم برای مبتدی‌ها)

Progress Bar Source Code - سورس کد نوار پیشرفت
زمان مطالعه: ۸ دقیقهسطح: مبتدیسورس کد + تمرین جاوااسکریپت
خلاصه در یک نگاه
  • نوار پیشرفت ساده از دو div تشکیل می‌شود: یک مسیر خاکستری و یک نوار رنگی که عرضش با درصد تغییر می‌کند.
  • کل منطق در یک متغیر percent و یک تابع render() خلاصه می‌شود؛ هر تغییری فقط متغیر را عوض می‌کند و بعد render را صدا می‌زند.
  • با setInterval نوار خودکار پر می‌شود و با clearInterval متوقف می‌شود.
  • ویژگی‌های role="progressbar" و aria-valuenow نوار را برای صفحه‌خوان‌ها قابل فهم می‌کنند.

ساخت یک نوار پیشرفت ساده یکی از بهترین تمرین‌های شروع جاوااسکریپت است؛ چون در یک پروژهٔ کوچک با متغیر، تابع، رویداد کلیک، شرط و تایمر کار می‌کنید و نتیجه را همان لحظه روی صفحه می‌بینید. در این مطلب از طاووس وب این نوار را قدم‌به‌قدم می‌سازیم و هر خط کد را توضیح می‌دهیم. پیش‌نمایش نسخهٔ اولیه هم در دسترس است.

دموی زنده نوار پیشرفت

با دکمه‌ها کار کنید

پیشرفت دوره۰٪

وقتی نوار به ۱۰۰٪ می‌رسد رنگش سبز می‌شود و تایمر خودکار متوقف می‌شود.

قدم ۱: ساختار HTML نوار پیشرفت

یک ظرف (track) و یک نوار داخلی (fill) کافی است. ویژگی‌های aria وضعیت نوار را به صفحه‌خوان اعلام می‌کنند:

<div class="progress">
  <div class="progress-head">
    <span>پیشرفت</span>
    <span class="progress-value">0%</span>
  </div>
  <div class="progress-track" role="progressbar"
       aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
    <div class="progress-fill"></div>
  </div>
  <button type="button" id="minus">-10%</button>
  <button type="button" id="plus">+10%</button>
  <button type="button" id="auto">پر شدن خودکار</button>
</div>

قدم ۲: ظاهر نوار با CSS

عرض اولیهٔ نوار صفر است و transition باعث می‌شود هر تغییر عرض نرم انجام شود:

.progress-track {
  height: 22px;
  background: #EDE4FA;
  border-radius: 30px;
  overflow: hidden;
}
.progress-fill {
  height: 100%;
  width: 0;
  background: linear-gradient(90deg, #8224E3, #5F01AF);
  border-radius: 30px;
  transition: width .35s ease;
}
.progress-fill.done {
  background: #1FAE57; /* در ۱۰۰٪ سبز می‌شود */
}

چون سایت فارسی و راست‌به‌چپ است، نوار به‌طور خودکار از سمت راست پر می‌شود. اگر می‌خواهید از چپ پر شود، به track ویژگی direction: ltr بدهید.

قدم ۳ و ۴: منطق جاوااسکریپت

قلب برنامه یک متغیر و یک تابع است. هر دکمه فقط مقدار متغیر را تغییر می‌دهد و بعد render را صدا می‌زند:

const fill  = document.querySelector('.progress-fill');
const label = document.querySelector('.progress-value');
const track = document.querySelector('.progress-track');

let percent = 0;     // وضعیت فعلی نوار
let timer = null;    // شناسهٔ تایمر خودکار

function render() {
  // محدود کردن مقدار بین ۰ و ۱۰۰
  percent = Math.max(0, Math.min(100, percent));

  fill.style.width = percent + '%';
  label.textContent = percent + '%';
  track.setAttribute('aria-valuenow', percent);
  fill.classList.toggle('done', percent === 100);

  if (percent === 100 && timer) {
    clearInterval(timer);
    timer = null;
  }
}

document.getElementById('plus').onclick  = () => { percent += 10; render(); };
document.getElementById('minus').onclick = () => { percent -= 10; render(); };

document.getElementById('auto').onclick = () => {
  if (timer) return;            // جلوگیری از اجرای چند تایمر همزمان
  timer = setInterval(() => {
    percent += 2;
    render();
  }, 80);
};

توضیح خط‌به‌خط برای مبتدی‌ها

  1. let به‌جای constمقدار percent و timer در طول برنامه تغییر می‌کند، پس باید با let تعریف شوند. عناصر صفحه تغییر نمی‌کنند و با const نگه داشته می‌شوند.
  2. Math.min و Math.maxاین دو تابع مقدار را «گیره» می‌کنند تا با کلیک‌های پشت سر هم از ۱۰۰ بیشتر یا از صفر کمتر نشود.
  3. یک منبع حقیقتبه‌جای اینکه هر دکمه مستقیم عرض نوار را تغییر دهد، همه فقط متغیر را عوض می‌کنند. این الگو پایهٔ فریم‌ورک‌هایی مثل React و Vue است.
  4. setInterval و clearIntervalتایمر هر ۸۰ میلی‌ثانیه ۲ درصد اضافه می‌کند و وقتی به ۱۰۰ رسید، با clearInterval خاموش می‌شود. شرط if (timer) return از ساخته شدن چند تایمر همزمان جلوگیری می‌کند.
مراحل ساخت نوار پیشرفت ساده با جاوااسکریپت
مسیر ساخت نوار پیشرفت در این آموزش

جایگزین آماده: تگ progress در HTML

HTML یک تگ آماده هم برای این کار دارد: <progress value="40" max="100">. این تگ به‌طور خودکار برای صفحه‌خوان‌ها قابل فهم است، اما ظاهرش در هر مرورگر متفاوت است و استایل‌دهی آن به پیشوندهای ::-webkit-progress-value و ::-moz-progress-bar نیاز دارد. برای طراحی دقیق و یکسان، روش div که در این آموزش ساختیم انعطاف بیشتری دارد.

تمرین برای شما

  • دکمه‌ای اضافه کنید که تایمر خودکار را متوقف (Pause) کند.
  • کاری کنید که رنگ نوار زیر ۳۰٪ قرمز، بین ۳۰ تا ۷۰ نارنجی و بالای ۷۰ بنفش باشد.
  • درصد را در localStorage ذخیره کنید تا با رفرش صفحه از بین نرود.

بعد از این تمرین، سورس کد نوار پیشرفت گروهی را ببینید که چند نوار را هنگام اسکرول پر می‌کند. برای چیدمان بهتر اجزای صفحه هم آموزش Flexbox را پیشنهاد می‌کنیم.

از یادگیری کد تا راه‌اندازی سایت واقعیاگر می‌خواهید سایت کسب‌وکارتان را حرفه‌ای راه بیندازید، طاووس وب در کنار شماست؛ از مشاوره تا طراحی و سئو.

مشاورهٔ رایگان طراحی سایت

سؤالات متداول نوار پیشرفت ساده

نوار پیشرفت در سایت چه کاربردی دارد؟

برای نمایش مراحل فرم‌های چندمرحله‌ای، پیشرفت دوره‌های آموزشی، آپلود فایل، میزان تکمیل پروفایل یا مقدار باقی‌مانده تا ارسال رایگان در فروشگاه‌ها.

چرا نوار از سمت راست پر می‌شود؟

چون جهت صفحه راست‌به‌چپ (RTL) است. با direction: ltr روی ظرف نوار، جهت پر شدن برعکس می‌شود.

تفاوت setInterval و setTimeout چیست؟

setTimeout یک کار را یک‌بار بعد از مدت مشخص انجام می‌دهد؛ setInterval آن را در فاصله‌های منظم تکرار می‌کند تا با clearInterval متوقف شود.

چطور درصد واقعی آپلود فایل را نشان دهم؟

با XMLHttpRequest و رویداد upload.onprogress می‌توانید loaded تقسیم بر total را محاسبه کنید و همان عدد را به percent بدهید.

این کد در وردپرس کار می‌کند؟

بله؛ HTML را در بلوک HTML سفارشی و کد جاوااسکریپت را بعد از آن یا در فوتر سایت قرار دهید.

دانلود از گیت هاب ناشر سورس کد

دانلود فایل

پسورد فایل : ندارد

author-avatar

درباره مهدی حبیبی

مهدی حبیبی، بنیان‌گذار طاووس وب و برنامه‌نویس فرانت‌اند با بیش از ۵ سال تجربه در طراحی سایت و بیش از ۵۰ پروژهٔ انجام‌شده. تخصصش وردپرس، المنتور، ووکامرس، سئو و بهینه‌سازی سرعت است و تجربهٔ پروژه‌های واقعی را در طاووس وب به زبان ساده آموزش می‌دهد. و البته مجنون قهوه!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *