آموزش CSS مبتدی : لایههای آبشاری
هدف این درس آشنایی شما با لایههای آبشاری است، یک ویژگی پیشرفتهتر که بر اساس مفاهیم اساسی آبشاری CSS و ویژگی CSS بنا شده است.
اگر در CSS تازهکار هستید، ممکن است مطالعه این درس در ابتدا بیربط و کمی آکادمیکتر از برخی بخشهای دیگر دوره به نظر برسد. با این حال، دانستن اصول اولیه لایههای آبشاری در صورت مواجهه با آنها در پروژههایتان مفید است. هرچه بیشتر با CSS کار کنید، درک لایههای آبشاری و دانستن نحوه استفاده از قدرت آنها، شما را از دردسرهای مدیریت یک کد با CSS از طرفهای مختلف، افزونهها و تیمهای توسعه نجات میدهد.
لایههای آبشاری زمانی بیشترین اهمیت را دارند که با CSS از منابع مختلف کار میکنید، زمانی که انتخابگرهای CSS متناقض و ویژگیهای رقابتی وجود دارد، یا زمانی که استفاده از important را در نظر دارید.
برای هر ویژگی CSS که به یک عنصر اعمال میشود، فقط یک مقدار میتواند وجود داشته باشد. میتوانید با بررسی عنصر در ابزارهای توسعهدهنده مرورگر خود، تمام مقادیر ویژگی اعمال شده به یک عنصر را مشاهده کنید. پنل «Styles» این ابزار، تمام مقادیر ویژگی اعمال شده به عنصر مورد بررسی را به همراه انتخابگر منطبق و فایل منبع CSS نشان میدهد. انتخابگر از مبدا با اولویت، مقادیر خود را بر روی عنصر منطبق اعمال میکند.
علاوه بر سبکهای اعمال شده، پنل Styles مقادیر خط خوردهای را که با عنصر انتخاب شده مطابقت دارند اما به دلیل آبشاری بودن، ویژگی یا ترتیب منبع اعمال نشدهاند، نمایش میدهد. سبکهای خط خورده ممکن است از همان مبدا با اولویت اما با ویژگی کمتر یا با ویژگی و ویژگی منطبق باشند، اما قبلاً در پایگاه کد یافت شدهاند. برای هر مقدار ویژگی اعمال شده، ممکن است چندین اعلان خط خورده از منابع مختلف وجود داشته باشد. اگر سبکی را مشاهده کردید که خط خورده و انتخابگر با ویژگی بیشتری دارد، به این معنی است که مقدار فاقد منشأ یا اهمیت است.
اغلب، با افزایش پیچیدگی یک سایت، تعداد استایلشیتها افزایش مییابد که باعث میشود ترتیب منبع استایلشیتها هم مهمتر و هم پیچیدهتر شود. لایههای آبشاری، نگهداری استایلشیتها را در چنین پایگاههای کدی ساده میکنند. لایههای آبشاری، محفظههای اختصاصیسازی صریحی هستند که کنترل سادهتر و بیشتری بر اعلانهای CSS که در نهایت اعمال میشوند، ارائه میدهند و به توسعهدهندگان وب این امکان را میدهند که بخشهای CSS را بدون نیاز به مقابله با اختصاصیسازی، اولویتبندی کنند.
برای درک لایههای آبشاری، باید آبشار CSS را به خوبی درک کنید. بخشهای زیر خلاصهای سریع از مفاهیم مهم آبشاری ارائه میدهند.
حرف «C» در CSS مخفف «Cascading» است. این روشی است که استایلها به صورت آبشاری به هم متصل میشوند. عامل کاربر چندین مرحلهی کاملاً مشخص را طی میکند تا مقادیر اختصاص داده شده به هر ویژگی برای هر عنصر را تعیین کند. ما به طور خلاصه این مراحل را در اینجا فهرست میکنیم و سپس به مرحلهی ۴، لایههای آبشاری، که چیزی است که شما برای یادگیری آن به اینجا آمدهاید، عمیقتر میپردازیم:
ارتباط: تمام بلوکهای اعلان را با یک انتخابگر منطبق برای هر عنصر پیدا کنید.
اهمیت: قوانین را بر اساس اینکه آیا معمولی هستند یا مهم، مرتب کنید. سبکهای مهم آنهایی هستند که پرچم روی آنها تنظیم شده است.
منشأ: در هر یک از دو سطل اهمیت، قوانین را بر اساس مبدأ نویسنده، کاربر یا مبدأ عامل کاربر مرتب کنید.
لایههای آبشاری: در هر یک از شش سطل اهمیت مبدأ، بر اساس لایه آبشاری مرتب کنید. ترتیب لایه برای اعلانهای معمولی از اولین لایه ایجاد شده تا آخرین لایه است و پس از آن سبکهای معمولی بدون لایه قرار دارند. این ترتیب برای سبکهای مهم برعکس است، به طوری که سبکهای مهم بدون لایه کمترین اولویت را دارند. ویژگی: برای سبکهای رقیب در لایه مبدأ با اولویت، اعلانها را بر اساس ویژگی مرتب کنید.
مجاورت محدودهبندی: وقتی دو انتخابگر در لایه مبدأ با اولویت، ویژگی یکسانی داشته باشند، مقدار ویژگی در قوانین محدودهبندیشده با کمترین تعداد جهش در سلسله مراتب DOM به ریشه محدودهبندی برنده میشود. برای جزئیات بیشتر و یک مثال، به نحوه حل تعارضات
مراجعه کنید.
ترتیب ظاهر شدن: وقتی دو انتخابگر در لایه مبدأ با اولویت، ویژگی و نزدیکی محدودهبندی یکسانی داشته باشند، مقدار ویژگی از آخرین انتخابگر اعلامشده با بالاترین ویژگی برنده میشود.
برای هر مرحله، فقط اعلانهایی که «هنوز در حال اجرا» هستند، به مرحله بعدی «رقابت» میروند. اگر فقط یک اعلان در حال اجرا باشد، «برنده» میشود و مراحل بعدی بیاهمیت میشوند.
سه نوع مبدا آبشاری وجود دارد: stylesheet عامل کاربر، stylesheet کاربر و stylesheet نویسنده. مرورگر هر اعلان را بر اساس مبدا و اهمیت به شش دسته مبدا مرتب میکند. هشت سطح تقدم وجود دارد: شش دسته مبدا، ویژگیهایی که در حال انتقال هستند و ویژگیهایی که متحرکسازی میکنند. ترتیب تقدم از style عامل کاربر معمولی که کمترین تقدم را دارند، به style درون انیمیشنهای اعمال شده فعلی، به style عامل کاربر مهم، و سپس style در حال انتقال، که بالاترین تقدم را دارند، میرود:
style عادی عامل کاربر
style عادی کاربر
style عادی نویسنده
style در حال متحرکسازی
style مهم نویسنده
style مهم کاربر
style مهم عامل کاربر
style در حال انتقال
"عامل کاربر" مرورگر است. "کاربر" بازدیدکننده سایت است. "نویسنده" شما، توسعهدهنده، هستید. styleهایی که مستقیماً روی یک عنصر با عنصر اعلام میشوند، سبکهای نویسنده هستند. سبکهای عادی عامل کاربر، بدون احتساب سبکهای متحرکسازی و انتقال، کمترین تقدم را دارند؛ سبکهای مهم عامل کاربر بالاترین تقدم را دارند.
برای هر ویژگی، اعلانی که «برنده» میشود، اعلانی از مبدأ با اولویت بر اساس وزن (معمولی یا مهم) است. فعلاً لایهها را نادیده میگیریم، مقداری از مبدأ با بالاترین اولویت اعمال میشود. اگر مبدأ برنده بیش از یک اعلان ویژگی برای یک عنصر داشته باشد، میزان اختصاصی بودن انتخابگرها برای آن مقادیر ویژگی رقیب مقایسه میشود. میزان اختصاصی بودن هرگز بین انتخابگرها از مبدأهای مختلف مقایسه نمیشود.
در مثال زیر، دو لینک وجود دارد. در اولی هیچ style نویسندهای اعمال نشده است، بنابراین فقط styleهای عامل کاربر (و styleهای کاربر شخصی شما، در صورت وجود) اعمال میشوند. در دومی، تزئینات متن و رنگ توسط styleهای نویسنده تنظیم شده است، حتی اگر انتخابگر در stylesheet نویسنده دارای میزان اختصاصی بودن 0-0-0 باشد. دلیل اینکه styleهای نویسنده «برنده» میشوند این است که وقتی styleهای متناقضی از مبدأهای مختلف وجود دارد، قوانین مبدأ با اولویت اعمال میشوند، صرف نظر از میزان اختصاصی بودن مبدأیی که اولویت ندارد.
انتخابگر «رقیب» در stylesheet عامل کاربر در زمان نگارش این متن، است که وزن ویژگی آن 0-1-1 است. اگرچه این مقدار از انتخابگر 0-0-0 در stylesheet نویسنده بیشتر است، حتی اگر انتخابگر در عامل کاربر فعلی شما متفاوت باشد، مهم نیست: وزنهای ویژگی از مبدأهای نویسنده و عامل کاربر هرگز با هم مقایسه نمیشوند. درباره نحوه محاسبهی وزن ویژگی بیشتر بدانید.
اولویت مبدأ همیشه بر ویژگی انتخابگر غلبه میکند. اگر یک ویژگی عنصر با یک اعلان سبک معمولی در چندین مبدأ استایلبندی شود، stylesheet نویسنده همیشه ویژگیهای عادی اضافی اعلام شده در یک stylesheet کاربر یا عامل کاربر را لغو میکند. اگر استایل مهم باشد، stylesheet عامل کاربر همیشه بر استایلهای نویسنده و کاربر غلبه میکند. اولویت مبدأ آبشاری تضمین میکند که هیچگاه تضاد ویژگی بین مبدأها رخ ندهد.
نکته آخر که قبل از ادامه باید به آن توجه کنید: ترتیب ظاهر فقط زمانی اهمیت پیدا میکند که اعلانهای رقیب در مبدأ اولویت، ویژگی یکسانی داشته باشند.
اکنون «اولویت مبدأ آبشاری» را درک میکنیم، اما «اولویت لایه آبشاری» چیست؟ ما با پرداختن به اینکه لایههای آبشاری چه هستند، چگونه مرتب میشوند و چگونه styleها به لایههای آبشاری اختصاص داده میشوند، به این سوال پاسخ خواهیم داد. ما لایههای معمولی، لایههای تو در تو و لایههای ناشناس را پوشش خواهیم داد. ابتدا بیایید در مورد اینکه لایههای آبشاری چیستند و چه مسائلی را حل میکنند، بحث کنیم.
مشابه شش سطح اولویت بر اساس مبدا و اهمیت، لایههای آبشاری به ما این امکان را میدهند که در هر یک از این مبداها، سطح اولویت زیرمبدأ ایجاد کنیم.
در هر یک از شش سطل مبدا، میتوان چندین لایه آبشاری وجود داشته باشد. ترتیب ایجاد لایه بسیار مهم است. این ترتیب ایجاد است که ترتیب تقدم را بین لایههای درون یک مبدا تعیین میکند.
در سطلهای مبدا معمولی، لایهها به ترتیب ایجاد هر لایه مرتب میشوند. ترتیب تقدم از اولین لایه ایجاد شده تا آخرین لایه است و پس از آن styleهای معمولی بدون لایه قرار دارند.
این ترتیب برای styleهای مهم معکوس میشود. همه styleهای مهم بدون لایه به صورت آبشاری در یک لایه ضمنی قرار میگیرند که بر همه styleهای معمولی غیر انتقالی اولویت دارد. styleهای مهم بدون لایه اولویت کمتری نسبت به هر style لایهای مهم دارند. styleهای مهم در لایههای اعلام شده قبلی بر styleهای مهم در لایههای اعلام شده بعدی در همان مبدا اولویت دارند.
در ادامهی این آموزش، بحث خود را به استایلهای نویسنده محدود خواهیم کرد، اما به خاطر داشته باشید که لایهها میتوانند در استایلشیتهای کاربر و عامل کاربر نیز وجود داشته باشند.
مسائلی که لایههای آبشاری میتوانند حل کنند
پایگاههای کد بزرگ میتوانند styleهایی از چندین تیم، کتابخانههای کامپوننت، چارچوبها و اشخاص ثالث داشته باشند. مهم نیست چند stylesheet گنجانده شده باشد، همه این styleها در یک منبع واحد به صورت آبشاری به هم متصل میشوند: stylesheet نویسنده.
اینکه styleها از منابع مختلف به صورت آبشاری به هم متصل شوند، به خصوص از تیمهایی که با هم کار نمیکنند، میتواند مشکلاتی ایجاد کند. تیمهای مختلف ممکن است روشهای متفاوتی داشته باشند؛ یکی ممکن است بهترین روش کاهش ویژگی را داشته باشد، در حالی که دیگری ممکن است استانداردی برای گنجاندن یک id در هر انتخابگر داشته باشد.
تضادهای ویژگی میتوانند به سرعت تشدید شوند. یک توسعهدهنده وب ممکن است با اضافه کردن یک پرچم یک "راه حل سریع" ایجاد کند. اگرچه این ممکن است یک راه حل آسان به نظر برسد، اما اغلب فقط جنگ ویژگی را از اعلانهای عادی به اعلانهای مهم منتقل میکند.
همانطور که ریشههای آبشاری تعادل قدرت بین styleهای کاربر، عاملهای کاربر و نویسنده را فراهم میکنند، لایههای آبشاری روشی ساختاریافته برای سازماندهی و متعادل کردن نگرانیها در یک منبع واحد ارائه میدهند، گویی هر لایه در یک منبع، یک زیرمنبع است. میتوان برای هر تیم، کامپوننت و شخص ثالث، یک لایه با اولویت style بر اساس ترتیب لایه ایجاد کرد.
قوانین درون یک لایه، بدون رقابت با قوانین سبک خارج از لایه، به صورت آبشاری با هم ترکیب میشوند. لایههای آبشاری، اولویتبندی کل stylesheetها را نسبت به سایر stylesheetها امکانپذیر میکنند، بدون اینکه نگران اختصاصی بودن بین این sub-originها باشند.
اولویت لایه همیشه بر اختصاصی بودن انتخابگر برتری دارد. استایلها در لایههای دارای اولویت، بر لایههایی با اولویت کمتر "پیروز" میشوند. اختصاصی بودن یک انتخابگر در یک لایه بازنده بیربط است. اختصاصی بودن هنوز برای مقادیر ویژگی رقابتی درون یک لایه اهمیت دارد، اما هیچ نگرانی در مورد اختصاصی بودن بین لایهها وجود ندارد زیرا فقط لایه با بالاترین اولویت برای هر ویژگی در نظر گرفته میشود.
مسائلی که لایههای آبشاری تو در تو میتوانند حل کنند
لایههای آبشاری امکان ایجاد لایههای تو در تو را فراهم میکنند. هر لایه آبشاری میتواند شامل لایههای تو در تو باشد.
به عنوان مثال، یک کتابخانه کامپوننت میتواند به یک لایه کامپوننت وارد شود. یک لایه آبشاری معمولی، کتابخانه کامپوننت را به مبدأ نویسنده اضافه میکند و هرگونه تضاد ویژگی با سایر سبکهای نویسنده را از بین میبرد. در داخل لایه کامپوننتها، یک توسعهدهنده میتواند تمهای مختلفی را تعریف کند که هر کدام به عنوان یک لایه تو در تو جداگانه هستند. ترتیب این لایههای تم تو در تو را میتوان بر اساس پرسوجوهای رسانهای (به بخش ایجاد لایه و پرسوجوهای رسانهای در زیر مراجعه کنید)، مانند اندازه یا جهت نمای دید، تعریف کرد. این لایههای تو در تو راهی برای ایجاد تمهایی فراهم میکنند که بر اساس ویژگی با هم تضاد ندارند.
قابلیت تو در تو کردن لایهها برای هر کسی که روی توسعه کتابخانههای کامپوننت، چارچوبها، ویجتهای شخص ثالث و تمها کار میکند، بسیار مفید است.
قابلیت ایجاد لایههای تو در تو همچنین نگرانی از داشتن نامهای لایه متناقض را از بین میبرد. ما این موضوع را در بخش لایه تو در تو پوشش خواهیم داد.
نویسندگان میتوانند لایههایی برای نمایش پیشفرضهای عناصر، کتابخانههای شخص ثالث، تمها، کامپوننتها، لغوها و سایر موارد مربوط به styleبندی ایجاد کنند - و میتوانند آبشار لایهها را به روشی صریح، بدون تغییر انتخابگرها یا ویژگی در هر لایه، یا با تکیه بر ترتیب ظاهر برای حل اختلافات بین لایهها، دوباره مرتب کنند.
لایهها را میتوان با استفاده از هر یک از روشهای زیر ایجاد کرد:
دستور ، لایهها را با استفاده از و به دنبال آن نام یک یا چند لایه اعلام میکند. این کار لایههای نامگذاری شده را بدون اختصاص هیچ سبکی به آنها ایجاد میکند.
بلوک ، که در آن تمام سبکهای درون یک بلوک به یک لایه نامگذاری شده یا بدون نام اضافه میشوند.
دستور با کلمه کلیدی layer یا تابع که محتویات فایل وارد شده را به آن لایه اختصاص میدهد.
هر سه روش در صورتی که لایهای با آن نام قبلاً مقداردهی اولیه نشده باشد، یک لایه ایجاد میکنند. اگر هیچ نام لایهای در یا با ارائه نشود، یک لایه ناشناس (بدون نام) جدید ایجاد میشود.
ترتیب اولویت لایهها، ترتیب ایجاد آنهاست. استایلهایی که در یک لایه نیستند، یا «استایلهای بدون لایه»، به صورت آبشاری در یک لایه ضمنی نهایی قرار میگیرند.
بیایید قبل از بحث در مورد لایههای تو در تو، سه روش ایجاد یک لایه را با جزئیات بیشتری بررسی کنیم.
دستور @layer در قاعده برای لایههای نامگذاری شده
ترتیب لایهها با ترتیب نمایش لایهها در CSS شما تعیین میشود. اعلام لایهها با استفاده از و به دنبال آن نام یک یا چند لایه بدون اختصاص هیچ سبکی، یکی از راههای تعریف ترتیب لایهها است.
در CSS برای اعلام یک لایه آبشاری و تعریف ترتیب تقدم زمانی که چندین لایه آبشاری وجود دارد، استفاده میشود. at-rule زیر سه لایه را به ترتیب ذکر شده اعلام میکند:
شما اغلب میخواهید اولین خط CSS شما این اعلان باشد (البته با نامهایی که برای سایت شما منطقی هستند) تا کنترل کاملی بر ترتیب لایهها داشته باشید.
اگر عبارت بالا اولین خط CSS یک سایت باشد، ترتیب لایهها به صورت theme، layout و utilities خواهد بود. اگر قبل از عبارت بالا لایههایی ایجاد شده باشند، تا زمانی که لایههایی با این نامها از قبل وجود نداشته باشند، این سه لایه ایجاد شده و به انتهای لیست لایههای موجود اضافه میشوند. با این حال، اگر لایهای با همین نام از قبل وجود داشته باشد، عبارت بالا فقط دو لایه جدید ایجاد میکند. به عنوان مثال، اگر layout از قبل وجود داشته باشد، فقط theme و utilities ایجاد میشوند، اما ترتیب لایهها، در این مورد، layout، theme و utilities خواهد بود.
قاعدهی بلوک @layer برای لایههای نامگذاری شده و ناشناس
لایهها را میتوان با استفاده از بلوک ایجاد کرد. اگر پس از یک id و یک بلوک از style قرار گیرد، از id برای نامگذاری لایه استفاده میشود و styleهای موجود در این at-rule به styleهای لایه اضافه میشوند. اگر لایهای با نام مشخص شده از قبل وجود نداشته باشد، یک لایه جدید ایجاد میشود. اگر لایهای با نام مشخص شده از قبل وجود داشته باشد، styleها به لایه موجود قبلی اضافه میشوند. اگر هنگام ایجاد بلوکی از styleها با استفاده از نامی مشخص نشود، styleهای موجود در at-rule به یک لایه ناشناس جدید اضافه میشوند.
در مثال زیر، ما از چهار بلوک و یک دستور استفاده کردهایم. این CSS موارد زیر را به ترتیب ذکر شده انجام میدهد:
یک لایه طرحبندی نامگذاری شده ایجاد میکند
یک لایه ناشناس و بدون نام ایجاد میکند
لیستی از سه لایه را اعلام میکند و فقط دو لایه جدید، تم و ابزارها ایجاد میکند، زیرا طرحبندی از قبل وجود دارد
styleهای اضافی را به لایه طرحبندی موجود اضافه میکند
یک لایه ناشناس و بدون نام دوم ایجاد میکند
در CSS بالا، ما پنج لایه ایجاد کردیم: - به همین ترتیب - با یک لایه ششم، ضمنی از استایلهای بدون لایه که در بلوک استایل بدنه قرار دارد. ترتیب لایه، ترتیبی است که لایهها ایجاد میشوند و لایه ضمنی استایلهای بدون لایه همیشه در آخر قرار میگیرد. پس از ایجاد، هیچ راهی برای تغییر ترتیب لایه وجود ندارد.
ما چند استایل را به لایهای با نام layout اختصاص دادیم. اگر یک لایه نامگذاری شده از قبل وجود نداشته باشد، مشخص کردن نام در یک at-rule با استفاده از ، با یا بدون اختصاص استایل به لایه، لایه را ایجاد میکند. این کار لایه را به انتهای سری نامهای لایه موجود اضافه میکند. اگر لایه نامگذاری شده از قبل وجود داشته باشد، تمام استایلهای درون بلوک نامگذاری شده به استایلهای لایه موجود قبلی اضافه میشوند - مشخص کردن استایلها در یک بلوک با استفاده مجدد از نام لایه موجود، لایه جدیدی ایجاد نمیکند.
لایههای ناشناس با اختصاص استایلها به یک لایه بدون نامگذاری لایه ایجاد میشوند. استایلها را میتوان فقط در زمان ایجاد یک لایه بدون نام به آن اضافه کرد.
استفاده بعدی از بدون نام لایه، لایههای بدون نام اضافی ایجاد میکند؛ این دستور به لایه بدون نام قبلی که قبلاً وجود داشته، استایل اضافه نمیکند.
دستور یک لایه، چه با نام و چه بدون نام، ایجاد میکند، یا اگر لایه نامگذاری شده از قبل وجود داشته باشد، استایلها را به لایه اضافه میکند. ما اولین لایه ناشناس را و دومی را نامیدیم، این فقط برای این است که بتوانیم آنها را توضیح دهیم. اینها در واقع لایههای بدون نام هستند. هیچ راهی برای ارجاع به آنها یا اضافه کردن استایلهای اضافی به آنها وجود ندارد.
تمام استایلهای اعلام شده در خارج از یک لایه در یک لایه ضمنی به هم متصل میشوند. در کد مثال بالا، اولین اعلان، ویژگی را روی بدنه تنظیم کرد. این در خارج از هر لایهای اعلام شده است. اعلانهای بدون لایه معمولی نسبت به اعلانهای لایه معمولی اولویت دارند، حتی اگر استایلهای بدون لایه از ویژگی کمتری برخوردار باشند و به ترتیب ظاهر شدن، اول قرار بگیرند. این توضیح میدهد که چرا با اینکه CSS بدون لایه ابتدا در بلوک کد اعلام شده است، لایه ضمنی حاوی این استایلهای بدون لایه، طوری تقدم پیدا میکند که انگار آخرین لایه اعلام شده است.
در خط که در آن مجموعهای از لایهها اعلام شدهاند، فقط لایههای theme و utilities ایجاد شدهاند؛ layout قبلاً در خط اول ایجاد شده است. توجه داشته باشید که این اعلام ترتیب لایههای از قبل ایجاد شده را تغییر نمیدهد. در حال حاضر هیچ راهی برای مرتبسازی مجدد لایهها پس از اعلام وجود ندارد.
در مثال زیر، ما استایلها را به دو لایه اختصاص میدهیم، آنها را ایجاد میکنیم و در این فرآیند نامگذاری میکنیم. از آنجایی که آنها از قبل وجود دارند و هنگام اولین استفاده ایجاد میشوند، اعلام آنها در خط آخر هیچ کاری انجام نمیدهد.
سعی کنید خط آخر، را جابجا کنید تا به خط اول تبدیل شود. چه اتفاقی میافتد؟
اگر لایهای را با استفاده از کوئریهای رسانه یا ویژگی تعریف کنید، و رسانه مورد نظر مطابقت نداشته باشد یا ویژگی پشتیبانی نشود، لایه ایجاد نمیشود. مثال زیر نشان میدهد که چگونه تغییر اندازه دستگاه یا مرورگر شما ممکن است ترتیب لایهها را تغییر دهد. در این مثال، لایه سایت را فقط در مرورگرهای عریضتر ایجاد میکنیم. سپس به ترتیب، styleها را به لایههای صفحه و سایت اختصاص میدهیم.
در صفحات نمایش عریض، لایه سایت در خط اول تعریف میشود، به این معنی که سایت نسبت به صفحه اولویت کمتری دارد. در غیر این صورت، سایت نسبت به صفحه اولویت دارد زیرا در صفحات نمایش باریکتر دیرتر تعریف میشود. اگر این روش جواب نداد، سعی کنید 50em را در کوئری مدیا به 10em یا 100em تغییر دهید.
وارد کردن استایل شیتها به لایههای نامگذاری شده و ناشناس با استفاده از @import
قانون به کاربران اجازه میدهد تا قوانین style را از سایر stylesheetها یا مستقیماً به یک فایل CSS یا به یک عنصر وارد کنند.
هنگام وارد کردن stylesheetها، عبارت باید قبل از هرگونه سبک CSS در داخل stylesheet یا بلوک تعریف شود. عبارت باید قبل از هرگونه style در ابتدا قرار گیرد، اما میتواند قبل از آن یک at-rule با قرار گیرد که یک یا چند لایه را بدون اختصاص هیچ سبکی به لایهها ایجاد میکند. ( همچنین میتواند قبل از یک قانون قرار گیرد.)
شما میتوانید یک شیوهنامه را به یک لایه نامگذاری شده، یک لایه نامگذاری شده تو در تو یا یک لایه ناشناس وارد کنید. لایه زیر، شیوهنامهها را به ترتیب به یک لایه کامپوننتها، یک لایه دیالوگ تو در تو در داخل لایه کامپوننتها و یک لایه بدون نام وارد میکند:
شما میتوانید بیش از یک فایل CSS را به یک لایه وارد کنید. دستور زیر دو فایل جداگانه را به یک لایه اجتماعی وارد میکند:
شما میتوانید styleها را وارد کنید و لایهها را بر اساس شرایط خاص با استفاده از کوئریهای رسانهای و کوئریهای ویژگی ایجاد کنید. موارد زیر یک برگه style را فقط در صورتی که مرورگر از پشتیبانی کند، به یک لایه بینالمللی وارد میکند و فایلی که وارد میشود به عرض صفحه نمایش بستگی دارد.
هیچ معادلی برای روش برای پیوند دادن stylesheetها وجود ندارد. وقتی نمیتوانید از در stylesheet استفاده کنید، از برای وارد کردن یک stylesheet به یک لایه استفاده کنید.
مروری بر لایههای آبشاری تو در تو
لایههای تودرتو، لایههایی درون یک لایه با نام یا ناشناس هستند. هر لایه آبشاری، حتی یک لایه ناشناس، میتواند شامل لایههای تودرتو باشد. لایههایی که به لایه دیگری وارد میشوند، به لایههای تودرتو درون آن لایه تبدیل میشوند.
قابلیت تودرتو کردن لایهها به تیمها این امکان را میدهد که لایههای آبشاری ایجاد کنند، بدون اینکه نگران باشند تیمهای دیگر آنها را به یک لایه وارد میکنند یا خیر. به طور مشابه، تودرتو کردن به شما این امکان را میدهد که استایلشیتهای شخص ثالث را به یک لایه وارد کنید، بدون اینکه نگران باشید که آیا خود آن استایلشیت لایههایی دارد یا خیر. از آنجا که لایهها میتوانند تودرتو باشند، لازم نیست نگران تداخل نام لایهها بین استایلشیتهای خارجی و داخلی باشید.
ایجاد لایههای آبشاری تو در تو
لایههای تو در تو را میتوان با استفاده از همان روشهایی که برای لایههای معمولی توضیح داده شد، ایجاد کرد. به عنوان مثال، میتوان آنها را با استفاده از و به دنبال آن نام یک یا چند لایه، با استفاده از نماد نقطه، ایجاد کرد. چندین نقطه و نام لایه، نشاندهندهی چندین تو در تو بودن است.
اگر یک بلوک را درون بلوک دیگری ، با یا بدون نام، تو در تو کنید، بلوک تو در تو به یک لایه تو در تو تبدیل میشود. به طور مشابه، هنگامی که یک stylesheet با اعلان حاوی کلمه کلیدی layer یا تابع وارد میشود، styleها به آن لایه با نام یا ناشناس اختصاص داده میشوند. اگر عبارت شامل لایهها باشد، آن لایهها به لایههای تو در تو درون آن لایه ناشناس یا نامگذاری شده تبدیل میشوند.
به مثال زیر نگاه کنید:
در خط اول، ما را به لایه components وارد میکنیم. اگر آن فایل حاوی لایههایی باشد، چه با نام باشند چه نباشند، آن لایهها به لایههای تو در تو در لایه components تبدیل میشوند.
خط دوم را به لایه narrow که زیرلایهای از components است، وارد میکند. تو در تو به عنوان آخرین لایه در لایه components ایجاد میشود، مگر اینکه از قبل حاوی یک لایه narrow باشد که در این صورت، محتویات به لایه تو در تو اضافه میشود. لایههای تو در تو با نامهای تو در تو را میتوان با استفاده از الگوی به لایه components اضافه کرد. همانطور که قبلاً ذکر شد، لایههای بدون نام میتوانند ایجاد شوند اما بعداً نمیتوان به آنها دسترسی داشت.
بیایید به مثال دیگری نگاه کنیم، که در آن layers1.css را با استفاده از عبارت زیر به یک لایه نامگذاری شده وارد میکنیم:
این یک لایه واحد به نام example ایجاد میکند که شامل برخی تعریفها و پنج لایه تو در تو است - .
برای افزودن استایل به یک لایه تو در تو با نام، از علامت نقطه استفاده کنید:
تعیین اولویت بر اساس ترتیب لایهها
ترتیب لایهها، ترتیب تقدم آنها را تعیین میکند. بنابراین، ترتیب لایهها بسیار مهم است. همانطور که آبشاری بر اساس مبدا و اهمیت مرتبسازی میکند، آبشاری هر اعلان CSS را بر اساس لایه مبدا و اهمیت مرتب میکند.
ترتیب اولویت لایههای آبشاری منظم
کد بالا دو لایه نامگذاری شده ایجاد میکند (styleهای به لایه ضمنی سبکهای بدون لایه اضافه میشوند). فرض میکنیم که سه فایل هیچ لایه اضافی درون خود ندارند. لیست زیر نشان میدهد که styleهای تعریف شده در داخل و خارج از این فایلها از کمترین (1) اولویت تا بیشترین (10) اولویت مرتب میشوند.
styleهای معمولی firstLayer
styleهای معمولی
styleهای معمولی بدون لایه secondLayer
styleهای معمولی درون خطی
styleهای متحرکسازی
styleهای مهم بدون لایه
styleهای مهم secondLayer
styleهای مهم firstLayer
styleهای مهم درون خطی
styleهای انتقالی
styleهای معمولی تعریف شده در داخل لایهها کمترین اولویت را دریافت میکنند و بر اساس ترتیب ایجاد لایهها مرتب میشوند. styleهای معمولی در اولین لایه ایجاد شده کمترین اولویت را دارند و styleهای معمولی در لایه ایجاد شده آخر بالاترین اولویت را در بین لایهها دارند. به عبارت دیگر، styleهای معمولی که در firstLayer تعریف میشوند، در صورت وجود هرگونه تداخل، توسط هر style بعدی در لیست لغو میشوند.
در مرحله بعد، هر style که خارج از لایهها تعریف شود، قرار دارد. styleهای موجود در به لایهای وارد نشدهاند و هر style متضادی را از firstLayer و secondLayer لغو میکنند. styleهایی که در یک لایه تعریف نمیشوند، همیشه اولویت بالاتری نسبت به styleهایی دارند که در داخل یک لایه تعریف میشوند (به استثنای styleهای مهم).
styleهای درونخطی با استفاده از ویژگی style تعریف میشوند. styleهای معمولی که به این روش تعریف میشوند، نسبت به styleهای معمولی موجود در stylesheetهای بدون لایه و لایهای () اولویت بالاتری دارند.
styleهای انیمیشن اولویت بالاتری نسبت به همه styleهای معمولی، از جمله styleهای معمولی درونخطی، دارند.
styleهای مهم، یعنی مقادیر ویژگی که شامل پرچم هستند، نسبت به هر style که قبلاً در لیست ما ذکر شده است، اولویت دارند. آنها به ترتیب معکوس styleهای معمولی مرتب شدهاند. هر style مهمی که در خارج از یک لایه تعریف شود، نسبت به styleهایی که در یک لایه تعریف میشوند، اولویت کمتری دارد. styleهای مهم موجود در لایهها نیز به ترتیب ایجاد لایه مرتب میشوند. برای styleهای مهم، آخرین لایه ایجاد شده کمترین اولویت و اولین لایه ایجاد شده بالاترین اولویت را در بین لایههای تعریف شده دارد.
styleهای مهم درونخطی نیز نسبت به styleهای مهم تعریف شده در جاهای دیگر، اولویت بالاتری دارند.
styleهای انتقالی بالاترین اولویت را دارند. هنگامی که یک مقدار ویژگی معمولی در حال انتقال است، بر تمام اعلانهای مقدار ویژگی دیگر، حتی styleهای مهم درونخطی، اولویت دارد؛ اما فقط هنگام انتقال.
در این مثال، دو لایه (A و B) در ابتدا با استفاده از دستور at-rule با کد و بدون هیچ استایلی تعریف میشوند. استایلهای لایه در دو بلوک at-rule با کد تعریف میشوند که پس از دستور CSS با کد h1 که خارج از هر لایهای تعریف شده است، ظاهر میشوند.
styleهایی درونخطی اضافه شده به عنصر h1 با استفاده از ویژگی style، یک رنگ معمولی و یک رنگ پسزمینه مهم را تنظیم میکنند. استایلهای درونخطی معمولی، تمام استایلهای معمولی لایهای و بدون لایه را لغو میکنند. استایلهای درونخطی مهم، تمام استایلهای معمولی لایهای و بدون لایه و استایلهای مهم نویسنده را لغو میکنند. هیچ راهی برای استایلهای نویسنده وجود ندارد که استایلهای درونخطی مهم را لغو کنند.
تزئین متن معمولی و سایه کادر مهم، بخشی از استایلهای درونخطی استایل نیستند و بنابراین میتوانند لغو شوند. برای استایلهای غیرخطی معمولی، استایلهای بدون لایه اولویت دارند. برای استایلهای مهم، ترتیب لایه نیز مهم است. در حالی که استایلهای بدون لایه معمولی، تمام استایلهای معمولی تنظیم شده در یک لایه را لغو میکنند، با استایلهای مهم، ترتیب اولویت معکوس میشود. استایلهای مهم بدون لایه اولویت کمتری نسبت به استایلهای لایهای دارند.
دو style که فقط درون لایهها تعریف میشوند عبارتند از font-style با اهمیت معمولی و font-weight با پرچم . برای styleهای معمولی، لایه B که آخر از همه تعریف شده است، styleهای لایه A که قبلاً تعریف شده است را لغو میکند. برای styleهای معمولی، لایههای بعدی نسبت به لایههای قبلی اولویت دارند. ترتیب اولویت برای styleهای مهم برعکس است. برای اعلانهای مهم font-weight، لایه A که اول تعریف شده است، نسبت به آخرین لایه B که قبلاً تعریف شده است، اولویت دارد.
میتوانید با تغییر خط اول از به ترتیب لایهها را برعکس کنید. این را امتحان کنید. کدام styleها با این تغییر میکنند و کدامها ثابت میمانند؟ چرا؟
ترتیب لایهها با ترتیب نمایش لایهها در CSS شما تعیین میشود. در خط اول، ما لایهها را بدون اختصاص هیچ style با استفاده از و به دنبال آن نام لایههایمان که با یک نقطه ویرگول خاتمه مییابند، تعریف کردیم. اگر این خط را حذف میکردیم، نتایج یکسان میبود. چرا؟ ما قوانین style را در بلوکهای نامگذاری شده به ترتیب A و B تعیین کردیم. دو لایه در آن خط اول ایجاد شدند. اگر نبودند، این بلوکهای قانون آنها را به آن ترتیب ایجاد میکردند.
ما آن خط اول را به دو دلیل اضافه کردیم: اول اینکه بتوانید به راحتی خط را ویرایش کنید و ترتیب را تغییر دهید، و دوم اینکه اغلب متوجه خواهید شد که اعلام لایه ترتیب از قبل، بهترین روش برای مدیریت ترتیب لایههای شماست.
به طور خلاصه:
ترتیب اولویت لایهها، ترتیبی است که لایهها ایجاد میشوند.
پس از ایجاد، هیچ راهی برای تغییر ترتیب لایه وجود ندارد.
اولویت لایه برای styleهای معمولی، ترتیبی است که لایهها ایجاد میشوند.
styleهای معمولی بدون لایه، نسبت به styleهای معمولی لایهبندی شده اولویت دارند.
اولویت لایه برای styleهای مهم معکوس میشود، به طوری که لایههای ایجاد شده قبلی دارای اولویت هستند.
همه styleهای مهم لایهبندی شده نسبت به styleهای مهم (و معمولی) بدون لایه اولویت دارند.
styleهای درونخطی معمولی نسبت به همه styleهای معمولی، چه لایهبندی شده باشند و چه نباشند، اولویت دارند.
styleهای درونخطی مهم نسبت به همه styleهای دیگر، به استثنای styleهایی که در حال انتقال هستند، اولویت دارند. هیچ راهی برای استایلهای نویسنده وجود ندارد که استایلهای درونخطی مهم را نادیده بگیرند (به جز انتقال آنها که موقتی است).
ترتیب اولویت لایههای آبشاری تو در تو
ترتیب تقدم آبشاری برای لایههای تودرتو مشابه لایههای معمولی است، اما درون لایه قرار دارد. ترتیب تقدم بر اساس ترتیب ایجاد لایه تودرتو است. styleهای غیر تودرتو در یک لایه نسبت به سبکهای معمولی تودرتو اولویت دارند و ترتیب تقدم برای styleهای مهم معکوس میشود. وزن اختصاصی بین لایههای تودرتو مهم نیست، اگرچه برای styleهای متضاد در یک لایه تودرتو مهم است.
کد زیر styleها را به لایه components، لایه تودرتو و لایه تودرتو ایجاد و اضافه میکند:
در اینجا خلاصهای از ویژگیهای مورد استفاده و دلیل اعمال هر تعریف آمده است:
background-color: از آنجا که styleهای معمولی بدون لایه بر styleهای معمولی لایهای اولویت دارند، رنگ گندم برنده میشود.
border: از آنجا که در یک لایه، styleهای غیر تو در تو بر styleهای معمولی تو در تو اولویت دارند، رنگ قرمز برنده میشود.
color: در مورد styleهای مهم، styleهای لایهای بر styleهای بدون لایه اولویت دارند، و styleهای مهم در لایههای تعریفشده قبلی بر لایههای تعریفشده بعدی اولویت دارند. در این مثال، ترتیب ایجاد لایههای تو در تو به ترتیب و سپس است، بنابراین styleهای مهم در بر styleهای مهم در اولویت دارند، به این معنی که رنگ بنفش برنده میشود.
border-radius: این ویژگی فقط در لایههای تو در تو تنظیم شده است، بنابراین با توجه به ترتیب تعریف، شعاع 20٪ برنده میشود.