كيفية إنشاء انتقالات وتمريرات بصرية جميلة في Angular باستخدام GSAP
مقدمة: لماذا تُعد الحركات البصرية مهمة في مواقع الويب الحديثة؟
لم يعد وجود موقع إلكتروني وحده كافياً لجذب المستخدمين والاحتفاظ بهم. المستخدم اليوم يتوقع واجهة نظيفة، تجربة استخدام سلسة، وتفاعلاً بصرياً يمنحه شعوراً بالحيوية أثناء التنقل داخل الصفحات. ومن أكثر أشكال التفاعل انتشاراً ذلك الذي يحدث أثناء التمرير داخل الصفحة، حيث يمكن للحركات المدروسة أن تجعل المحتوى أكثر تشويقاً وأسهل في الاستيعاب.
عندما تقضي الزوار وقتاً أطول في التفاعل مع الموقع، فإن ذلك ينعكس إيجابياً على مؤشرات مهمة مثل تقليل معدل الارتداد وتحسين تجربة المستخدم، وهو ما قد يدعم الأداء في نتائج البحث بشكل غير مباشر. في هذا الدليل العملي سنتعرف على كيفية تنفيذ ثلاثة من أشهر تأثيرات التمرير في Angular: تأثير Parallax، وتأثير Fade، وتأثير Slide، بالاعتماد على مكتبة GSAP.

معاينة التأثيرات النهائية قبل البدء
قبل الدخول في خطوات التنفيذ، من المفيد إلقاء نظرة على النتيجة المتوقعة لكل نوع من الحركات:

تأثير البارالاكس: يمنح الخلفية والعناصر إحساساً بالعمق أثناء التمرير. يمكن مشاهدة نموذج تجريبي عبر الرابط التالي: عرض نموذج Parallax.

تأثير التلاشي: يُظهر الأقسام تدريجياً أثناء التمرير للحصول على انتقال ناعم. يمكن مشاهدة النموذج عبر: عرض نموذج Fade.

تأثير الانزلاق: ينقل الأقسام بصرياً بطريقة ديناميكية وسهلة الفهم. يمكن مشاهدة النموذج عبر: عرض نموذج Slide.
متطلبات المشروع والأدوات المستخدمة
البيئة البرمجية المطلوبة
سنستخدم في هذا المشروع إطار العمل Angular 11، مع محرر الشيفرة VS Code. أما الحركات نفسها فسننفذها باستخدام مكتبة GSAP، وهي واحدة من أقوى مكتبات الرسوم الحركية في بيئة JavaScript لما توفره من مرونة وأداء مرتفع.
Angular 11VS CodeGSAP- معرفة أساسية بالمكونات والمسارات في
Angular
إنشاء مشروع Angular وتجهيز المكتبات
إنشاء المشروع
ابدأ بإنشاء مشروع جديد عبر الطرفية باستخدام الأمر التالي. احرص على تفعيل خاصية Routing عند ظهور السؤال الخاص بها:
ng new animations --style css
سيؤدي هذا الأمر إلى إنشاء مشروع باسم animations مع اعتماد تنسيق CSS للأنماط.
تثبيت مكتبة GSAP
بعد فتح المشروع داخل VS Code، نفّذ الأمر التالي لتثبيت مكتبة GSAP وملفات الأنواع:
npm install --save gsap @types/gsap
يوفر الحزمة @types/gsap تعريفات تساعد TypeScript على فهم بنية المكتبة بشكل أفضل أثناء التطوير.
إنشاء المكونات الأساسية
سنحتاج إلى ثلاثة مكونات مستقلة، كل واحد منها يمثل نوعاً مختلفاً من تأثيرات التمرير:
ng g c parallax
ng g c fade
ng g c slide
ضبط المسارات داخل التطبيق
حتى نتمكن من استعراض كل تأثير بشكل مستقل، أنشئ ثلاثة مسارات: /parallax و/fade و/slide. افتح الملف app-routing.module.ts وأضف المسارات المناسبة كما يلي:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ParallaxComponent } from './parallax/parallax.component';
import { FadeComponent } from './fade/fade.component';
import { SlideComponent } from './slide/slide.component';
const routes: Routes = [
{ path: 'parallax', component: ParallaxComponent },
{ path: 'fade', component: FadeComponent },
{ path: 'slide', component: SlideComponent },
{ path: '', redirectTo: 'parallax', pathMatch: 'full' }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
كيفية إنشاء تأثير Parallax في Angular
فكرة التأثير
يعتمد تأثير Parallax على تحريك الخلفية أو بعض العناصر بسرعة مختلفة عن بقية المحتوى أثناء التمرير، ما يخلق إحساساً بالعمق ويجعل الصفحة أكثر حيوية.
إعداد ملف HTML للمكون
افتح الملف parallax.component.html وضع داخله بنية أقسام تعتمد على section، على سبيل المثال:
<section class="bg">
<h1>Parallax Section 1</h1>
</section>
<section>
<h1>Parallax Section 2</h1>
</section>
<section class="bg">
<h1>Parallax Section 3</h1>
</section>
إضافة التنسيقات العامة المشتركة
بما أن الأقسام ستُستخدم في أكثر من مكون، فمن الأفضل وضع التنسيقات العامة داخل الملف styles.css:
section {
height: 100vh;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
font-size: 3rem;
color: white;
}
في هذا النمط جعلنا كل قسم يملأ كامل ارتفاع الشاشة باستخدام 100vh، كما قمنا بتوسيط المحتوى أفقياً وعمودياً للحصول على مظهر واضح ومتوازن.
تنسيقات خاصة بخلفية البارالاكس
افتح الملف parallax.component.css وأضف تنسيقات للفئة bg:
.bg {
background-image: url('https://picsum.photos/1600/900');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
إضافة منطق الحركة في TypeScript
الآن افتح الملف parallax.component.ts وأضف منطق الحركة داخل الدالة ngOnInit(). المثال التالي يوضح الفكرة العامة:
import { Component, OnInit } from '@angular/core';
import { gsap } from 'gsap';
import { ScrollTrigger } from 'gsap/all';
gsap.registerPlugin(ScrollTrigger);
@Component({
selector: 'app-parallax',
templateUrl: './parallax.component.html',
styleUrls: ['./parallax.component.css']
})
export class ParallaxComponent implements OnInit {
ngOnInit(): void {
gsap.utils.toArray('.bg').forEach((section: any) => {
gsap.to(section, {
backgroundPosition: `50% ${window.innerHeight / 2}px`,
ease: 'none',
scrollTrigger: {
trigger: section,
scrub: true
}
});
});
}
}
الفكرة هنا أن مكتبة GSAP تربط تحريك الخلفية بحركة التمرير نفسها من خلال الإضافة ScrollTrigger، وهذا يمنحك تأثيراً سلساً ومتزامناً مع سلوك المستخدم.
الاستيرادات الضرورية لتجنب الأخطاء
إذا لم تضف الاستيرادات الصحيحة فلن يتمكن المشروع من الترجمة بنجاح. تأكد من وجود السطور التالية أعلى الملف:
import { gsap } from 'gsap';
import { ScrollTrigger } from 'gsap/all';
بعد ذلك يمكنك زيارة المسار http://localhost:4200/parallax لمشاهدة التأثير.
كيفية إنشاء تأثير Fade أثناء التمرير
متى يكون تأثير التلاشي مناسباً؟
يُعد تأثير Fade مثالياً عندما ترغب في عرض الأقسام بالتتابع وبشكل هادئ دون تحريك كبير للعناصر. هذا النوع مناسب للقصص البصرية، العروض التعريفية، والصفحات التسويقية التي تركز على إبراز الرسالة خطوة بخطوة.
بنية HTML لمكون Fade
افتح الملف fade.component.html وضع داخله عدة أقسام متتالية:
<section>
<h1>Fade Section 1</h1>
</section>
<section class="fade-out">
<h1>Fade Section 2</h1>
</section>
<section class="fade-out">
<h1>Fade Section 3</h1>
</section>
تنسيق الأقسام وإخفاء العناصر مبدئياً
داخل الملف fade.component.css يمكنك استخدام أنماط شبيهة بالتالي:
section {
position: fixed;
top: 0;
left: 0;
opacity: 0;
width: 100%;
height: 100vh;
}
section:first-child {
opacity: 1;
}
الهدف من ذلك هو إظهار قسم واحد فقط في كل مرة، مع تثبيت موضع الأقسام حتى يحدث التبديل بصرياً من خلال الشفافية بدلاً من تغيير الترتيب داخل الصفحة.
إضافة الحركة عبر TypeScript
الآن افتح الملف fade.component.ts وأضف منطق التدرج البصري:
import { Component, OnInit } from '@angular/core';
import { gsap } from 'gsap';
import { ScrollTrigger } from 'gsap/all';
gsap.registerPlugin(ScrollTrigger);
@Component({
selector: 'app-fade',
templateUrl: './fade.component.html',
styleUrls: ['./fade.component.css']
})
export class FadeComponent implements OnInit {
ngOnInit(): void {
const sections = gsap.utils.toArray('section');
sections.forEach((section: any, index: number) => {
if (index !== 0) {
gsap.to(section, {
opacity: 1,
scrollTrigger: {
trigger: section,
start: 'top center',
end: 'bottom center',
scrub: true
}
});
}
});
}
}
بهذا الأسلوب تصبح الأقسام التالية مرئية تدريجياً أثناء التمرير، ما ينتج انتقالاً ناعماً ومريحاً للعين. يمكنك اختبار النتيجة عبر المسار http://localhost:4200/fade.
كيفية إنشاء تأثير Slide في Angular
لماذا يُعد تأثير الانزلاق من أبسط التأثيرات؟
تأثير Slide واضح بصرياً وسهل التنفيذ، لأنه يعتمد غالباً على تغيير موضع العنصر على المحور الأفقي أو العمودي أثناء التمرير. وهو مناسب للمحتوى الذي يحتاج إلى إبراز انتقالات واضحة بين الأقسام.
إعداد HTML لمكون Slide
افتح الملف slide.component.html وضع بنية مشابهة لما يلي:
<section>
<h1>Slide Section 1</h1>
</section>
<section>
<h1>Slide Section 2</h1>
</section>
<section>
<h1>Slide Section 3</h1>
</section>
في هذا النوع من التأثيرات لا تحتاج بالضرورة إلى تنسيقات إضافية معقدة إذا كانت التنسيقات العامة للأقسام جاهزة مسبقاً.
إضافة الحركة في ملف TypeScript
افتح الملف slide.component.ts ثم أضف منطق الانزلاق:
import { Component, OnInit } from '@angular/core';
import { gsap } from 'gsap';
import { ScrollTrigger } from 'gsap/all';
gsap.registerPlugin(ScrollTrigger);
@Component({
selector: 'app-slide',
templateUrl: './slide.component.html',
styleUrls: ['./slide.component.css']
})
export class SlideComponent implements OnInit {
ngOnInit(): void {
gsap.utils.toArray('section').forEach((section: any) => {
gsap.from(section, {
x: 200,
opacity: 0,
duration: 1,
scrollTrigger: {
trigger: section,
start: 'top 80%',
end: 'top 40%',
scrub: true
}
});
});
}
}
عند زيارة المسار http://localhost:4200/slide ستلاحظ انتقال الأقسام بانزلاق تدريجي يمنح الصفحة إيقاعاً بصرياً جذاباً.
أفضل الممارسات عند استخدام الحركات في مواقع Angular
لا تُفرط في استخدام التأثيرات
الحركات تضيف قيمة حقيقية عندما تُستخدم باعتدال. لكن المبالغة في الرسوم المتحركة قد تؤدي إلى تشتيت المستخدم وإبطاء الصفحة، خصوصاً إذا كانت مصحوبة بصور ثقيلة أو تأثيرات معقدة بلا هدف.
ركّز على الأداء وتجربة المستخدم
- استخدم صوراً محسنة الحجم قبل إضافتها إلى المشروع.
- اجعل الحركة تخدم المعنى بدلاً من أن تكون مجرد زينة.
- اختبر الصفحة على الهواتف والأجهزة الأضعف أداءً.
- احرص على أن يكون المحتوى قابلاً للقراءة حتى مع تعطيل الحركة.
- قلل عدد المؤثرات المتزامنة في الشاشة الواحدة.
متى تختار كل نوع من التأثيرات؟
| التأثير | أفضل استخدام | النتيجة البصرية |
|---|---|---|
Parallax |
الصفحات التعريفية والقصص البصرية | إحساس بالعمق والحيوية |
Fade |
العروض التتابعية والرسائل التسويقية | انتقال هادئ وسلس |
Slide |
إبراز الأقسام والخطوات المتتابعة | حركة واضحة ومباشرة |
نصائح تقنية لتحسين قابلية القبول في AdSense
إذا كنت تنشر هذا النوع من المحتوى في مدونة تقنية، فاحرص على أن يكون المقال مفيداً بالفعل، لا مجرد تجميع أو ترجمة حرفية. المحتوى الجيد الذي يشرح المفهوم ويقدم أمثلة عملية ويستخدم لغة سليمة ومنظمة تكون فرصته أفضل في بناء الثقة مع القارئ وتحسين جودة الموقع ككل.
- اكتب مقدمة توضح الفائدة العملية للقارئ.
- استخدم عناوين فرعية واضحة تتضمن الكلمات المفتاحية بشكل طبيعي.
- قدّم أمثلة قابلة للتطبيق بدلاً من الاكتفاء بالوصف النظري.
- تجنب الحشو وتكرار الفكرة نفسها بصيغ متعددة.
- حافظ على تنسيق منظم وسهل القراءة على الجوال.
الخلاصة التقنية
يمكنك من خلال الجمع بين Angular وGSAP بناء تجربة تمرير أكثر سلاسة وجاذبية دون تعقيد مبالغ فيه. تأثير Parallax مناسب لصناعة العمق البصري، وتأثير Fade ممتاز للانتقالات الناعمة، بينما يظل Slide خياراً عملياً وسهل التنفيذ. تقنياً، السر ليس في كثرة الحركات، بل في اختيار الحركة المناسبة للمكان المناسب مع مراعاة الأداء وسهولة القراءة وتجربة المستخدم.