در این آموزش جدید، نحوه ایجاد یک مولفه فیلتر کشویی جاوا اسکریپت را می آموزیم که در آن هر گزینه فیلتر یک URL قابل اشتراک گذاری منحصر به فرد خواهد داشت. هنگامی که یک گزینه خاص را فیلتر می کنیم، URL صفحه تغییر می کند. سپس، اگر آن URL را بگیریم و آن را در مرورگر/پنجره دیگری باز کنیم، فقط کادرهای مرتبط ظاهر خواهند شد.
چیزی که قراره بسازیم
در اینجا جزء فیلتر کشویی ما است – حتماً نسخه ی نمایشی را در حالت اشکال زدایی مشاهده کنید و بررسی کنید که URL صفحه پس از فیلتر کردن چگونه تغییر می کند!
1. با نشانه گذاری HTML شروع کنید
داخل ظرفی قرار می دهیم:
- بسته بندی کشویی و
- عناصر (جعبههایی) که میخواهیم فیلتر کنیم.
بسته بندی کشویی شامل موارد زیر خواهد بود:
- ماشه کشویی
- خود کشویی با گزینه های فیلتر موجود (رنگ ها) و
- شمارنده ای از رنگ های قابل مشاهده
برای گروه بندی جعبه ها تحت یک رنگ خاص، هر کدام از آنها را دریافت می کند data-type
ویژگی با مقداری که با مقدار ID مطابقت دارد (میتوانیم به جای آن از یک ویژگی سفارشی نیز استفاده کنیم) گزینه فیلتر مرتبط.
به طور پیش فرض، تمام کادرها ظاهر می شوند. برای نشان دادن گزینه انتخاب شده مربوطه در منوی کشویی، آیتم والد آن را به آن می دهیم active
کلاس
به طور معمول، به عنوان مثال با یک وب سایت وردپرس، همه این داده ها از backend می آیند.
ساختار مورد نیاز را در نظر بگیرید:
1 |
|
2 |
|
3 |
|
4 |
Filter Colors
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
id="all" href="">All Colors
|
13 |
|
14 |
|
15 |
id="red" href="">Red
|
16 |
|
17 |
|
18 |
id="blue" href="">Blue
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
اینجا من فقط استفاده کردم aria-expanded
ویژگی ARIA، اما شما می توانید بر اساس آن بنا کنید و کامپوننت را در دسترس تر کنید!
2. CSS را اضافه کنید
بیایید اکنون روی سبک های کلیدی تمرکز کنیم – فعلاً سبک های مقدماتی را ترک می کنم.
سبک های کشویی
در مورد سبک های کشویی:
- هر دو کلید کشویی و کشویی حداکثر عرض 400 پیکسل خواهند داشت.
- فهرست کرکره ای به طور پیش فرض پنهان می شود، کاملاً در داخل محفظه خود قرار می گیرد و زیر ماشه کشویی قرار می گیرد.
- منوی کشویی دارای ارتفاع ثابت 300 پیکسل خواهد بود، بنابراین به طور پیش فرض، یک نوار اسکرول مدل داده شده ظاهر می شود.
در اینجا این است که چگونه کرکره در حالت بسته و باز به نظر می رسد:
سبک های مرتبط:
1 |
/*CUSTOM VARIABLES HERE*/
|
2 |
|
3 |
.dropdown-wrapper { |
4 |
position: relative; |
5 |
}
|
6 |
|
7 |
.dropdown-wrapper .dropdown-toggle, |
8 |
.dropdown-wrapper .dropdown { |
9 |
width: 100%; |
10 |
max-width: 400px; |
11 |
border-radius: 5px; |
12 |
border: 1px solid #adb5bd; |
13 |
background: var(--white); |
14 |
}
|
15 |
|
16 |
.dropdown-wrapper .dropdown-toggle { |
17 |
display: flex; |
18 |
align-items: center; |
19 |
justify-content: space-between; |
20 |
padding: 0 10px 0 26px; |
21 |
text-align: left; |
22 |
cursor: pointer; |
23 |
font-size: 100%; |
24 |
height: 50px; |
25 |
}
|
26 |
|
27 |
.dropdown-wrapper .dropdown-toggle svg { |
28 |
transition: transform 0.3s; |
29 |
}
|
30 |
|
31 |
.dropdown-wrapper .dropdown { |
32 |
display: none; |
33 |
position: absolute; |
34 |
top: 60px; |
35 |
left: 0; |
36 |
padding: 10px 10px 10px 0; |
37 |
z-index: 1; |
38 |
}
|
39 |
|
40 |
.dropdown-wrapper .dropdown ul { |
41 |
padding: 0; |
42 |
margin: 0; |
43 |
list-style: none; |
44 |
height: 300px; |
45 |
overflow-y: auto; |
46 |
}
|
47 |
|
48 |
.dropdown-wrapper .dropdown ul::-webkit-scrollbar { |
49 |
width: 10px; |
50 |
}
|
51 |
|
52 |
.dropdown-wrapper .dropdown ul::-webkit-scrollbar-thumb { |
53 |
background: #e0e0e0; |
54 |
}
|
55 |
|
56 |
.dropdown-wrapper .dropdown li a { |
57 |
display: block; |
58 |
padding: 15px 26px; |
59 |
color: inherit; |
60 |
text-decoration: none; |
61 |
transition: background 0.1s; |
62 |
}
|
63 |
|
64 |
.dropdown-wrapper .dropdown li.active a, |
65 |
.dropdown-wrapper .dropdown li a:hover { |
66 |
background: var(--light-gray); |
67 |
}
|
سبک جعبه
ما از CSS Grid و قدرتمند آن استفاده خواهیم کرد minmax()
عملکردی برای ایجاد یک طرح چند ستونی پاسخگو بدون استفاده از هرگونه درخواست رسانه ای که در آن هر کادر حداقل 200 پیکسل در 200 پیکسل باشد.
در اینجا طرح به نظر می رسد:
سبک های مرتبط:
1 |
.boxes { |
2 |
display: grid; |
3 |
grid-gap: 10px; |
4 |
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); |
5 |
}
|
6 |
|
7 |
.boxes li { |
8 |
aspect-ratio: 1; |
9 |
}
|
3. جاوا اسکریپت را اعمال کنید
با حرکت رو به جلو، اکنون روی بخش تعامل تمرکز خواهیم کرد!
وضعیت کشویی را تغییر دهید
همانطور که گفته شد، در ابتدا، کشویی ظاهر نمی شود.
یک بار کلیک می کنیم دکمه ماشه، خوب تغییر وضعیت را open
کلاس بسته بندی کشویی که رفتار زیر را ایجاد می کند:
- قابلیت مشاهده کشویی را تغییر دهید.
- دستکاری کنید
aria-expanded
مقدار ویژگی ماشه و همچنین ظاهر و احساس نماد SVG آن.
در اینجا کد جاوا اسکریپت مورد نیاز است:
1 |
const dropdownWrapper =document.querySelector(".dropdown-wrapper"); |
2 |
const dropdownToggle = dropdownWrapper.querySelector(".dropdown-toggle"); |
3 |
const OPEN_CLASS = "open"; |
4 |
|
5 |
dropdownToggle.addEventListener("click", function () { |
6 |
if (this.getAttribute("aria-expanded") == "true") { |
7 |
this.setAttribute("aria-expanded", "false"); |
8 |
} else { |
9 |
this.setAttribute("aria-expanded", "true"); |
10 |
}
|
11 |
dropdownWrapper.classList.toggle(OPEN_CLASS); |
12 |
});
|
و سبک های مربوطه:
1 |
.dropdown-wrapper .dropdown-toggle svg { |
2 |
transition: transform 0.3s; |
3 |
}
|
4 |
|
5 |
.dropdown-wrapper.open .dropdown-toggle svg { |
6 |
transform: rotate(180deg); |
7 |
}
|
8 |
|
9 |
.dropdown-wrapper.open .dropdown { |
10 |
display: block; |
11 |
}
|
فیلتر کردن
هر بار که روی پیوند منوی کشویی کلیک می کنیم، این فیلتر انجام می شود.
در آن مرحله، ما به موارد زیر رسیدگی خواهیم کرد:
- را حذف کنید
active
کلاس از آیتم منوی کشویی موجود. - اضافه کردن
active
کلاس به آیتم والد پیوند کلیک شده. - با حذف کردن، فهرست کشویی را مخفی کنید
open
کلاس از بسته بندی کشویی. - درخواست دادن
aria-expanded="false"
به دکمه ضامن کشویی. - متن محرک کشویی را با متن پیوند جایگزین کنید.
- شناسه پیوند را بگیرید و ارزیابی کنید. اگر شامل
all
کلمه کلیدی را حذف می کنیمhidden
کلاس را از تمام کادرها بازیابی کنید و مقدار پیش فرض را برای متن تریگر کشویی بازیابی کنید. در غیر این صورت، ما را اضافه می کنیمhidden
کلاس به جعبه هایی کهdata-type
مقدار با مقدار شناسه پیوند مطابقت ندارد. در همان زمان، ما نیز حذفhidden
کلاس از جعبه هایی کهdata-type
مقدار با مقدار شناسه پیوند مطابقت دارد. - متن شمارنده را با تعداد کادرهای قابل مشاهده به روز کنید.
در اینجا کد جاوا اسکریپت مورد نیاز است:
1 |
...
|
2 |
|
3 |
dropdownLinks.forEach(function (link) { |
4 |
link.addEventListener("click", function (e) { |
5 |
e.preventDefault(); |
6 |
const parent = this.parentElement; |
7 |
const color = this.getAttribute("id"); |
8 |
// 1
|
9 |
dropdown.querySelector("li.active").classList.remove(ACTIVE_CLASS); |
10 |
// 2
|
11 |
parent.classList.add(ACTIVE_CLASS); |
12 |
// 3
|
13 |
dropdownWrapper.classList.remove(OPEN_CLASS); |
14 |
// 4
|
15 |
dropdownToggle.setAttribute("aria-expanded", false); |
16 |
// 5
|
17 |
dropdownToggleSpan.innerText = this.innerText; |
18 |
|
19 |
// 6
|
20 |
if (color == "all") { |
21 |
boxes.forEach((box) => box.classList.remove(HIDDEN_CLASS)); |
22 |
dropdownToggleSpan.innerText = 'Filter Colors'; |
23 |
// 7
|
24 |
total.innerText = boxes.length; |
25 |
} else { |
26 |
const includedBoxes = boxesList.querySelectorAll( |
27 |
`(data-type="${color}")` |
28 |
);
|
29 |
const excludedBoxes = boxesList.querySelectorAll( |
30 |
`li:not((data-type="${color}"))` |
31 |
);
|
32 |
excludedBoxes.forEach((box) => box.classList.add(HIDDEN_CLASS)); |
33 |
includedBoxes.forEach((box) => box.classList.remove(HIDDEN_CLASS)); |
34 |
// 7
|
35 |
total.innerText = includedBoxes.length; |
36 |
}
|
37 |
});
|
38 |
});
|
🎁 پاداش: URL های منحصر به فرد قابل اشتراک گذاری
تا اینجا، مولفه جاوا اسکریپت فیلتر ما به نظر می رسد عالی! با این حال، بیایید به جلو برویم و هر فیلتر یک URL قابل اشتراک گذاری منحصر به فرد داشته باشد.
این رفتار زیباست مفید در صورتی که بخواهیم کاربران را به صفحه ای بفرستیم که حاوی مولفه فیلتر اما با محتوای از پیش فیلتر شده است. فکر کنید که از دیدگاه بازاریابی برای اجرای کمپین ها چقدر سودمند است. به عنوان مثال، تصور کنید که در یک صفحه فروشگاه اینترنتی واقعی، فیلترها دسته بندی محصولات هستند در حالی که جعبه ها محصولات هستند.
برای انجام این کار، در اولین قدم، URL صفحه را بدون مجبور کردن صفحه به بارگیری مجدد از طریق pushState()
روش بر اساس انتخاب کاربر بر روی منوی کشویی کلیک کنید.
دوباره، برای آزمایش آن، نسخه ی نمایشی را در حالت اشکال زدایی مشاهده کنید. هنگامی که کاربر رنگی را انتخاب می کند، URL صفحه یک پارامتر اضافی دریافت می کند که اگر کاربران همه رنگ ها را انتخاب کنند ناپدید می شود.
در اینجا دو خط اضافی وجود دارد که باید در کد قبلی جاوا اسکریپت جاسازی کنیم:
1 |
dropdownLinks.forEach(function (link) { |
2 |
link.addEventListener("click", function (e) { |
3 |
if (color == "all") { |
4 |
/*extra*/
|
5 |
history.pushState(null, "", location.href.split("?")(0)); |
6 |
} else { |
7 |
/*extra*/
|
8 |
history.pushState(null, "", `?color=${color}`); |
9 |
}
|
10 |
});
|
11 |
});
|
با این کد اضافی، URL ما تغییر می کند. ولی، آیا پس از بارگذاری مجدد صفحه، محتوای مناسب ظاهر می شود؟ خوب، هنوز نه؛ ما هنوز همه جعبه ها را خواهیم دید. به فقط کادرهای صحیح را در نظر داشته باشید، ما باید یک کد اضافی اضافه کنیم.
برای دقیق تر، موارد زیر را رعایت می کنیم:
- بررسی کنید که آیا URL حاوی موارد زیر است یا خیر
color
پارامتر. - اگر اینطور باشد، مقدار آن و در نتیجه پیوند گزینه فیلتر هدف را می گیریم.
- را حذف کنید
active
کلاس از آیتم منوی کشویی موجود. - اضافه کردن
active
کلاس به آیتم والد پیوند. - متن محرک کشویی را با متن پیوند جایگزین کنید.
- اضافه کردن
hidden
کلاس به جعبه هایی کهdata-type
مقدار با پیوند مطابقت ندارد. در همان زمان، ما نیز حذفhidden
کلاس از جعبه هایی کهdata-type
ارزش با پیوند مطابقت دارد. - متن شمارنده را با تعداد کادرهای قابل مشاهده به روز کنید.
در اینجا کد جاوا اسکریپت مورد نیاز است:
1 |
...
|
2 |
|
3 |
// 1
|
4 |
const params = new URLSearchParams(location.search); |
5 |
if (params.has("color")) { |
6 |
// 2
|
7 |
const color = params.get("color"); |
8 |
const link = document.getElementById(color); |
9 |
|
10 |
// 3
|
11 |
dropdown.querySelector("li.active").classList.remove(ACTIVE_CLASS); |
12 |
// 4
|
13 |
link.parentElement.classList.add(ACTIVE_CLASS); |
14 |
// 5
|
15 |
dropdownToggleSpan.innerText = link.innerText; |
16 |
const includedBoxes = boxesList.querySelectorAll(`(data-type="${color}")`); |
17 |
const excludedBoxes = boxesList.querySelectorAll( |
18 |
`li:not((data-type="${color}"))` |
19 |
);
|
20 |
excludedBoxes.forEach((box) => box.classList.add(HIDDEN_CLASS)); |
21 |
includedBoxes.forEach((box) => box.classList.remove(HIDDEN_CLASS)); |
22 |
// 6
|
23 |
total.innerText = includedBoxes.length; |
24 |
}
|
نتیجه
تبریک میگم، مردم! در طول این سفر، ما یک جزء فیلتر کشویی جاوا اسکریپت را توسعه دادیم که فیلتر کردن در سمت مرورگر را مدیریت می کند و URL های قابل شناسایی را ارائه می دهد.
ادامه دهید، اگر می خواهید کد را بهینه کنید و آن را در پروژه های آینده خود امتحان کنید!
قبل از پایان، اجازه دهید یک بار دیگر خلقت امروز را به خود یادآوری کنیم:
اگر میخواهید پیادهسازی معادلی را ببینید که در آن دادهها فیلتر می شوند در سرور قبل از اینکه این بار برای مرورگر آماده شوید، در نظرات آزمایشی به من اطلاع دهید!
مثل همیشه، خیلی ممنون که خواندید!
آموزش های بیشتر فیلترینگ را کشف کنید
آیا می خواهید با CSS و جاوا اسکریپت بر فیلتر سمت مشتری مسلط شوید؟ اگر چنین است، به این آموزش ها نیز نگاهی بیندازید:
منبع: https://webdesign.tutsplus.com/javascript-dropdown-filter-component-with-shareable-urls–cms-108720t