واحدهای نسبی

در واحدهای نسبی یک اندازه طولی نسبت به یک اندازه طولی دیگر محاسبه می شود به همین دلیل به آنها نسبی می گویند.

زمانی که از واحدهای نسبی در سی اس اس استفاده می کنیم خروجی ما به راحتی می تواند در محیطهای گوناگون وفق پیدا کند.

این واحدها در دوسته واحدهای نسبی وابسته به فونت و واحدهای نسبی وابسته به Viewport قرار می گیرند.

واحدهای نسبی وابسته به فونت

این واحدها در سی اس اس شامل چهار واحد ch, ex, em و rem می باشند.

استفاده از اینگونه واحدها مزیت های زیادی دارد به عنوان نمونه زمانی که کاربر صفحه را بزرگنمایی می کند دیگر فقط متن بزرگ نمی شود بلکه عناصر نگهدارنده متن هم به همان تناسب بزرگ می شوند و این موضوع برای طراحی های دسترسی پذیر و واکنشگرا بسیار سودمند است.

em

این واحد نمایانگر ویژگی font-size می باشد. یعنی 1em برابر مقداری است که برای ویژگی font-size عنصر تعیین می شود.


font-size: 20px;
padding: 2em; /* 2*20px = 40px */

اگر em برای خود font-size استفاده شود آنگاه برای محسابه کردن em باید به font-size پدر عنصر مورد نظر مراجعه کنیم.

این واحد بطور کامل در مطلب “راهنمای کامل em و rem” شرح داده شده است.

ex

از این واحد خیلی به ندرت استفاده می شود. واحد ex بر اساس اندازه ارتفاع کاراکتر x (کوچک) در فونتی که برای عنصر مورد استفاده قرار میگیرد مشخص می شود.

واحد ex
اندازه ارتفاع کاراکتر x

برخی مرورگرها ارتفاع x را دقیقا محاسبه می کنند در حالی که مرورگرهای دیگر برای آن یک مقدار تعیین می کنند که در بیشتر مواقع آن مقدار حدودا 0.5em می باشد.

در مثال زیر ارتفاع خطوط متن را برابر با 230 درصد ارتفاع کاراکتر x قرار می دهیم:


p {
  font-family: "Arial", sans-serif;
  line-height: 2.3ex;
}

توجه داشته باشید که اگر فونت Arial برای عنصر استفاده شود ارتفاع x آن فونت, مبنا می باشد اما اگر این فونت به هر نحوی در دسترس نباشد و فونت sans-serif برای عنصر استفاده شود اندازه ارتفاع کاراکتر x آن تعیین کننده است.

ch

واحد ch بر اساس اندازه عرض کاراکتر 0 (صفر) در فونتی که برای عنصر مورد استفاده قرار میگیرد مشخص می شود.

به عنوان نمونه در مثال زیر فاصله داخلی عنصر را به اندازه 10 برابر کاراکتر صفر فونتش مشخص کرده ایم:


.element {  
  padding: 10ch;
}

rem

این واحد کاملا شبیه به em عمل می کند با این تفاوت که به جای اینکه مبنای آن font-size عنصر مورد نظر باشد, اندازه فونتی است که برای عنصر ریشه یا همان <html> توسط ویژگی font-size تعیین شده است.

برای بررسی کامل این واحد به مطلب “راهنمای کامل em و rem” مراجعه کنید.

واحدهای نسبی وابسته به Viewport

این واحدها که شامل چهار واحد vmin, vw, vh و vmax می باشند وابسته به اندازه viewport یا همان قابی از صفحه که در یک لحظه قابل مشاهده توسط کاربر است می باشند.

زمانی که اندازه viewport تغییر کند باید اندازه این واحدها نیز تغییر کند. برای اینکه موضوع راحت تر درک شود فرض کنید اندازه فونت یک متن را با استفاده از یکی از این واحدها تعیین می کنیم. حال اگر پنجره مرورگر را بزرگ یا کوچک کنیم (که این کار باعث می شود اندازه viewport تغییر کند) باید اندازه متن هم نسبت به تغییرات آن تغییر کند.

حال می توان تصور کرد که چقدر استفاده از این واحدها برای زمانی که واکنشگرا طراحی می کنیم می تواند با ارزش باشد. چراکه این واحدها وابسته به اندازه دستگاه یعنی موبایل, تبلت و غیره تغییر می کنند.

vh

vh یا همان viewport height وابسته به ارتفاع viewport است.

یک واحد vh برابر با یک صدم ارتفاع viewport است. یعنی 1vh برابر 1% ارتفاع viewport خواهد بود.

وقتی اندازه فونت یک عنصر را با استفاده از درصد تعیین میکنیم آن درصد بر اساس اندازه فونت عنصر پدرش مورد محاسبه قرار می گیرد.


p {
  font-size: 150%;
}

یعنی 150 درصد اندازه فونت عنصر پدر پاراگراف.

اما اگر از واحد vh استفاده کنیم دیگر محاسبات کاری به عنصر نگهدارنده ندارد و مستقیما سراغ Viewport می رود. به عنوان نمونه اندازه فونت عنصر پاراگراف زیر برابر 5 درصد ارتفاع viewport می باشد.

فرض کنید ارتفاع viewport برابر با 400 پیکسل باشد داریم:


p {
  font-size: 5vh; /* (5*400)/100 = 20px */
}

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

See the Pen vh unit by Mojtaba Seyedi (@seyedi) on CodePen.

vw

vw یا همان viewport width وابسته به عرض viewport است.

یک واحد vw برابر با یک صدم عرض viewport است. یعنی 1vw برابر 1% عرض viewport خواهد بود.

این واحد کاملا مشابه با واحد vh عمل می کند با این تفاوت که مربوط به عرض viewport است.

اگر از واحد vw استفاده کنیم به عنوان نمونه اندازه فونت عنصر پاراگراف زیر برابر 5 درصد عرض viewport می باشد.

فرض کنید عرض viewport برابر با 400 پیکسل باشد داریم:


p {
  font-size: 5vw; /* (5*400)/100 = 20px */
}

دموی زیر را بصورت تمام صفحه باز کنید و عرض مرورگر را کم و زیاد کنید:

See the Pen vw unit by Mojtaba Seyedi (@seyedi) on CodePen.

vmin

واحد vmin برابر با مینیمم واحدهای vh و vw می باشد. یعنی 1vmin برابر با 1 درصد طول بعد کوچکتر viewport می باشد.

در مثال زیر اندازه فونت p برابر با 10 درصد طول بعد کوچکتر viewport خواهد بود:


p {
  font-size: 10vmin;
}

See the Pen vmin unit by Mojtaba Seyedi (@seyedi) on CodePen.

vmax

واحد vmax برابر با ماکزیمم واحدهای vh و vw می باشد. یعنی 1vmax برابر با 1 درصد طول بعد بزرگتر viewport می باشد.

در مثال زیر اندازه فونت p برابر با 10 درصد طول بعد بزرگتر viewport می باشد:


p {
  font-size: 10vmax;
}

See the Pen vmax unit by Mojtaba Seyedi (@seyedi) on CodePen.

کدام واحد؟

با وجود این تعداد واحدهای مختلف مطلق و نسبی شاید این سوال در ذهن ایجاد شود که آیا از هر کدام برای یک ویژگی خاص در سی اس اس باید استفاده کنیم؟ یا نه؟

جواب این است که می توان از هر یک از این واحدها برای هر ویژگی که اندازه طولی می پذیرد استفاده کرد.

اما باید به چند نکته توجه کنیم:

1. آیا خروجی ما مانیتور و اسکرین ها هستند؟ یا کاغذ, خروجی مد نظر ما می باشد؟

2. آیا واحد مورد نظر توسط مرورگرهایی که پروژه ما باید پشتیبانی کند, پشتیبانی می شود یا نه؟

3. آیا در حال ساختن ماژولی هستیم که باید به راحتی در جاهای دیگر مورد استفاده قرار گیرد و به راحتی بتوانیم اندازه های موجود در آن را تغییر دهیم بدون اینکه به دردسر بیافتیم؟

این ها سوال هایی هستند که در زمان انتخاب واحدها باید پرسیده شود و جواب آنها و انتخاب واحد مناسب تنها با تمرین و به مرور زمان با تجربه حاصل می شود.

همینطور چنین مطالبی قطعا می توانند به جواب دادن به این سوالات کمک کنند.

همچنین جدول زیر که از این مطلب گرفته شده است را با دقت بررسی کنید:

توصیه می شود در موارد خاص توصیه نمی شود
صفحه نمایش (screen) em, px, % ex pt, cm, mm, in, pc
چاپ em, cm, mm, in, pt, pc, % px, ex

پشتیبانی مرورگر ها

برای بررسی پشتیبانی مرورگرها در مورد واحدهای نسبی وابسته به فونت به این آدرس مراجعه کنید.

همچنین در مورد واحدهای نسبی وابسته به viewport جدول زیر گویای مطلب می باشد:


بیشتر بخوانید

15 دیدگاه برای “واحدهای نسبی

  1. سلام

    خیلی خوب بود، ممنون.

    پس با این تفاسیر استفاده از vw توی طراحی ریسپانسیو خیلی به درد میخوره، درسته ؟

    آیا میشه برای سایز فونت، max و min تعیین کرد ؟ کاری که برای عرض و ارتفاع یک عنصر امکان پذیره.

    مثلا بگیم سایز فونت این تگ p برابر با نصف vw باشه و حداکثر سایزش هم مثلا ۴۰ پیکسل باشه

    امکانش همچین چیزی وجود داره ؟

    کلا کنترل سایز فونت توی طراحی ریسپانسیو یه کم اذیت میکنه، راه حل شما چیه ؟

    ببخشید طولانی شد ؛)

    1. سلام.

      نه. متاسفانه همچین امکانی وجود نداره.

      برای این قضیه راه حل ثابتی وجود نداره. چند تا رویه هست که با توجه به شرایط و سلیقه خودتون انتخاب می شن.

      مثلا یکیش اینکه همه اندازه فونت ها واحد نسبی هستند پس به راحتی توی دستگاههای مختلف می تونید “فقط با تغییر اندازه فونت html” همه اندازه ها رو کنترل کنید.

      یا اینکه ماژولی کار کنید و هر ماژول رو توی دستگاههای مختلف کنترل کنید.

      یا اینکه مراقب هر عنصر باشید. و هر جا لازم بود فونت رو کم و زیاد کنید. که این مورد بیشترین کار رو میبره.

      در کل توی یه پروژه امکان داره از همه این موارد هم استفاده کنید و بستگی به طرح و موراد دیگر روش فرق می کنه

      موفق باشید.

  2. من دارم مطالب سایتتونو مطالعه میکنم عالییییییییه منتظر مطالب جدید تر و فصل ششم و هشتم هم هستم (لطفا مطالبی راجب به طراحی ریسپانسیو هم بزارید (البته اگه تا الان نذاشتید)) ممنون.

  3. سلام

    ممنون بابت مطالب مفید شما.

    می خواستم بدونم اگر “در حال حاضر” از واحدهای نسبی وابسته به Viewport

    استفاده کنیم “با توجه به پشتیبانی 77 درصدی مرورگرها” ، بعدها کارفرما اعتراض نمی کنه که چرا

    توی بعضی از مرورگر ها وب سایتش درست نمایش داده نمیشه ؟

    1. سلام.

      کاملا بستگی به پروژه داره دیگه. اگر بنا به طرح گفته شده باشه که باید توی فلان مرورگر درست دیده بشه چرا اعتراض میکنه.

      در مورد تمام ویژگی ها و پشتیبانی شون اینو در نظر داشته باشید که می تونید جاهایی که به طرح لطمه وارد نمیشه از اون ویژگی یا مورد خاص استفاده کنید. مثلا اگر با استفاده از این واحد یک عنصری کل صفحه رو بگیره حالا اگر کاربر توی ie باز کنه ارتفاع کمتر از کل صفحه باشه شاید خیلی بد نباشه و بشه این کار رو کرد.

      همینطور می تونید از Fallback استفاده کنید:

      
      height: 700px
      height: 100vh
      

      مرورگری که دومی رو پشتیبانی نمیکنه یک ارتفاع خاص میگیره که بصورت تخمینی نوشته شده

      متاسفانه یک قاعده کلی وجود نداره در این موارد همه چی به طرح بستگی داره.

  4. سلام و خسته نباشی آقا مجتبی سایتت خیییلی عالیه
    ی سوال خودت از کدوم یک از این واحد ها واسه منوی این سایت استفاده کردی ؟

  5. این واحدها که شامل چهار واحد vmin, vw, vh و vmax می باشند وابسته به اندازه viewport یا همان قابی از صفحه که که در یک لحظه قابل مشاهده توسط کاربر است می باشند
    سید جان یه “ک” کافیه :))

  6. سلام
    مطلب مفیدی بود اما بعضی چیزها رو متوجه نشدم مثل:
    مزیت واحدهای نسبی: زمانی که کاربر صفحه را بزرگنمایی می کند دیگر فقط متن بزرگ نمی شود بلکه عناصر نگهدارنده متن هم به همان تناسب بزرگ می شوند
    و همچنین vmin و vmax
    اگه توضیحی واضح تر درباره این موارد بدید خیلی بهتر میشه
    با تشکر

  7. سلام

    در مورد vh توی مثال شما گفتی که این اندازه 10% ویوپورت خواهد بود:
    “اما اگر از واحد vh استفاده کنیم دیگر محاسبات کاری به عنصر نگهدارنده ندارد و مستقیما سراغ Viewport می رود. به عنوان نمونه اندازه فونت عنصر پاراگراف زیر برابر 10 درصد ارتفاع viewport می باشد.

    فرض کنید ارتفاع viewport برابر با 400 پیکسل باشد داریم:”
    p {
    font-size: 5vw; /* (5*400)/100 = 20px */
    }
    در صورتی که میشه 20% نه 10….چجوری شما گفتی 10؟

سوال داری؟ برو به پنل پرسش و پاسخ

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