تفاوت واحدهای rem و em در CSS

مقدمه

در CSS برای تعیین اندازه‌ها گزینه‌های مختلفی در اختیار داریم. در طراحی‌های مدرن و واکنش‌گرا (Responsive)، استفاده از واحدهای نسبی مانند em و rem بسیار رایج است؛ زیرا این واحدها به‌صورت خودکار با اندازه فونت‌های تعریف‌شده در صفحه هماهنگ می‌شوند و انعطاف‌پذیری بیشتری نسبت به واحدهای ثابت مانند px دارند.

اگر مدتی با CSS کار کرده باشید، احتمالاً بارها از em و rem استفاده کرده‌اید. اما شاید هنوز این سؤال برایتان وجود داشته باشد که تفاوت دقیق این دو چیست و در چه شرایطی باید از هرکدام استفاده کرد.

در این مقاله به‌صورت ساده و کاربردی تفاوت em و rem را بررسی می‌کنیم.


خلاصه تفاوت em و rem

قبل از ورود به جزئیات، تفاوت اصلی این دو واحد را می‌توان این‌گونه خلاصه کرد:

  • زمانی که em برای font-size استفاده شود، نسبت به اندازه فونت عنصر والد (Parent) محاسبه می‌شود.
  • زمانی که em در سایر ویژگی‌ها مانند padding، margin یا width استفاده شود، نسبت به اندازه فونت همان عنصر محاسبه می‌شود.
  • واحد rem همیشه نسبت به اندازه فونت عنصر ریشه (html) محاسبه می‌شود.

آشنایی با واحد em

واحد em از دنیای تایپوگرافی وارد CSS شده است و به شما اجازه می‌دهد اندازه یک عنصر را نسبت به اندازه فونت والد آن تعیین کنید.

مثال:

.parent {
  font-size: 18px;
}

.child {
  font-size: 1.5em;
}

در این مثال:

1.5 × 18px = 27px

بنابراین اندازه فونت عنصر فرزند برابر با 27 پیکسل خواهد بود.


اگر والد font-size نداشته باشد چه می‌شود؟

اگر عنصر والد مقدار font-size نداشته باشد، مرورگر به سراغ والدهای بالاتر می‌رود.

این روند تا رسیدن به عنصر html ادامه پیدا می‌کند.

اگر در نهایت هیچ مقداری پیدا نشود، اندازه پیش‌فرض مرورگر که معمولاً 16px است استفاده خواهد شد.


استفاده از em در سایر ویژگی‌ها

واحد em فقط برای font-size نیست.

می‌توانید از آن در ویژگی‌هایی مانند:

  • padding
  • margin
  • width
  • height
  • max-width

و بسیاری از خصوصیات دیگر استفاده کنید.

مثال:

.parent {
  font-size: 18px;
}

.child {
  font-size: 1.5em;
  padding: 2em 1em;
}

در اینجا:

اندازه فونت فرزند:

27px

بنابراین:

padding-top = 54px
padding-bottom = 54px

زیرا:

2 × 27px = 54px

و همچنین:

padding-left = 27px
padding-right = 27px

زیرا:

1 × 27px = 27px

قانون مهم em

به خاطر سپردن این قانون بسیار مهم است:

✅ اگر em برای font-size استفاده شود:

نسبت به اندازه فونت والد محاسبه می‌شود.

✅ اگر em برای سایر ویژگی‌ها استفاده شود:

نسبت به اندازه فونت خود عنصر محاسبه می‌شود.


مشکل بزرگ em: اثر تجمعی (Compounding)

تا اینجا همه چیز عالی به نظر می‌رسد.

اما em یک مشکل شناخته‌شده دارد که به آن Compounding Effect یا اثر تجمعی گفته می‌شود.

مثال:

.parent {
  font-size: 15px;
}

.child {
  font-size: 2em;
}

ساختار HTML:

<div class="parent">
  I'm 15px

  <div class="child">
    I'm 30px

    <div class="child">
      I'm 60px

      <div class="child">
        I'm 120px
      </div>

    </div>
  </div>
</div>

نتیجه:

15px
30px
60px
120px

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

این اتفاق در پروژه‌های بزرگ می‌تواند باعث ایجاد مشکلات و نتایج غیرمنتظره شود.


واحد rem چیست؟

برای حل مشکل تجمعی em، واحد rem معرفی شد.

کلمه rem مخفف:

Root EM

است.

این واحد همیشه بر اساس اندازه فونت عنصر ریشه یعنی:

<html>

محاسبه می‌شود.


مثال استفاده از rem

html {
  font-size: 16px;
}

.parent {
  font-size: 15px;
}

.child-rem {
  font-size: 2rem;
}

HTML:

<div class="parent">
  I'm 15px

  <div class="child-rem">
    I'm 32px

    <div class="child-rem">
      I'm 32px

      <div class="child-rem">
        I'm 32px
      </div>

    </div>
  </div>
</div>

نتیجه:

15px
32px
32px
32px

چرا؟

زیرا:

2 × 16px = 32px

و rem فقط به مقدار تعریف‌شده در عنصر html توجه می‌کند.


مزیت اصلی rem

مزیت بزرگ rem این است که اندازه‌ها همیشه قابل پیش‌بینی هستند.

برخلاف em:

  • اندازه‌ها روی هم جمع نمی‌شوند.
  • وابستگی به والدها وجود ندارد.
  • در پروژه‌های بزرگ مدیریت راحت‌تری دارند.

rem فقط برای فونت نیست

همانند em، از rem نیز می‌توان در ویژگی‌های مختلف استفاده کرد:

padding: 2rem;
margin: 1rem;
width: 20rem;

تمام این مقادیر نسبت به اندازه فونت عنصر html محاسبه می‌شوند.


مقایسه em و rem

ویژگی em rem
مرجع محاسبه font-size والد عنصر html
اثر تجمعی دارد ندارد
قابل پیش‌بینی بودن کمتر بیشتر
مناسب برای طراحی‌های پیچیده متوسط عالی
انعطاف نسبت به والد زیاد کم

em یا rem؟ کدام بهتر است؟

واقعیت این است که هیچ‌کدام بهتر از دیگری نیستند.

انتخاب بین آن‌ها به نیاز پروژه بستگی دارد.

برخی توسعه‌دهندگان تقریباً تمام اندازه‌ها را با rem تعریف می‌کنند تا همه چیز یکپارچه و قابل پیش‌بینی باشد.

برخی دیگر از em در بخش‌هایی استفاده می‌کنند که وابستگی به اندازه فونت والد منطقی است؛ مثلاً برای فاصله‌های داخلی یک کامپوننت.


جمع‌بندی

واحدهای em و rem هر دو از مهم‌ترین واحدهای نسبی در CSS هستند و نقش مهمی در طراحی واکنش‌گرا دارند.

به طور خلاصه:

  • em نسبت به اندازه فونت والد محاسبه می‌شود و می‌تواند اثر تجمعی ایجاد کند.
  • rem همیشه نسبت به اندازه فونت عنصر html محاسبه می‌شود.
  • rem معمولاً برای طراحی‌های مدرن و مقیاس‌پذیر انتخاب محبوب‌تری است.
  • em زمانی کاربرد دارد که بخواهید اندازه‌ها به صورت طبیعی از والد تأثیر بگیرند.

در بسیاری از پروژه‌های حرفه‌ای امروزی، ترکیبی از هر دو واحد استفاده می‌شود تا هم انعطاف‌پذیری و هم قابلیت پیش‌بینی حفظ شود.

 

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

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

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