یک کامپوننت فیلتر کشویی جاوا اسکریپت با URL های قابل اشتراک گذاری بسازید

یک کامپوننت فیلتر کشویی جاوا اسکریپت با URL های قابل اشتراک گذاری بسازید

در این آموزش جدید، نحوه ایجاد یک مولفه فیلتر کشویی جاوا اسکریپت را می آموزیم که در آن هر گزینه فیلتر یک URL قابل اشتراک گذاری منحصر به فرد خواهد داشت. هنگامی که یک گزینه خاص را فیلتر می کنیم، URL صفحه تغییر می کند. سپس، اگر آن URL را بگیریم و آن را در مرورگر/پنجره دیگری باز کنیم، فقط کادرهای مرتبط ظاهر خواهند شد.

پارامتر رنگ اضافیپارامتر رنگ اضافیپارامتر رنگ اضافی

چیزی که قراره بسازیم

در اینجا جزء فیلتر کشویی ما است – حتماً نسخه ی نمایشی را در حالت اشکال زدایی مشاهده کنید و بررسی کنید که URL صفحه پس از فیلتر کردن چگونه تغییر می کند!

1. با نشانه گذاری HTML شروع کنید

داخل ظرفی قرار می دهیم:

  • بسته بندی کشویی و
  • عناصر (جعبه‌هایی) که می‌خواهیم فیلتر کنیم.

بسته بندی کشویی شامل موارد زیر خواهد بود:

  • ماشه کشویی
  • خود کشویی با گزینه های فیلتر موجود (رنگ ها) و
  • شمارنده ای از رنگ های قابل مشاهده

برای گروه بندی جعبه ها تحت یک رنگ خاص، هر کدام از آنها را دریافت می کند data-type ویژگی با مقداری که با مقدار ID مطابقت دارد (می‌توانیم به جای آن از یک ویژگی سفارشی نیز استفاده کنیم) گزینه فیلتر مرتبط.

به طور پیش فرض، تمام کادرها ظاهر می شوند. برای نشان دادن گزینه انتخاب شده مربوطه در منوی کشویی، آیتم والد آن را به آن می دهیم active کلاس

به طور معمول، به عنوان مثال با یک وب سایت وردپرس، همه این داده ها از backend می آیند.

ساختار مورد نیاز را در نظر بگیرید:

1

class="container">

2
  

class="dropdown-wrapper">

3
    
4
      Filter Colors
5
       width="24" height="24" clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" viewBox="0 0 24 24" xmlns="https://www.w3.org/2000/svg">
6
         d="m16.843 10.211c.108-.141.157-.3.157-.456 0-.389-.306-.755-.749-.755h-8.501c-.445 0-.75.367-.75.755 0 .157.05.316.159.457 1.203 1.554 3.252 4.199 4.258 5.498.142.184.36.29.592.29.23 0 .449-.107.591-.291 1.002-1.299 3.044-3.945 4.243-5.498z" />
7
      
8
    
9
    

class="dropdown">

10
      
11
        
  • class="active">
  • 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
        

    class="count">Showing 28 of 28 colors

    24
      
    
    25
      
    26
        
  • class="red" data-type="red">
  • 27
        
  • class="gray" data-type="gray">
  • 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
    }
    

    فیلتر کردن

    هر بار که روی پیوند منوی کشویی کلیک می کنیم، این فیلتر انجام می شود.

    فیلترینگ چگونه کار خواهد کردفیلترینگ چگونه کار خواهد کردفیلترینگ چگونه کار خواهد کرد

    در آن مرحله، ما به موارد زیر رسیدگی خواهیم کرد:

    1. را حذف کنید active کلاس از آیتم منوی کشویی موجود.
    2. اضافه کردن active کلاس به آیتم والد پیوند کلیک شده.
    3. با حذف کردن، فهرست کشویی را مخفی کنید open کلاس از بسته بندی کشویی.
    4. درخواست دادن aria-expanded="false" به دکمه ضامن کشویی.
    5. متن محرک کشویی را با متن پیوند جایگزین کنید.
    6. شناسه پیوند را بگیرید و ارزیابی کنید. اگر شامل all کلمه کلیدی را حذف می کنیم hidden کلاس را از تمام کادرها بازیابی کنید و مقدار پیش فرض را برای متن تریگر کشویی بازیابی کنید. در غیر این صورت، ما را اضافه می کنیم hidden کلاس به جعبه هایی که data-type مقدار با مقدار شناسه پیوند مطابقت ندارد. در همان زمان، ما نیز حذف hidden کلاس از جعبه هایی که data-type مقدار با مقدار شناسه پیوند مطابقت دارد.
    7. متن شمارنده را با تعداد کادرهای قابل مشاهده به روز کنید.

    در اینجا کد جاوا اسکریپت مورد نیاز است:

    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
    });
    

    استفاده کنید replaceState() روش به جای pushState() اگر بخواهید به جای ایجاد یک ورودی جدید، ورودی تاریخچه فعلی را جایگزین کنید. برای درک رفتارهای مختلف، هر دو گزینه را با فیلتر کردن یک انتخاب و سپس زدن دکمه برگشت مرورگر امتحان کنید.

    با این کد اضافی، URL ما تغییر می کند. ولی، آیا پس از بارگذاری مجدد صفحه، محتوای مناسب ظاهر می شود؟ خوب، هنوز نه؛ ما هنوز همه جعبه ها را خواهیم دید. به فقط کادرهای صحیح را در نظر داشته باشید، ما باید یک کد اضافی اضافه کنیم.

    برای دقیق تر، موارد زیر را رعایت می کنیم:

    1. بررسی کنید که آیا URL حاوی موارد زیر است یا خیر color پارامتر.
    2. اگر اینطور باشد، مقدار آن و در نتیجه پیوند گزینه فیلتر هدف را می گیریم.
    3. را حذف کنید active کلاس از آیتم منوی کشویی موجود.
    4. اضافه کردن active کلاس به آیتم والد پیوند.
    5. متن محرک کشویی را با متن پیوند جایگزین کنید.
    6. اضافه کردن hidden کلاس به جعبه هایی که data-type مقدار با پیوند مطابقت ندارد. در همان زمان، ما نیز حذف hidden کلاس از جعبه هایی که data-type ارزش با پیوند مطابقت دارد.
    7. متن شمارنده را با تعداد کادرهای قابل مشاهده به روز کنید.

    در اینجا کد جاوا اسکریپت مورد نیاز است:

    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