<div class="radikalwp-counter" data-counter data-target="342"><span class="radikalwp-counter-num" data-counter-num>۰<//span><span class="radikalwp-counter-label">اسنیپت آماده<//span><//div>
.radikalwp-counter {
display: inline-flex;
flex-direction: column;
align-items: center;
gap: 4px;
padding: 22px 34px;
background: #fff;
border: 1.5px solid #e2e8f0;
border-radius: 16px;
}
.radikalwp-counter-num {
font-size: 34px;
font-weight: 900;
color: #4f46e5;
font-variant-numeric: tabular-nums;
line-height: 1.2;
}
.radikalwp-counter-label { font-size: 12.5px; font-weight: 700; color: #64748b; }
// شمارش انیمیشنی تا مقدار هدف هنگام ورود به دید + اعداد فارسی
(function () {
var faDigits = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
function faNum(n) { return String(n).replace(/\d/g, function (d) { return faDigits[+d]; }); }
var els = document.querySelectorAll('[data-counter]');
if (!('IntersectionObserver' in window)) {
els.forEach(function (el) { el.querySelector('[data-counter-num]').textContent = faNum(el.dataset.target); });
return;
}
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
if (!entry.isIntersecting || entry.target.dataset.done) return;
entry.target.dataset.done = '1';
var target = parseInt(entry.target.dataset.target, 10) || 0;
var num = entry.target.querySelector('[data-counter-num]');
var start = null, DURATION = 1400;
function step(ts) {
if (!start) start = ts;
var p = Math.min((ts - start) / DURATION, 1);
var eased = 1 - Math.pow(1 - p, 3);
num.textContent = faNum(Math.round(target * eased));
if (p < 1) requestAnimationFrame(step);
}
requestAnimationFrame(step);
});
}, { threshold: .5 });
els.forEach(function (el) { io.observe(el); });
})();
درباره این اسنیپت
عدد آماری که هنگام ورود به دید، از صفر با شتاب تا مقدار نهایی میشمارد؛ بازخورد زندهای برای آمار کاربران، فروش و پروژهها. با IntersectionObserver فقط وقتی کاربر به آن میرسد اجرا میشود و اجرای دوباره صفحه را سنگین نمیکند. اعداد فارسی و جداکننده هزارگان از پیش پشتیبانی میشوند. برای ردیف آمار صفحه اصلی و صفحه درباره ما مناسب است.
پرسشهای متداول
در ویژگی data-target روی عنصر اصلی؛ JS همان را میخواند. اگر مقدار از سرور میآید، همان ویژگی را داینامیک پر کنید.
برچسب data-done از شمارش تکراری هنگام اسکرول بالا و پایین جلوگیری میکند؛ اگر رفتار هر بار دید میخواهید، آن برچسب را حذف کنید.
با ease-out مکعبی شروع تند و پایان آرام دارد؛ حس طبیعی رسیدن به عدد. برای شمارش خطی، eased را همان p بگذارید.
امتیاز شما به این محتوا
میانگین امتیاز کاربران: ۴.۶ از ۳ رأی — برای امتیازدهی وارد شوید
دیدگاهها (۰)
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!