مقدمه

در این درس، با تعدادی از مهمترین افکت‌های بصری (visual effects) که می‌توان روی عناصر وب اعمال کرد، آشنا می‌شویم. ابتدا با پراپرتی filter آشنا شده و خواهیم دید که چطور می‌توانیم فیلترهای گرافیکی متنوعی را با استفاده از این پراپرتی روی عناصر اعمال کنیم. سپس، ایجاد گوشه‌های گِرد با استفاده از پراپرتی border-radius را یاد می‌گیریم و در نهایت، نحوه‌ی اعمال سایه روی عناصر با استفاده از پراپرتی‌های text-shadow و box-shadow را خواهیم دید.

اعمال فیلتر روی عناصر با پراپرتی filter

کمی با اسلایدرهای زیر بازی کنید و تأثیر اعمال فیلترهای مختلف روی تصویر زیر را ببینید.

تصویری از حکیم عمر خیام

اعمال این فیلترهای بصری در گذشته تنها به کمک اپلیکیشن‌های گرافیکی مانند فتوشاپ ممکن بود. اما حالا به لطف ماژول Filter effects در CSS می‌توان این فیلترها را بدون نیاز به ابزارهای خارجی و به‌صورت دینامیک روی تصاویر و سایر عناصر وب اعمال کرد. ماژول Filter effects شامل پراپرتی filter و یک نوع داده‌ی جدید با نام <filter-function> است که امکان افزودن لفکت‌های گرافیکی بالا را فراهم می‌کند.

نوع فیلتر از روی مقدار پراپرتی filter تعیین می‌شود که می‌تواند هر یک از توابع زیر باشد.

تابع فبلتر توضیح مثال
blur() این تابع فیلتری را که در دنیای گرافیک کامپیوتری با نام Gaussian blur شناخته شده و باعث ایجاد محوشدگی یا بلور می‌شود، روی عنصر اعمال می‌کند. پارامتر این تابع، میزان انحراف معیار تابع گاوسی است که تعیین می‌کند چه تعداد از پیکسل‌های صفحه با هم ترکیب شوند. بنابراین، مقادیر بالاتر به منزله‌ی افزایش بلور است. مقدار این پارامتر می‌تواند بر حسب هر یک از واحدهای طولی مانند پیکسل، em و rem باشد. filter: blur(4px)
filter: blur(.25em)
brightness() فیلتری است که باعث افزایش یا کاهش میزان روشنایی عنصر می‌شود. پارامتر این تابع، مقداری است بر حسب درصد و یا یک عدد بدون واحد. مقدار پیش‌فرض این پارامتر که باعث بی‌تأثیر بودن فیلتر می‌شود، مقدار 1 یا 100% است. مقادیر کمتر باعث تاریک‌تر شدن و مقادیر بیشتر از 1 یا 100% باعث روشن‌تر شدن عکس یا عنصر می‌شود. filter: brightness(.4)
filter: brightness(200%)
contrast() این فیلتر برای تعیین میزان کنتراست (تضاد بین رنگ‌های تیره و روشن) کاربرد دارد. پارامتر این تابع فیلتر می‌تواند یک عدد بدون واحد و یا بر حسب درصد وارد شود. مقادیر کمتر از 1 یا 100% باعث کاهش کنتراست و مقادیر بالاتر از 1 یا 100% باعث افزایش کنتراست می‌شوند. filter: contrast(1.75)
filter: contrast(50%)
drop-shadow() این فیلتر برای انداختن سایه‌ی بیرونی (drop shadow) روی عنصر کاربرد دارد. این تابع می‌تواند تا 4 پارامتر داشته باشد. یک مقدار رنگی برای تعیین رنگ سایه و سه مقدار طولی که به‌ترتیب معرف اُفست سایه در راستای افقی و عمودی و میزان بلور سایه هستند. نبود پارامتر رنگی باعث می‌شود که رنگ سایه از روی رنگ پراپرتی color عنصر والد تعیین شود و نبود هر یک از سه مقدار طولی باعث می‌شود تا آن پارامتر معادل صفر در نظر گرفه شود. filter: drop-shadow(5px 5px)
filter: drop-shadow(5px 10px red)
filter: drop-shadow(5px 10px 3px red)
grayscale() این فیلتر برای سیاه و سفید کردن عکس یا عنصر کاربرد دارد. پارامتر این تابع فیلتر می‌تواند یک عدد بدون واحد و یا بر حسب درصد باشد. مقدار پیش‌فرض این پارامتر 1 یا 100% است که باعث می‌شود عنصر کاملاً سیاه و سفید شود. مقدار صفر هم عنصر را دست‌نخورده باقی می‌گذارد. filter: grayscale(.7)
filter:grayscale(100%)
hue-rotate() با استفاده از این فیلتر می‌توانیم میزان hue را برای رنگ‌های موجود در عنصر تغییر دهیم. پارامتر این تابع فیلتر یک مقدار زاویه‌ای است که می‌تواند بر حسب درجه، رادیان، گرادیان و یا دور (turn) وارد شود. filter: hue-rotate(90deg)
invert() این فیلتر برای معکوس کردن رنگ‌ها کاربرد دارد. پارامتر این تابع فیلتر، مقداری است که یا به صورت یک عدد بدون واحد و یا بر حسب درصد وارد می‌شود. مقدار 0 هیچ تأثیری روی عنصر ندارد و مقدار 1 یا 100% رنگ‌ها را به طور کمل معکوس می‌کند. filter: invert(.3)
filter: invert(50%)
opacity() این فیلتر برای تعیین میزان شفافیت کاربرد دارد و مشابه پراپرتی opacity عمل می‌کند. filter: opacity(.8)
filter: opacity(.3)
saturate() این فیلتر برای تغییر میزان غلظت یا اشباع‌شدگی رنگ‌ها کاربرد دارد. پارامتر این تابع فیلتر، می‌تواند یک عدد بدون واحد و یا بر حسب درصد وارد شود. مقدار پیش‌فرض این پارامتر 100% یا 1 است اما مقادیر کمتر باعث کاهش غلظت رنگ‌ها و مقادیر بالاتر باعث افزایش غلظت رنگ‌ها می‌شوند. filter: opacity(.4)
filter: opacity(200%)
sepia() نام این فیلتر از روی یک لنز عکاسی گرفته شده که باعث می‌شود تصویر با رنگ‌های گرم‌تری نمایش داده شود. مقدار این تابع فیلتر، می‌تواند به صورت یک عدد بدون واحد و یا بر حسب درصد وارد شود. مقدار 0 بدون اثر است و مقدار 100% فیلتر sepia را به طور کامل اعمال می‌کند. filter: sepia(.4)
filter: sepia(100%)

ایجاد گوشه‌های گرد با پراپرتی border-radius

می‌دانیم که عناصر وب در CSS به صورت باکس‌های مستطیلی رندر می‌شوند. اگر بخواهیم گوشه‌های مستطیل را به جای زاویه‌ی 90 درجه‌ی پیش‌فرض به شکل گردتری نمایش دهیم، می‌توانیم از یک پراپرتی با نام border-radius استفاده کنیم.

در واقع، پراپرتی border-radius برای اعمال افکتی که در ترمینولوژی گرافیک کامپیوتری rounded corners نامیده می‌شود، کاربرد دارد. با استفاده از این افکت می‌توانیم ترتیبی دهیم که گوشه‌ها به صورت دایره‌ای یا بیضوی نمایش داده شوند. به مثال ساده‌ی زیر نگاه کنید.

 Copy Icon CSS
.rounded-corner{
  background-color: red;
  border-radius: 10px;
  height: 5rem;
  width: 5rem;
}

اما عبارت radius (به معنی شعاع) در نام پراپرتی border-radius به چه معناست؟ در مثال بالا، شعاع 10px برای گوشه‌های عنصر چگونه تفسیر می‌شود؟

برای درک این موضوع، باید یک دایره با شعاع داده‌شده در هر گوشه در نظر بگیرید. هیچ توضیحی نمی‌تواند به‌اندازه‌ی تصویر زیر گویا باشد.

نحوه محاسبه شعاع در پراپرتی border-radius

مثال بالا نحوه‌ی ایجاد گوشه‌های دایره‌ای را نشان می‌دهد. اما برای ایجاد گوشه‌های بیضوی، باید دو مقدار را به پراپرتی border-radius اختصاص دهیم که اولی معرف شعاع افقی و دومی شعاع عمودی بیضی است. این مقادیر را باید با اسلش (/) از هم جدا کنیم. مثال زیر را ببینید.

 Copy Icon CSS
.rounded-corners{
  background-color: red;
  border-radius: 20px / 10px;
  height: 5rem;
  width: 5rem;
}

اتفاقی که در مورد مثال بالا و گوشه‌های بیضوی رخ می‌دهد، شبیه تصویر زیر است.

گوشههای بیضوی با پراپرتی border-radius

پراپرتی border-radius یک پراپرتی اختصاری است که همزمان چهار پراپرتی زیر را مقداردهی می‌کند:

  • پراپرتی top-left-radius برای تنظیم میزان گردی گوشه‌ی بالا سمت چپ.
  • پراپرتی top-right-radius برای تنظیم میزان گردی گوشه‌ی بالا سمت راست.
  • پراپرتی bottom-right-radius برای تنظیم میزان گردی گوشه‌ی پایین سمت راست.
  • پراپرتی bottom-left-radius برای تنظیم میزان گردی گوشه‌ی پایین سمت چپ.

در مثال‌های بالا، ما یک مقدار (دایره‌ای یا بیضوی) را به پراپرتی اختصاری border-radius داده‌ایم که همانطور که می‌دانید، به این معناست که این مقدار برای هر چهار گوشه در نظر گرفته شود. اما طبیعتاً می‌توانیم مانند مثال زیر، مقادیر متفاوتی را برای هر گوشه تعیین کنیم.

 Copy Icon CSS
.rounded-corners{
  background-color: red;
  border-radus: 20pc 10px 5px 40px;
  height: 5rem;
  width: 5rem;
}

و یا اینکه هر یک از پراپرتی‌های بالا را به صورت جداگانه مقداردهی کنیم که البته در این صورت، باید توجه داشته باشید که در مورد گوشه‌های بیضوی، نیازی به قرار دادن اسلش بین مقادیر نیست.

 Copy Icon CSS
.rounded-corners{
  background-color: red;
  border-bottom-right-radius: 10px 20px;
  border-bottom-left-radius: 5px;
  border-top-left-radius: 20px 10px;
  border-top-right-radius: 50%;
  height: 5rem;
  width: 5rem;
}

ایجاد تفکت سایه با پراپرتی box-shadow

یکی از افکت‌های دیگری که می‌توان روی باکس عناصر اعمال کرد، افکت سایه (shadow) است که با استفاده از یک پراپرتی با نام box-shadow ایجاد می‌شود. برای سایه باید یک رنگ و هر یک از چهار پارامتر زیر را تنظیم کرد:

  • X offset یا فاصله‌ی افقی سایه از عنصر
  • Y offset یا فاصله‌ی عمودی سایه از عنصر
  • Blur radius یا شعاع محوشدگی که با رویکردی شبیه آنچه در مورد border-radius دیدیم، میزان محوشدگی (blurriness) سایه را تعیین می‌کند.
  • Spread radius که میزان پخش‌شدگی سایه را مشخص می‌کند.

در حالت پیش‌فرض، میزان blur و spread برای سایه صفر است و تغییر آنها اختیاری است اما X offset و Y offset حتماً باید تعیین شوند.

 Copy Icon CSS
.shadow{
  box-shadow: 5px 5px black;
  background: #CCCCCC;
  width: 10rem;
  height: 5rem;
}

می‌توانیم همانند مثال زیر، یک مقدار blur radius هم تعیین کنیم تا محو شدگی در سایه ایجاد شود.

 Copy Icon CSS
.shadow{
  box-shadow: 5px 5px 10px black;
  background: #CCCCCC;
  width: 10rem;
  height: 5rem;
}

اگر همانند مثال زیر، مقداری را برای spread radius تعیین کنیم و مقدار blur را روی صفر قرار دهیم، سایز سایه در همه‌ی جهات افزایش می‌یابد.

 Copy Icon CSS
.shadow{
  box-shadow: 5px 5px 0 5px black;
  background: #CCCCCC;
  width: 10rem;
  height: 5rem;
}

و بالاخره با اضافه کردن مجدد blur radius خواهیم داشت:

 Copy Icon CSS
.shadow{
  box-shadow: 5px 5px 10px 5px black;
  background: #CCCCCC;
  width: 10rem;
  height: 5rem;
}

با استفاده از کلمه کلیدی inset می‌توانیم ترتیبی دهیم که سایه مانند مثال زیر، درون باکس اعمال شود.

 Copy Icon CSS
.shadow{
  box-shadow: 0 0 25px black inset;
  background: #CCCCCC;
  width: 10rem;
  height: 5rem;
}

و بالاخره اینکه امکان اعمال بیش از یک سایه روی باکس وجود دارد. این کار می‌تواند مثلاً برای اعمال سایه‌های بیرونی و درونی به طور همزمان مفید باشد. کاری که در مثال زیر انجام شده است.

 Copy Icon CSS
.shadow{
  box-shadow: 0 0 10px 0 black, 0 0 25px red inset;
  background: #CCCCCC;
  width: 10rem;
  height: 5rem;
}