کد های مفید

طراحی ریسپانسیو با جاوا اسکریپت

طراحی ریسپانسیو با استفاده از جاوا اسکریپت

اصل و اساس طراحی ریسپانسیو استفاده از مدیاکوئری است و در جاوا اسکریپت هم متد ها و آبجکت هایی برای مدیاکوئری در نظر گرفته شده است که در این آموزش به آن می پردازیم.

وقتی با عبارت media query مواجه می شوید، اولین چیزی که به ذهن شما می رسد چیست؟

احتمالا چیزی شبیه به کد زیر در یک فایل CSS به ذهنتان خطور می کند :

مدیا کوئری CSS ، هسته اصلی هر طراحی ریسپانسیو است. مدیا کوئری یک روش عالی برای ایجاد حالت های مختلف در زمینه های مختلف است . مانند اندازه های متفاوت صفحه نمایش ، حرکت های خاص، طرح رنگی خاص، تعاملات متفاوت و حتی برای دستگاه های مختلف مانند پرنتر ها ،تلویزیون ها ، پروژکتور ها و ….

آیا می دانستید ما در جاوا اسکریپت هم مدیا کوئری داریم؟

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

کار با مدیاکوئری ها در جاوا اسکریپت با CSS بسیار متفاوت است گرچه مفاهیم شبیه به هم هستند : یک سری شرایط باید فراهم شود تا یک مجموعه کد اجرا شود.

تابع matchMedia() جاوا اسکریپت

برای اینکه بفهمیم آیا document شرایط تعریف شده در مدیا کوئری را دارد یا خیر، از تابع matchMedia() استفاده میکنیم.

پشتیبانی مرورگر ها از matchMedia()

با اینکه این تابع رسما بخشی از CSS Object Model View Module است و هنوز در مرحله پیشنویس کار است ولی پشتیبانی مرورگر ها از مدیاکوئری جاوا اسکریپت بسیار عالی است تا حدی که اینترنت اکسپلورر 10 با 98.6 درصد پوشش جهانی، از آن پشتیبانی می کند.

اطلاعات کامل تر در ادامه آمده که از سایت Caniuse گرفته شده است. عدد نوشته شده پایین ترین نسخه از

مرورگرهای دسکتاپ

ChromeFirefoxIEEdgeSafari
9610125.1

مرورگر های موبایل و تبلت

Android ChromeAndroid FirefoxAndroidiOS Safari
857935.0-5.1

روش استفاده از تابع matchMedia()

استفاده از مدیا کوئری در جاوا اسکریپت بسیار شبیه به CSS است. به اینصورت که ما یک عبارت متنی مدیاکوئری را به عنوان آرگومان به matchMedia() ارسال میکنیم و نتیجه را با بررسی ویژگی  .matches بدست می آوریم.

مدیا کوئری تعریف شده یک شیء MediaQueryList باز خواهد گرداند. در این شیء اطلاعاتی در مورد مدیاکوئری و ویژگی اصلی مورد نیاز ما که .matches است ذخیره می شود. ویژگی .matches یک ویژگی فقط خواندنی و بولین است که اگر document با مدیا کوئری ارسالی همخوانی داشته باشد مقدار آن true است.

این کاربرد اصلی برای مطابقت با شرایط رسانه در جاوا اسکریپت است. ما یک شرط مطابقت (matchMedia() ) ایجاد می کنیم که یک شی (MediaQueryList) را برمی گرداند ، در ادامه آن (.matches) را بررسی می کنیم ، سپس اگر شرایط صحیح ارزیابی شود ( مقدار true باشد ) کارهایی را انجام می دهیم. زیاد هم با CSS تفاوتی ندارد!

اما یک مشکلی وجود دارد. برای مثال اگر ما اندازه پنجره را کوچکتر کنیم، هیچ چیز به روشی که با CSS انجام می شود به روز نمی گردد. به این دلیل که .matches برای بررسی های فوری یکبار مصرف مناسب است اما قادر به بررسی مداوم تغییرات نیست. این بدان معنی است که ما باید…

به تغییرات گوش بدهیم

شیء MediaQueryList یک متد addListener() (و سپس removeListener()) دارد که تابع برگشتی را می پذیرد (با رویداد .onchange اجرا می شود) که با تغییر وضعیت مدیا کوئری ، فراخوانی می شود. به عبارت دیگر ، در صورت تغییر شرایط ، می توانیم توابع دیگری را اجرا کنیم ، که به ما امکان می دهد تا به تغییرات شرایط پاسخ دهیم.

استفاده از  matchMedia()  و  MediaQueryList  به ما قدرت یکسانی می دهد که نه تنها با شرایط رسانه ای که CSS فراهم می کند مطابقت دارد، بلکه برای پاسخگویی فعال به تغییر شرایط نیز کارایی دارد.

هنگامی که یک شنونده رویداد بوسیله  addListener()  ثبت می کنید، در ابتدا و بصورت خودکار اجرا نمی شود. ما باید تابع کنترل کننده رویداد را به صورت دستی فراخوانی کنیم و مدیاکوئری را به عنوان آرگومان به آن پاس بدهیم.

See the Pen JavaScript Media Queries #Example by Maverick (@rema) on CodePen.

روش قدیمی انجام کار

به خاطر زمینه سازی – و کمی مرور خاطرات – من مایلم که روش قدیمی ، اما هنوز هم پرطرفدار انجام “مدیا کوئری” در جاوا اسکریپت را توضیح دهم (این نقل قول ها در اینجا مهم است) . متداول ترین روش، اتصال به شنونده رویداد resize است که windows.innerWidth یا window.innerHeight را بررسی می کند.

هنوز چیزی شبیه به این را در کد های جاوا اسکریپت خواهید دید:

از آنجا که رویداد تغییر اندازه بر روی هر تغییر اندازه مرورگر فراخوانی می شود ، یک عملیات پرهزینه است! با نگاهی به تأثیر عملکرد یک صفحه خالی می توان تفاوت را مشاهده کرد.

استفاده از روش قدیمی، محاسبات را 157 درصد افزایش میدهد.

بعبارت دیگر و بیانی ساده تر به ازای 208 رویداد تغییر سایز فقط 6 رویداد تطبیق رسانه رخ می دهد.

حتی اگر مشکلات عملکردی روش قدیم را در نظر نگیریم ، باز هم تغییر اندازه به این معناست که ما نمی توانیم کد هایی برای بررسی پیشرفته تر رسانه؛ مانند مواردی از جمله چاپ و جهت گیری نمایش رسانه، بنویسیم.

بنابراین ، در حالی که این روش، رفتار “مدیا کوئری” را تقلید می کند و اجازه می دهد ما عرض صفحه نمایش را مطابقت دهیم ، اما نمی تواند بسیاری از موارد دیگر را مطابقت دهد – و ما می دانیم که مدیاکوئری واقعی قادر به کارهای بسیار بیشتری هستند.

نتیجه

این مقاله نگاهی به مدیاکوئری در جاوا اسکریپت بود. ما در مورد چگونگی استفاده از matchMedia() برای بررسی شرایط رسانه و ایجاد شیء MediaQueryList صحبت کردیم که به ما امکان می دهد در برابر آن شرایط، بررسی های یک باره (.matches) و مداوم (addListener()) را انجام دهیم تا بتوانیم به تغییرات رسانه (.onchange) پاسخ دهیم؛ البته با فراخوانی توابع.

همچنین دیدیم که در روش قدیم برای انجام کار به رویداد  resize  در پنجره (window) گوش می دادیم. این روش هنوز هم به طور گسترده استفاده می شود و یک روش کاملا قانونی برای پاسخ به تغییرات اندازه پنجره (window.innerWidth) است؛ در حالی که قادر به انجام بررسی در شرایط پیشرفته رسانه نیست.

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

See the Pen JavaScript Screen Orientation Query by Maverick (@rema) on CodePen.


منبع : css-tricks.com


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *