یکی از اولین آموزش‌های من در اینجا در Tuts+ در سال 2015، ایجاد یک منوی کشویی خارج از بوم را با نسخه جی کوئری پوشش داد. mmenu.js. اگر بررسی کنید پروژه نمایشی، متوجه خواهید شد که منو شامل چندین سطح است.

آماده برای یک چالش دیگر؟!

1. علامت گذاری HTML را تعریف کنید

نشانه گذاری برای منوی تلفن همراه ما شامل عناصر زیر است:

  • آ header با یک nav درون آن.
  • آ main جایی که محتوای اصلی صفحه ما زندگی می کند.

درون nav، ما دو قرار می دهیم divس اولین مورد را خواهد داشت header-bar کلاس، در حالی که دومی خواهد داشت menu-wrapper یکی

را .header-bar از سه عنصر تشکیل خواهد شد:

  • منوی جابجایی
  • لوگوی شرکت
  • حساب توییتر این شرکت

درون .menu-wrapper، سه قرار می دهیم divs با کلاس از list-wrapper. ما با آنها تماس خواهیم گرفت پانل ها برای سادگی. موارد قابل توجه:

  • در پنل اول، ساختار منو با آیتم های منوی والد و فرزند را مشخص می کنیم. برای انجام این کار، از یک نشانه گذاری معمولی با لیست های نامرتب تو در تو استفاده می کنیم.
  • پانل های دوم و سوم حاوی الف خواهند بود بازگشت دکمه و یک خالی div با کلاس از sub-menu-wrapper. اطلاعات بیشتر در مورد شغل آنها:

    • دکمه برگشت به ما کمک می کند تا یک سطح بالاتر برویم. گفته شد، از سطح سه به سطح دو و از سطح دو به سطح یک.
    • را .sub-menu-wrapper پانل دوم حاوی پیوندهای سطح دوم خواهد بود. به همین ترتیب، .sub-menu-wrapper پانل سوم پیوندهای سطح سوم را نگه می دارد. ما این پیوندها را به صورت پویا از طریق جاوا اسکریپت درج خواهیم کرد.

با در نظر گرفتن تمام موارد فوق، نشانه گذاری زیر ظاهر می شود:

2. سبک های اصلی را مشخص کنید

بیایید اکنون روی سبک‌های هدر منوی موبایل خود تمرکز کنیم.

برای سادگی، تمام سبک‌ها را بررسی نمی‌کنم، اما با کلیک بر روی زبانه CSS از آن‌ها راحت باشید. پروژه نمایشی.

چند نکته قابل توجه:

  • هدر یک عنصر با موقعیت ثابت خواهد بود و حداکثر عرض آن 600 پیکسل است.
  • را .header-bar ارتفاع ثابت 60 پیکسل خواهد داشت.
  • را .menu-wrapper کاملاً در موقعیت قرار می گیرد و زیر آن می نشیند .header-bar. علاوه بر این، ارتفاعی برابر با ارتفاع دید منهای خواهد داشت .header-barقد. در نهایت، در ابتدا پنهان خواهد شد.
طرح هدرطرح هدرطرح هدر

سبک های مرتبط:

بیایید به سبک های پانل ادامه دهیم.

  • همه آنها قد والدین خود را دریافت می کنند و دارند overflow-y: auto. این ویژگی تضمین می‌کند که در صورت وجود تعداد زیادی لینک منو، یک نوار اسکرول ظاهر می‌شود.
  • به خصوص پانل های دوم و سوم به طور پیش فرض کاملاً خارج از صفحه نمایش قرار می گیرند.

سبک های مرتبط:

در مرحله بعد، همه منوهای تودرتو را از پنل اول و سوم پنهان می کنیم:

در ادامه، چند سبک را برای پیوندهای منوی تلفن همراه تنظیم می کنیم، به ویژه:

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

سبک های مرتبط:

در نهایت، چند سبک ساده برای دکمه برگشت مشخص می کنیم.

دکمه برگشت

اینجا اند:

3. جاوا اسکریپت را اضافه کنید

پس از تنظیم سبک ها، زمان آن است که اقدامات مورد نیاز برای آشکار کردن سطوح منوی تودرتو با انیمیشن اسلاید را مورد بحث قرار دهیم.

تغییر منو

در اینجا یک GIF متحرک است که وضعیت تغییر منو را نشان می دهد:

منو بیان می کندمنو بیان می کندمنو بیان می کند

هر بار که روی دکمه جابجایی کلیک می کنیم، اقدامات زیر را انجام خواهیم داد:

  1. قابلیت مشاهده منو را از طریق تغییر دهید is-visible کلاس اگر پنهان باشد ظاهر می شود و بالعکس.
  2. بررسی کنید که آیا منو بسته است. اگر این شرط برآورده شود، موارد زیر را انجام می دهیم:

    1. را حذف کنید is-visible کلاس از پنل دوم و سوم اگر دارند.
    2. را حذف کنید is-active کلاس از پیوندهای منوی فعال در صورت وجود چنین عناصری.

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

و سبک های مربوطه:

سطح دو را باز کنید

در اینجا یک GIF متحرک است که نحوه نمایش منوهای سطح دوم را نشان می دهد:

سطح دوم منوسطح دوم منوسطح دوم منو

هر بار که روی پیوند منوی سطح اول (آنهایی که قابل مشاهده هستند) کلیک می کنیم، بررسی می کنیم که آیا منوی تودرتو به عنوان خواهر و برادر دارد یا خیر. اگر این شرط برآورده شود، اقدامات زیر را انجام خواهیم داد:

  1. از عملکرد پیش فرض آن جلوگیری کنید.
  2. اختصاص دهید is-active کلاس به آن
  3. یک کپی عمیق از خواهر و برادرش ایجاد کنید.
  4. این گره جدید ایجاد شده را به آن اضافه کنید .sub-menu-wrapper از پنل دوم
  5. پانل دوم را با انیمیشن اسلاید نشان دهید.

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

و سبک های مرتبط با انیمیشن:

سطح سه را باز کنید

در اینجا یک GIF متحرک وجود دارد که نحوه نمایش منوهای سطح سوم را نشان می دهد:

سطح سوم منوسطح سوم منوسطح سوم منو

به یاد داشته باشید که به طور پیش فرض، هیچ محتوایی در داخل وجود ندارد .sub-menu-wrapper از پنل دوم در قسمت قبل نحوه دریافت محتوا را با اجرای کپی عمیق توضیح دادیم.

در اینجا نمونه ای از نشانه گذاری ایجاد شده است:

محتویات سطح دوم وقتی قابل مشاهده می شودمحتویات سطح دوم وقتی قابل مشاهده می شودمحتویات سطح دوم وقتی قابل مشاهده می شود

در مرحله بعد، به محض اینکه شخصی روی پیوند منوی سطح دوم کلیک کرد، باید برخی از اقدامات را انجام دهیم. با این حال، مشکل این است که این پیوندها به صورت پویا تولید می شوند و بخشی از DOM اولیه نیستند. که گفت، click رویداد برای این عناصر کار نمی کند:(

خوشبختانه راه حل به اندازه کافی ساده است. با تشکر از هیئت رویداد، ما آن را ضمیمه می کنیم click رویداد به پانل والد که بخشی از DOM است. سپس، از طریق target ویژگی آن رویداد، ما عناصری را که رویداد روی آنها رخ داده است بررسی می‌کنیم تا مطمئن شویم که اینها پیوندهایی با یک خواهر و برادر زیر منو هستند.

با فرض اینکه اینها عناصر هدف هستند، برای هر یک از آنها، کارهای زیر را انجام خواهیم داد (مشابه قسمت قبل):

  1. از عملکرد پیش فرض آن جلوگیری کنید.
  2. اختصاص دهید is-active کلاس به آن
  3. یک کپی (عمیق) از خواهر و برادرش ایجاد کنید. توجه داشته باشید که اگر یک کپی عمیق انجام دهیم یا نه، هیچ تغییری ایجاد نخواهد شد، زیرا منوی ما شامل سه سطح است.
  4. این گره جدید ایجاد شده را به آن اضافه کنید .sub-menu-wrapper از پانل سوم
  5. پانل سوم را با انیمیشن اسلاید نشان دهید.

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

و سبک های مربوط به انیمیشن:

یک سطح به عقب برگردید

در اینجا یک GIF متحرک است که نحوه عملکرد دکمه های برگشت را نشان می دهد:

یک سطح به عقب برگردیک سطح به عقب برگردیک سطح به عقب برگرد

هر بار که روی دکمه بازگشت کلیک می کنیم، اقدامات زیر را انجام می دهیم:

  1. پانل والد دکمه بازگشت هدف را پیدا کنید و آن را بردارید is-visible کلاس
  2. را حذف کنید is-active کلاس از لینک فعال خواهر یا برادر قبلی پانل مادر.

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

و دوباره، چند سبک CSS همراه برای این عمل وجود دارد.

اضافی: متن برگشتی را به روز کنید

این آموزش با درخواست یکی از خوانندگان ما با یک مرحله اضافی به روز شده است (ایده عالی!)

اکنون که منوی موبایل ما به روشی که می‌خواهیم کار می‌کند، می‌توانیم انواع مختلفی از آن بسازیم. برای مثال، بیایید فرض کنیم که می‌خواهیم کدهای سخت را جایگزین کنیم بازگشت متن با متن از پیوند منو که روی آن کلیک می شود.

تصویری که آیتم منوی پویا را پس از کلیک روی آن نشان می دهدتصویری که آیتم منوی پویا را پس از کلیک روی آن نشان می دهدتصویری که آیتم منوی پویا را پس از کلیک روی آن نشان می دهد

برای سازگاری، HTML خود را همانطور که هست حفظ می کنیم و فقط کمی جاوا اسکریپت اضافه می کنیم (با علامت گذاری شده در اضافی نظر) به این صورت:

نتیجه

در این آموزش، با بهره گیری از برخی سبک های رایج CSS و API جاوا اسکریپت DOM، یک منوی تلفن همراه چند سطحی ایجاد کردیم. مهمتر از همه، نشانه گذاری اولیه ما شامل لیست های تو در تو ساده برای ایجاد منو است. این بدان معناست که ما می‌توانیم آن را به یک سیستم پویا تبدیل کنیم و از ویژگی‌های یک CMS مانند وردپرس فقط با چند تغییر استفاده کنیم.

من مطمئن هستم که راه حل های دیگری برای ساخت چنین منوهایی وجود خواهد داشت، شاید موثرتر یا در دسترس تر از این راه حل. رویکرد ما به شدت از مزایای استفاده می کند cloneNode() روشی که گره های تکراری ایجاد می کند، بنابراین باید با احتیاط از آن استفاده کرد، به خصوص اگر زیر منوهای ما دارای شناسه باشند.

در اینجا یک یادآوری از تمرین امروز ما (این است پویا نمونه پشت متن):

اگر این تمرین را دوست داشتید و در زمان شما برای ساختن چنین راه حلی از ابتدا صرفه جویی کرد، فراموش نکنید که به آن ❤️ بدهید. به علاوه، اگر می‌خواهید نسخه دیگری یا افزونه‌ای از این منو را ببینید، به ما خبر دهید!

مثل همیشه، خیلی ممنون که خواندید!