اسکرول انیمیشنی در صفحات وب
در وبسایتهایی که تک صفحه هستند معمولا منوهای مختلف به جای لینک شدن به صفحات دیگر به صفحهی جاری و یکی از مقادیر idها لینک میشود تا کاربر با کلیک روی آن به بخش مورد نظر منتقل شود. در حالت عادی این انتقال به صورت درجا اتفاق میافتد؛ ما در این نوشته به شما نحوهی اسکرول شدن انیمیشنی بین بخشهای مختلف صفحهی وب را آموزش خواهیم داد. این آموزش با دو روش css و javascript انجام میشود که البته هر کدام آنها به تنهایی کافی هستند اما در صورتی که جاواسکریپت مرورگر کاربر خاموش شود ممکن است javascript کار نکن و در صورتی که کاربر مرورگر قدیمی دارد، ممکن است روش css کار نکند. موضوع ساپورت شدن توسط کاربران یک بحث سواست اما ایجاد این امکان برای اکثر کاربران قابل مشاهده است و نیاز به نگرانی خاصی نیست زیرا آن دسته از کاربرانی هم که نتوانند این موضوع را حس کنند به صورت عادی روی بخشها پرش میکنند و تنها انیمیشنی بودن این کار را مشاهده نخواهند کرد.
اسکرول انیمیشنی در صفحات وب
خب اگر کمی با وب کار کنید کد زیر را متوجه خواهید شد:
<a href="#camelcase">برو به فلانجای صفحه</a> <div id="camelcase"> اینجا فلان جای صفحه است. </div>
کد بالا یک تگ a که مربوط به هایپرلینکها است را دارا است که اگر به خصیصهی href آن نگاه کنید در داخل آن هیچ آدرسی موجود نیست و تنها مقدار #camelcase در آن موجود است و در خطی پایینتر یک تگ div داریم که id آن برابر camelcase است. در حالت عادی کاربر با کلیک روی عبارت برو به فلانجای صفحه به جایی که یک id با مقدار مورد نظر را پیدا کند خواهد رفت که البته این به صورت پرش یکجا است. اگر نیاز دارید این پرش را به صورت اسکرولی انجام دهید از روشهای زیر استفاده کنید:
اسکرول انیمیشنی به بخشهای صفحه با جاوااسکریپت
برای اینکار کافی است قطعه کد زیر را داخل تگ head صفحهی خود قرار دهید:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
// Add smooth scrolling to all links
$("a").on('click', function(event) {
// Make sure this.hash has a value before overriding default behavior
if (this.hash !== "") {
// Prevent default anchor click behavior
event.preventDefault();
// Store hash
var hash = this.hash;
// Using jQuery's animate() method to add smooth page scroll
// The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
$('html, body').animate({
scrollTop: $(hash).offset().top
}, 800, function(){
// Add hash (#) to URL when done scrolling (default click behavior)
window.location.hash = hash;
});
} // End if
});
});
</script>
پیشنهاد نویسنده: در ارتباط با تفاوت جاوا با جاوااسکریپت بخوانید.
اسکرول انیمیشنی به بخشهای صفحه با css
برای انجام اینکار با کمک کدهای css کافیست قطعه کد زیر را داخل استایل صفحهی خود قرار دهید:
html {
scroll-behavior: smooth;
}
خب با توجه به متن بالاتر در ارتباط با کدهای بالا دو نکته را در نظر بگیرید:
- قطعا کد css سبکتر است و بار اجرایی کمتری خواهد داشت.
- اگر مرورگر کاربر قدیمی است مخصوصا زمانی که با internet explorer به سایت شما مراجعه میکند ممکن است کد css کار نکند.
- اگر کاربر جاوااسکریپت مرورگر خود را غیرفعال کند، کد javascript بالا کار نمیکند.
- استفاده از هر دو کد به طور همزمان نیازی نیست و در صورتی که استفاده کنید هم مشکلی برای شما به وجود نخواهد آورد.
اگر روشهای دیگری برای انجام اینکار سراغ دارید برای ما در بخش نظرات این نوشته ارسال کنید تا با نام خودتان به این نوشته اضافه کنیم.



















آیا امکان توقف یا کنترل دستی اسکرول در حین اجرا وجود داره؟
بله، با جاوااسکریپت میتوان اسکرول انیمیشنی را کنترل کرد. برای مثال میتوان با استفاده از تابع stop() در jQuery یا مدیریت رویدادهای کاربر مانند scroll و wheel، انیمیشن را متوقف یا سرعت آن را تغییر داد. در CSS این قابلیت محدود است و فقط رفتار Smooth ثابت دارد.
استفاده از انیمیشن اسکرول روی تجربه کاربری تاثیر مثبتی داره یا باعث طولانی شدن میشه؟
اسکرول انیمیشنی باعث ایجاد حس روانی و جذابیت بصری میشود و تجربه کاربری را بهتر میکند، مخصوصاً در صفحات تکصفحهای. اما اگر انیمیشن خیلی طولانی باشد، ممکن است حس کند بودن صفحه ایجاد شود؛ معمولاً 300 تا 800 میلیثانیه مناسب است.
آیا امکان تعریف سرعتهای متفاوت برای لینکهای مختلف وجود داره؟
بله، در نسخه جاوااسکریپت میتوان برای هر لینک مقدار متفاوتی برای زمان انیمیشن تعیین کرد.
اگر داخل صفحه هدر ثابت داشته باشیم، اسکرول انیمیشنی دقیقا تا کجا میره؟
به صورت پیشفرض اسکرول به بالای عنصر هدف میرود، بنابراین هدر ثابت ممکن است بخشی از محتوا را بپوشاند. برای رفع این مشکل میتوان با جاوااسکریپت یک offset تعریف کرد تا محتوای هدف زیر هدر قرار بگیرد:
scrollTop: $(hash).offset().top - $('header').outerHeight()به این شکل اسکرول دقیقاً با در نظر گرفتن ارتفاع هدر انجام میشود.
تفاوت سرعت و عملکرد روش CSS با روش jQuery در پروژههای سنگین چقدره؟
روش CSS سبکتر و سریعتر است و هیچ پردازش اضافی روی DOM ندارد، حتی در صفحات سنگین عملکرد روانتر است. روش jQuery کمی سنگینتر است چون نیاز به محاسبه موقعیت عناصر و اجرای تابع animate() دارد، اما انعطافپذیری بیشتری برای کنترل رفتار، سرعت، و offset ارائه میدهد.