برنامه نویسی 254 بازدید

در این مقاله به بررسی یک روش ساده اما قدرتمند برای استفاده از سلکتورهای فرزند قبلی در CSS به منظور ساخت انیمیشن CSS برای تعیین رتبه با ستاره می‌پردازیم. در ابتدای این مقاله مقداری در مورد مباحث نظری بحث خواهیم کرد. در نهایت کامپوننتی که می‌خواهیم بسازیم عملکردی مانند تصویر زیر دارد:

ساخت انیمیشن CSS

تعیین رتبه با ستاره در CSS

ابتدا الزامات پروژه و سلکتورهای CSS و ترکیب‌های موجود را بررسی می‌کنیم. کامپوننت تعیین رتبه ما شامل 5 ستاره خواهد بود که هر یک با یک عنصر HTML نمایش می‌یابند و در کانتینر والد نگهداری می‌شوند. زمانی که کاربر روی یک عنصر کلیک می‌کند و یا ماوس را روی آن می‌برد، رنگ ستاره فعال می‌شود و همه ستاره‌های قبل از آن نیز به همین ترتیب به‌روزرسانی می‌شوند. همچنین ستاره‌های پس از ستاره منتخب نباید رنگ فعالی داشته باشند.

ما این مسئله را با استفاده از سلکتورهای CSS، انواع Display و Combinator–ها حل می‌کنیم. CSS خود یک زبان برنامه‌نویسی نیست، ‌بلکه یک زبان استایل شیت است که برای توصیف نمایش یک سند نوشته با یک زبان markup مانند HTML مورد استفاده قرار می‌گیرد. به بیان دیگر ما نمی‌توانیم به مرورگر بگوییم که چه کاری انجام دهد، بلکه می‌توانیم بگوییم که یک markup را چطور نمایش دهد.

با استفاده از شبه سلکتورهایی مانند hover ،:focus ‌،:focus-within: و checked: می‌توانیم رفتار کلیک کردن و لمس یک عنصر را در مدل شیء سند (DOM) یا به عبارت ساده‌تر در HTML رندر شده، تقلید کنیم.

توجه کنید که هیچ روش مستقیمی برای هدف‌گیری «هم‌نیای قبلی» (Previous Sibling) وجود ندارد و ما تنها می‌توانیم کانتینر والد، فرزند و موارد مرتبط را در روش آبشاری هدف‌گیری کنیم. اصولاً دلیل این که CSS استایل‌شیت‌های آبشاری نامیده شده، همین است. معنی آن چنین است که از نظر فنی نمی‌توانیم «‌هم‌نیای سابق» را انتخاب کنیم، اما می‌توانیم دقیقاً معکوس آن عمل کنیم، یعنی آن دو را ارائه کنیم.

بازنویسی الزامات قواعد CSS

  • زمانی که ماوس روی عنصر ستاره می‌رود، آن ستاره باید رنگ active خود و همه ستاره‌های قبلی را تغییر دهد. همچنین ستاره قبلی در رتبه مورد نظر نمی‌توانند استایل‌بندی شوند. از این رو این فرایند را کاملاً معکوس می‌کنیم. در واقع ما به کاربر دروغ می‌گوییم و آن را سلکتور فرزند قبلی می‌نامیم.
  • از آنجا که امکان ارائه یک سند وجود دارد، ما نیز ترتیب عناصر را چنین ارائه می‌کنیم. چند روش برای انجام این کار وجود دارد، اما دو مورد را توضیح می‌دهیم. حالت دوم یک روش ضد الگو است و نباید از آن استفاده کنید. از این روش تنها برای نمایش این که روش دیگری نیز برای انجام این کار وجود دارد استفاده می‌کنیم.

گزینه یکم: نمایش Flex و flex-direction

از آنجا که می‌خواهیم یک ردیف را نمایش دهیم، خصوصیت flex-direction: row-reverse;‎ را روی کلاس star-rating. اعمال می‌کنیم تا ترتیب همه عناصر فرزند تغییر یابد. توجه کنید که ما تغییری در DOM ایجاد نمی‌کنیم، بلکه شیوه ارائه آن را تغییر می‌دهیم. بدین ترتیب HTML ما اینک به صورت زیر در آمده است:

CSS اعمال شده روی کلاس ‎.star-rating موجب می‌شود که ترتیب همه چیز معکوس شود.

رنگ ستاره را عوض می‌کنیم

به این منظور از ‎:hover برای تغییر رنگ روی ستاره منتخب استفاده می‌کنیم و با استفاده از CSS کامبیناتور هم‌نیای عمومی (~) را به جای کامبیناتور هم‌نیای مجاور (+) مورد استفاده قرار می‌دهیم. اگر از کامبیناتور مجاور استفاده می‌کردیم، باید کدی مانند زیر می‌نوشتیم:

حجم این کد بالا است. علاوه بر آن CSS نامناسبی دارد. از این رو به جای آن، کدی مانند زیر می‌نویسیم:

این کد بسیار آسان‌تر است.

توجه کنید که ما نه تنها هم‌نیای قبلی را استایل‌بندی می‌کنیم، بلکه هم‌نیای بعدی را نیز استایل‌بندی می‌کنیم، اما ترتیب ارائه آن‌ها را به کاربر عوض می‌کنیم.

گزینه دوم: استفاده از SCSS و Grid

در این بخش یک رویکرد SCSS را برای حل این مسئله ارائه می‌کنیم. توجه کنید که این روش یک رویکرد ضد الگو دارد و نباید در پروداکشن مورد استفاده قرار گیرد. در کد زیر از SCSS برای برنامه‌نویسی عملی قابلیت و تولید CSS نهایی استفاده کرده‌ایم:

این کد به صورت CSS زیر کامپایل می‌شود.

در اینجا ما 5 کلاس بی‌استفاده داریم که مساحت هر ستاره را توصیف می‌کنند. آن‌ها را به صورت دستی طوری بازچینی می‌کنیم که از grid-template استفاده کنند.

بدین ترتیب CSS را فریب می‌دهیم.

کاربردهای پیشرفته: SCSS Mixin

اگر دانش شما در زمینه CSS اندک است، در این صورت بهتر است مطالعه این بخش را تا زمانی که اطلاعات بیشتری کسب کنید به تأخیر بیندازید. اما اگر اعتماد به نفس بیشتری دارید، در این بخش یک آمیزه جالب برای استفاده ارائه می‌کنیم. شما می‌توانید بخش ‎:hover را نیز هر جا که دوست دارید حذف کنید:

در نهایت کد مثال ما به صورت زیر است. شما می‌توانید این فایل‌ها را روی سیستم خود کپی کرده و آن را در عمل بررسی کنید:

فایل HTML

فایل SCSS

به این ترتیب به پایان این مقاله می‌رسیم و امیدواریم این مطلب مورد توجه شما قرار گرفته باشد.

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

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

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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