مقادیر و واحدهای طولی
پراپرتیهایی مانند width و height که برای تنظیم عرض و ارتفاع عناصر کاربرد دارند، به مقادیر عددی معرف طول
(length) نیاز دارند و برای این مقادیر، واحدهای اندازهگیری متعددی وجود دارد که باید بسته به شرایط، واحد
مناسب را از بین آنها انتخاب کنیم.
واحدهای اندازهگیری طول در CSS را میتوان در دو گروه واحدهای مطلق (absolute) و نسبی (relative) جای داد.
مقادیر تعیینشده با استفاده از واحدهای مطلق، همواره ثابت هستند اما مقادیر تعیینشده با استفاده از واحدهای
نسبی میتوانند تحت تأثیر عوامل خارجی، تغییر کنند. در ادامه، به بررسی این دو گروه واحدهای اندازهگیری در CSS
پرداخته و با تفاوتهای آنها و موارد استفادهی هر یک آشنا میشویم.
واحدهای طولی مطلق
واحدهای اندازهگیری مطلق (absolute units) گروهی از واحدهای اندازهگیری هستند که برای تعیین مقادیر ثابت و
قطعی کاربرد دارند. این واحدها نسبت به هیچ چیز دیگری سنجیده نمیشوند و همواره مقدار ثابتی دارند. جدول زیر
لیست واحدهای مطلق CSS را ارائه میدهد.
نام واحد اندازهگیری |
نماد واحد اندازهگیری |
مقادیر معادل |
سانتیمتر (centimeter) |
cm |
1cm=10mm=37.8px |
میلیمتر (millimeter) |
mm |
1mm=1/10cm |
اینچ (inch) |
in |
1in=2.54cm=96px |
پوینت (point) |
pt |
1pt≈1/72in |
پیکا (pica) |
pc |
1pc=12pt=1/6in |
پیکسل (pixel) |
px |
1px=1/96in |
واحدهای اندازهگیری مطلق (به جز واحد پیکسل) اساساً تنها زمانی مفید هستند که سایز رسانهی خروجی (output
medium) مشخص و ثابت باشد. برای مثال، این واحدها برای اسناد چاپی یا اسنادی که در نهایت، روی یک نمایشگر با
ابعاد مشخص و ثابت نمایش داده میشوند، مفید هستند.
اما با توجه به تنوع ابعاد فیزیکی نمایشگرها و امکان تغییر سایز پنجرهی مرورگر توسط کاربر، استفاده از واحدهای
مطلق در وب کار مرسومی نیست. طبیعتاً نمیتوانیم با استفاده از واحدهای اندازهگیری مطلق، صفحهای طراحی کنیم که
هم روی یک نمایشگر دسکتاپ و هم روی یک نمایشگر موبایل به خوبی نمایش داده شود. اما اگر صفحه را با این هدف طراحی
میکنیم که با سایز مشخصی چاپ شود و یا مثلاً در یک کنفرانس روی یک نمایشگر دارای اندازهی مشخص نمایش داده شود،
میتوانیم از واحدهای مطلق برای خلق یک طراحی دقیق استفاده کنیم.
در مثال زیر، از واحدهای مطلق برای تعیین اندازهی فونت متن با استفاده از پراپرتی font-size استفاده شده است:
CSS
.cm{
font-size: 1cm;
}
.pt{
font-size: 36pt;
}
.pc{
font-size: 4pc;
}
پیکسلهای فیزیکی و منطقی
در گذشته، یک پیکسل CSS که پیکسل منطقی (logical pixel) نیز گفته میشود، معادل یک پیکسل نمایشگر (physical
pixel) بود. اما در عصر نمایشگرهای ultrahigh-resolution این حرف دقیق نیست و لزوماً یک تناظر یکبهیک بین
پیکسلهای منطقی و فیزیکی وجود ندارد. در یک نمایشگر 4k یک پیکسل به قدری ریز است که به سختی با چشم غیر مسلح
دیده میشود. بنابراین، اگر قرار بود یک پیکسل منطقی معادل یک پیکسل فیزیکی باشد، یک فریم (border) یک پیکسلی
در چنین نمایشگری به سختی دیده میشد. بنابراین، هر پیکسل منطقی میتواند بسته به رزولوشن نمایشگر، به صورت یک
یا چند پیکسل فیزیکی رندر شود.
به طور کلی، استفاده از واحدهای مطلق در وب توصیه نمیشود. حتی از واحد پیکسل هم بهتر است فقط در موارد زیر
استفاده کنیم:
- تعیین مقدار پراپرتی border-width
- تعیین فونت پایهی صفحه با استفاده از پراپرتی font-size برای عنصر root یعنی html
- تعیین breakpoint در یک مدیاکوئری
واحدهای طولی نسبی
همانطور که گفتیم، واحدهای مطلق به خاطر ماهیت ثابت و غیر قابل تغییرشان، برای استفاده در وب (جز در موارد خاص)
مناسب نیستند. اینکه کاربران وب میتوانند ابعاد پنجرهی مرورگر خود را تغییر دهند، لزوم نیاز وب به واحدهای
اندازهگیری «انعطافپذیر» و به عبارت بهتر، «مقیاسپذیر» را نشان میدهد. اگر تنوع و تعدد نمایشگرهای مختلف
مورد استفاده توسط کاربران وب را نیز در نظر بگیریم، این نیاز را با شدت بیشتری حس میکنیم. اینجاست که واحدهای
نسبی مفید واقع میشوند.
واحدهای اندازهگیری نسبی (relative units) گروهی از واحدهای اندازهگیری در CSS هستند که مقدارشان ثابت و قطعی
نیست، بلکه همواره نسبت به چیزی سنجیده میشوند که میتواند تغییر کند. چیزی که یک واحد نسبی نسبت به آن سنجیده
میشود، میتواند ابعاد پنجرهی مرورگر و یا سایز فونت عنصر والد و یا موارد دیگر باشد. تعدادی از مهمترین
واحدهای نسبی در جدول زیر آورده شدهاند.
واحد |
ملاک اندازهگیری |
em |
سایز فونت عنصر |
ex |
ارتفاع کاراکتر x در فونت عنصر |
ch |
عرض کاراکتر 0 در فونت عنصر |
rem |
سایز فونت عنصر ریشهی سند (root element) یعنی عنصر html |
vw |
عرض پنجرهی مرورگر (viewport width) |
vh |
ارتفاع پنجرهی مرورگر (viewport height) |
vmin |
حداقل ابعاد پنجرهی مرورگر |
vmax |
حداکثر ابعاد پنجرهی مرورگر |
cap |
ارتفاع یک کاراکتر حرف بزرگ (capital) در فونت عنصر مورد نظر |
ic |
معادل شرق آسیایی واحد ch |
lh |
مقدار محاسبهشده برای پراپرتی line-height عنصر مورد نظر |
rlh |
مقدار محاسبهشده برای پراپرتی line-height عنصر root یعنی html |
چهار واحد انتهایی جدول بالا یعنی واحدهای cap، ic، lh و rlh به تازگی معرفی شدهاند و در نتیجه از پشتیبانی
مناسبی در مرورگرها برخوردار نیستند. واحدهای دیگری مانند vi و vb نیز اخیراً معرفی شدهاند و فعلاً در فاز
آزمایشی قرار دارند و لذا در مرورگرها پشتیبانی نمیشوند.
دو مورد از پرکاربردترین واحدهای جدول بالا، واحدهای em و rem هستند که برای سایزدهی به هر چیزی از متون تا
باکسها مورد استفاده قرار میگیرند. بنابراین، درک صحیح این واحدها بسیار مهم است.
واحد em
همانطور که در جدول بالا هم اشاره شده، واحد em نسبت به سایز فونت عنصر سنجیده و محاسبه میشود. به مثال زیر دقت
کنید:
CSS
.header{
font-size: 24px;
padding: 0.5em;
}
در اینجا مقدار پراپرتی font-size برای عنصر header برابر با 24px است و بنابراین، مقدار 0.5em برای پراپرتی
padding معادل با 12px است. حالا به مثال زیر توجه کنید:
CSS
.header{
font-size: 24px;
padding: 0.5em;
}
.header li{
font-size: 0.75em;
}
.header li a{
font-size: 0.5em;
}
میدانیم که font-size یک پراپرتی inherited است (یعنی مقدارش از والد به فرزند به ارث میرسد). بنابراین، عناصر
li درون header دارای سایز فونت 24px خواهند بود. بنابراین، مقدار 0.75em معادل 18px است. اما برای عناصر a درون
li مقدار پراپرتی font-size از والد یعنی li به ارث میرسد و بنابراین، معادل 18px است و مقدار 0.5em برای این
عناصر معادل 9px خواهد بود.
همانطور که مثال بالا نشان میدهد، وقتی از واحد em برای عناص تودرتو شده استفاده میکنیم، باید مراقب ماهیت
سلسلهمراتبی آن که ناشی از به ارث رسیدن مقدار پراپرتی font-size از والد به فرزند است، باشیم.
واحد rem
rem نیز یک واحد مشابه با em است که نسبت به سایز فونت عنصر ریشه که در اسناد HTML همان عنصر html است، سنجیده
میشود. واحد rem بر خلاف em ماهیت سلسلهمراتبی ندارد، چون همیشه نسبت به سایز فونت عنصر html سنجیده میشود.
مثال زیر را ببینید:
CSS
html{
font-size: 16px;
}
.ems li{
font-size: 1.3em;
}
.rems li{
font-size: 1.3rem;
}
در اغلب مرورگرها، سایز فونت پیشفرض عنصر html برابر با 16px است و بنابراین، اگر پراپرتی font-size را برای
عنصر html تنظیم نکنیم، برابر با 16px در نظر گرفته میشود و لذا مقداری مثل 2rem معادل 32px خواهد بود.
واحد rem برای پراپرتیهای مربوط به layout یک انتخاب مناسب محسوب میشود. در صورت زوم روی پنجرهی مرورگر،
همهچیز به زیبایی و با حفظ تناسب، تغییر اندازه میدهد.
وحدهای Viewport
واحدهای vw و vh واحدهای viewport نامیده میشوند، چون نسبت به viewport یا همان پنجرهی مرورگر سنجیده میشوند.
البته اگر بخواهیم دقیقتر باشیم، منظور از viewport بخشی از سند است که توسط کاربر مشاهده میشود؛ یعنی پنجرهی
مرورگر منهای بخشهایی مثل نوار عنوان و نوار آدرس. واحدهای اندازهگیری vw و vh به ما امکان میدهند که سایز
عناصر را نسبت به viewport و به عنوان درصدی از عرض و ارتفاع viewport فعلی تعیین کنیم. 1vw معادل یک درصد عرض
viewport و 1vh معادل یک درصد ارتفاع viewport است. مثال زیر را ببینید:
CSS
div{
border: 1px solid gray;
background-color: lime;
width: 50vw;
height: 20vh;
padding: 20px;
font-size: 2vm;
}
در مثال بالا، با تغییر سایز پنجرهی مرورگر، ابعاد باکس مورد نظر و نیز سایز فونت آن تغییر میکند به گونهای
که همواره عرض باکس برابر با 50 درصد عرض پنجرهی مرورگر و ارتفاع باکس همواره برابر با 20 درصد ارتفاع پنجره
باشد و متن درون باکس همواره با فونتی به بزرگی 2 درصد عرض پنجرهی مرورگر نمایش داده شود.
دو واحد اندازهگیری مبتنی بر viewport دیگر با نامهای vmin و vmax نیز داریم که مینیمم و ماکزیمم ابعاد
viewport را ملاک اندازهگیری قرار میدهند. یعنی 1vmin برابر است با مینیمم 1vw و 1vh و 1vmax برابر است با
ماکسیمم 1vw و 1vh.
سایر واحدهای نسبی
واحدهای اندازهگیری ch و ex که البته کمتر مورد استفاده قرار میگیرند، سایزدهی را بر اساس اندازهی کاراکترهای
مشخصی از فونتها انجام میدهند. به این ترتیب که واحد ex مقادیر را نسبت به ارتفاع کاراکتر x در فونت عنصر
میسنجد و واحد ch نیز عرض کاراکتر 0 در فونت عنصر را ملاک قرار میدهد. واحد ch برای تعیین سایز عرض باکسهای
حاوی متن مفید است؛ زیرا معادل با تعداد کاراکترهایی است که میتوان درون باکس جا داد.
با توجه به عدم پشتیبانی مرورگرهای قدیمیتر از این دو واحد و بهخصوص واحد ch باید از اینها به همراه یک
استراتژی fallback استفاده کرد.
واحد lh نیز همانطور که در جدول بالا ذکر شده، ارتفاع خطوط یا فاصلهی بین خطوط (line height) را به عنوان معیار
اندازهگیری در نظر میگیرد. این واحد اندازهگیری فعلاً در مود آزمایشی قرار دارد و اگر قصد استفاده از آن را
دارید، باید یک استراتژی fallback مناسب نیز فراهم کنید.