كيفية بناء معرض جذاب للصور يستجيب لجميع الشاشات مع slick.js
Arabic (العربية/عربي) translation by Amr Salah (you can also view the original English article)
في هذا البرنامج التعليمي ، سنستخدم slick.js ، وهو ملحق jQuery شائع ، لإنشاء معرض صور جذاب سريع الاستجابة. في ما يلي المعرض الذي سننشئه:
احرص على التحقق من إصدار الشاشة الكاملة وتغيير حجم نافذة المتصفح لمعرفة كيف يتغير تنسيقه اعتمادًا على حجم إطار العرض.
ماهو slick.js؟
"Slick.js" هو ملحق jQuery مشهور تم إنشاؤه بواسطة Ken Wheeler والذي يتيح لك إنشاء دوارات متجاوبة جميلة. لفهم أفضل لما يمكن أن يقدمه لك هذا المكون الإضافي ، راجع الوثائق.
لحسن الحظ ، إنه لا يعمل فقط في جميع المتصفحات الحديثة ، ولكن أيضًا في بعض المتصفحات القديمة مثل "IE 8+".
أخيرًا ، قد ترغب في إلقاء نظرة على إصدار WordPress.
الابتداء مع "slick.js"
لبدء استخدام البقعة ، ابدأ بتنزيل الملفات التالية وتثبيتها في مشروعك:
- jQuery (≥1.7)
-
slick.cssاو النسخة المبسطة
-
slick.jsاو النسخة المبسطة
اختياريًا ، قد ترغب في استيراد ملف slick-theme.css.
يمكنك الحصول على نسخة من ملفات "slick" عن طريق زيارة موقع Github repo ، باستخدام مدير الحزم (مثل npm) ، أو عن طريق تحميل الأصول الضرورية من خلال CDN (مثل cdnjs). في هذا البرنامج التعليمي ، سأختار الخيار الأخير.
بالإضافة إلى ذلك ، أدرجت Babel لتجميع رمز ES6 إلى ES5 و Lodash للاستفادة من وظيفة debounce (سنستخدم ذلك لاحقًا).
مع وضع ذلك في الاعتبار ، إذا نظرت أسفل علامة التبويب الإعدادات في القلم التجريبي ، فسترى أنني قد ضمّنت ملف CSS خارجيًا واحدًا وثلاثة ملفات جافا سكريبت خارجية.






الHTML
من المهم في هذه المرحلة فهم بنية صفحتنا. والأهم من ذلك ، أننا سنحدد نوعين من دوارات تحمل الصور نفسها وتتم مزامنتها (سنناقش كيفية ذلك لاحقًا). أبعاد الصورة هي 860 × 550 بكسل ، على الرغم من أنها قد تكون مختلفة في مشاريعك الخاصة.
أخيرًا ، كجزء من الرف الدائري الثاني ، سنحدد أسهم التنقل بالإضافة إلى عنصر يتتبع إجمالي عدد الشرائح.
إليك الهيكل المطلوب لصفحتنا التجريبية:
1 |
<div class="loading">Carousel is loading...</div> |
2 |
<div class="container"> |
3 |
<div class="synch-carousels"> |
4 |
|
5 |
<div class="left child"> |
6 |
<div class="gallery"> |
7 |
<div class="item"> |
8 |
<img src="IMG_SRC" alt=""> |
9 |
</div>
|
10 |
<!-- 4 more images here -->
|
11 |
</div>
|
12 |
</div><!--/left--> |
13 |
|
14 |
<div class="right child"> |
15 |
<div class="gallery2"> |
16 |
<div class="item"> |
17 |
<img src="IMG_SRC" alt=""> |
18 |
</div>
|
19 |
<!-- 4 more images here -->
|
20 |
</div>
|
21 |
<div class="nav-arrows"> |
22 |
<button class="arrow-left"> |
23 |
<!--svg here-->
|
24 |
</button>
|
25 |
<button class="arrow-right"> |
26 |
<!--svg here-->
|
27 |
</button>
|
28 |
</div>
|
29 |
<div class="photos-counter"> |
30 |
<span></span><span></span>
|
31 |
</div>
|
32 |
</div><!--/right--> |
33 |
|
34 |
</div>
|
35 |
</div>
|
الCSS
في المجمل ، يجب أن يكون معرضنا يحتوي على أربعة مظاهر مختلفة ، حسب منفذ العرض المتاح. دعنا نتخيلها باتباع نهج الجوّال أولاً.
عندما تكون نافذة المتصفح أقل من 480 بكسل ، يجب أن تبدو مثل هذا ، مع ظهور الرف الدائري الثاني والتنقل فقط:



بعد ذلك ، على الشاشات بين 480 بكسل و 768 بكسل ، يجب أن تكون على النحو التالي ، مع صورتين مصغرتين أسفل الشريحة الرئيسية:



بعد ذلك ، على الشاشات بين 769 بكسل و 1023 بكسل ، سنقدم صورة مصغرة ثالثة:



أخيرًا ، على الشاشات الكبيرة (≥1024 بكسل) ، يجب أن يكون على النحو التالي ، مع ظهور الصور المصغرة للجانب (لاحظ أنها لا تتناسب تمامًا مع هذه الصورة بالكامل):



يتم تلبية جميع الحالات المذكورة أعلاه في استعلامات الوسائط الموضحة أدناه:
1 |
.synch-carousels { |
2 |
position: relative; |
3 |
display: flex; |
4 |
flex-wrap: wrap; |
5 |
justify-content: space-between; |
6 |
}
|
7 |
|
8 |
.synch-carousels > * { |
9 |
width: 100%; |
10 |
}
|
11 |
|
12 |
.synch-carousels .right { |
13 |
order: -1; |
14 |
}
|
15 |
|
16 |
.synch-carousels .left { |
17 |
overflow: hidden; |
18 |
}
|
19 |
|
20 |
.synch-carousels .gallery { |
21 |
display: none; |
22 |
}
|
23 |
|
24 |
.synch-carousels .gallery .slick-list { |
25 |
height: auto !important; |
26 |
margin: 0 -20px; |
27 |
}
|
28 |
|
29 |
.synch-carousels .gallery .slick-slide { |
30 |
margin: 0 20px; |
31 |
}
|
32 |
|
33 |
@media screen and (min-width: 480px) { |
34 |
.synch-carousels .right { |
35 |
margin-bottom: 20px; |
36 |
}
|
37 |
|
38 |
.synch-carousels .gallery { |
39 |
display: block; |
40 |
}
|
41 |
}
|
42 |
|
43 |
@media screen and (min-width: 1024px) { |
44 |
.synch-carousels .right { |
45 |
position: relative; |
46 |
width: calc(100% - 230px); |
47 |
margin-bottom: 0; |
48 |
order: 2; |
49 |
}
|
50 |
|
51 |
.synch-carousels .left { |
52 |
width: 210px; |
53 |
}
|
54 |
|
55 |
.synch-carousels .gallery .slick-slide { |
56 |
margin: 0 0 20px 0; |
57 |
}
|
58 |
|
59 |
.synch-carousels .gallery .slick-list { |
60 |
margin: 0; |
61 |
}
|
62 |
}
|
لاحظ أن هناك قاعدة مهمة !. هذه الكتابة فوق نمط سطري مضمنة.
الJavaScript
دعنا الآن ننتقل إلى الأشياء المتعلقة بـ JavaScript
مختصرات التخزين المؤقت Caching Selectors
عندما يكون "DOM" جاهزًا ، كممارسة جيدة ، نقوم بتخزين بعض المحددات الشائعة الاستخدام:
1 |
const $left = $(".left"); |
2 |
const $gl = $(".gallery"); |
3 |
const $gl2 = $(".gallery2"); |
4 |
const $photosCounterFirstSpan = $(".photos-counter span:nth-child(1)"); |
تهيئة الCarousels
ثم ، نقوم بتهيئة ومزامنة دوارتنا. رمز المسؤول عن هذا السلوك كما يلي:
1 |
$gl.slick({ |
2 |
rows: 0, |
3 |
slidesToShow: 2, |
4 |
arrows: false, |
5 |
draggable: false, |
6 |
useTransform: false, |
7 |
mobileFirst: true, |
8 |
responsive: [ |
9 |
{
|
10 |
breakpoint: 768, |
11 |
settings: { |
12 |
slidesToShow: 3 |
13 |
}
|
14 |
},
|
15 |
{
|
16 |
breakpoint: 1023, |
17 |
settings: { |
18 |
slidesToShow: 1, |
19 |
vertical: true |
20 |
}
|
21 |
}
|
22 |
]
|
23 |
});
|
24 |
|
25 |
$gl2.slick({ |
26 |
rows: 0, |
27 |
useTransform: false, |
28 |
prevArrow: ".arrow-left", |
29 |
nextArrow: ".arrow-right", |
30 |
fade: true, |
31 |
asNavFor: $gl |
32 |
});
|
لا شك أن أفضل طريقة لفهم كيفية عمل هذا الكود هي قراءة وثائق slick ومع ذلك ، اسمحوا لي أن أشرح شيئين هامين هنا:
- يتيح لنا خيار التكوين asNavFor مزامنة الدارات الدوارة واستخدام أحدها كnavigation للآخر.
- بشكل افتراضي ، يستخدم برنامج Slick تحويلات CSS. في حالتنا على الرغم من ذلك ، نقوم بتعطيلها عن طريق تحديد
UseTransform: false. هذا لأنهم يسببون وميضًا صغيرًا في الشريحة الأولى من الcarousel الأول على الشاشات الكبيرة (كان من الممكن أن نعطلهم فقط في الcarousel الأول).
عرض وتخصيص تخطيط المعرض
يجب ألا يكون معرضنا مرئيًا إلا عندما تكون جميع أصول الصفحة جاهزة. في البداية ، تظهر أداة التحميل المسبق الاختيارية - يمكنك الرجوع إلى الترميز مرة أخرى ، يبدو كالتالي:
1 |
<div class="loading">Carousel is loading...</div> |
في هذه المرحلة ، يتعين علينا التفكير مرة أخرى في تصميم المعرض المطلوب على الشاشات الكبيرة. إذا نظرت مرة أخرى إلى لقطات الشاشة المقابلة ، فستلاحظ أن كلاً من ال carousels لها نفس الارتفاع. من أجل تحقيق هذا السلوك المطلوب ، يتعين علينا كتابة بعض شفرات جافا سكريبت المخصصة (ما وراء CSS). سيقوم هذا الرمز بتعيين ارتفاع لcarousel الأول بشكل حيوي يساوي ارتفاع الثاني (أو العكس).
عند معرفة المتطلبات أعلاه ، إليك الشفرة التي يتم تشغيلها عندما تكون الصفحة بأكملها جاهزة:
1 |
$(window).on("load", () => { |
2 |
handleCarouselsHeight(); |
3 |
setTimeout(() => { |
4 |
$(".loading").fadeOut(); |
5 |
$("body").addClass("over-visible"); |
6 |
}, 300); |
7 |
});
|
وإليك تعريف وظيفة handleCarouselsHeight
1 |
function handleCarouselsHeight() { |
2 |
if (window.matchMedia("(min-width: 1024px)").matches) { |
3 |
const gl2H = $(".gallery2)").height(); |
4 |
$left.css("height", gl2H); |
5 |
} else { |
6 |
$left.css("height", "auto"); |
7 |
}
|
8 |
}
|
عندما يتم تحميل الصفحة ، يعمل المعرض جيدًا. ولكن يجب أن تعمل أيضًا كما هو متوقع عندما يتم تغيير حجم نافذة المتصفح.
يظهر الرمز الذي يتعامل مع هذا الموقف بالتحديد أدناه:
1 |
$(window).on( |
2 |
"resize", |
3 |
_.debounce(() => { |
4 |
handleCarouselsHeight(); |
5 |
}, 200) |
6 |
);
|
لاحظ أن معالج الحدث يتم تغليفه داخل وظيفة debounce. هذه وظيفة "Lodash" التي تساعدنا على تقييد مقدار المرات التي يتم فيها استدعاء هذا المعالج.
العمل مع الأحداث وطرق slick
الآن بعد أن نجحنا في تنفيذ الوظيفة الرئيسية لمعرضنا ، دعنا نذهب خطوة أبعد ونبني بضعة أشياء اختيارية.
أولاً ، في الزاوية العلوية اليمنى من الcarousel الثاني ، نعرض الشريحة الحالية والعدد الإجمالي للشرائح.



لتحقيق ذلك ، نستفيد من أحداث init وبعد afterChange.
ليك الشفرة ذات الصلة:
1 |
/*you have to bind init event before slick's initialization (see demo) */
|
2 |
gl2.on("init", (event, slick) => { |
3 |
$photosCounterFirstSpan.text(`${slick.currentSlide + 1}/`); |
4 |
$(".photos-counter span:nth-child(2)").text(slick.slideCount); |
5 |
});
|
6 |
|
7 |
$gl2.on("afterChange", (event, slick, currentSlide) => { |
8 |
$photosCounterFirstSpan.text(`${slick.currentSlide + 1}/`); |
9 |
});
|
كإجراء تحسين إضافي ، في كل مرة ننقر فيها على شريحة من الcarousel الاول,يجب أن تكون الشريحة المقترنة من الcarousel, الثاني نشطة. بفضل طريقة slickGoTo من slick ، يمكننا تطوير هذه الوظيفة.
إليك الشفرة ذات الصلة:
1 |
$(".gallery .item").on("click", function() { |
2 |
const index = $(this).attr("data-slick-index"); |
3 |
$gl2.slick("slickGoTo", index); |
4 |
});
|
4. دعم المتصفح
يجب أن يعمل العرض التوضيحي بشكل جيد في جميع المتصفحات الحديثة ويمكنك استخدامه بأمان في مشاريعك.
لم أواجه سوى خطأ واحد صغير في بعض المتصفحات (Firefox و Edge) أثناء اختبار العرض التوضيحي على الشاشات الكبيرة. عندما تنقر على أسهم التنقل ، تفشل جميع الشرائح في أول carousel بعيدًا عن الأولى ، في الوصول إلى الحافة العليا لوالدهم وترك فجوة بكسل واحدة:



وأخيرًا وليس آخرًا ، قد يلزم إدخال تحسينات وتخصيصات صغيرة عند تغيير حجم النافذة ، اعتمادًا على احتياجاتك.
الاستنتاج !
في هذا البرنامج التعليمي ، استفدنا من "slick.js" وتمكننا من إنشاء معرض سريع الاستجابة. نأمل الآن ، أنت على استعداد لتجربة هذا التنفيذ في مشاريعك الخاصة. إذا حدث ذلك ، فلا تتردد في مشاركة رابط مشروعك في التعليقات أدناه!
المزيد من مشاريع جافا سكريبت لزيادة التأثير على مواقع الويب الخاصة بك


أداءتحسين الأداء: كيفية تحميل الصور باستخدام |"inview.js"Louie Rootfield

Flickityبناء شريحة بواسطة Flickity MetafizzyThoriq Firdaus

jQueryنصيحة سريعة: انتقل إلى الرسوم المتحركة مع "fullPage.js" و "Animate.css"George Martsoukos

JavaScriptكيفية إنشاء شريحة انقسام الشاشة بواسطة جافا سكريبتAdi Purdila



