Menu
flag Ar iconالعربيةdown icon

الدالة calc() في CSS: خلط الوحدات وقواعد الصيغة وأمثلة

تتيح calc() إجراء العمليات الحسابية في CSS وخلط الوحدات، مثل 100% ناقص شريط جانبي ثابت بعرض 200px. تعلّم قواعد الصيغة (المسافات مهمة)، وcalc() مع متغيرات CSS، والتخطيطات الشائعة التي تحلها، ولماذا تُتجاهل calc() غير الصالحة بصمت.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

ماذا تفعل calc()

تجري calc() العمليات الحسابية داخل قيمة CSS، ويمكنها خلط وحدات لا تحصل على حجمها إلا وقت التخطيط. الحالة الكلاسيكية هي «العرض الكامل ناقص شريط جانبي ثابت»:

لا تُعرف 100% إلا بعد ترتيب الصفحة، و180px ثابتة، فلا توجد وحدة واحدة تستطيع التعبير عن ذلك. تحسبها calc(): في معاينة بعرض 800px يكون عرض الصف 784px ويحصل العمود الرئيسي على 604px، والسطر تحت التخطيط يطبع الأرقام الحقيقية. اليوم يرتّب flexbox أو grid هذا التخطيط من دون حساب، لكن عملية الطرح نفسها ما زالت تظهر في كل مكان: ارتفاع ناقص ترويسة، أو عرض ناقص فجوة.

قواعد الصيغة

width: calc(100% - 2rem);          /* + and - need spaces on both sides */
width: calc(100% / 3);             /* divide by a plain number */
margin: calc(var(--space) * 2);    /* multiply by a plain number */
height: calc(100vh - (64px + 1rem)); /* parentheses group */
القاعدةصالحةغير صالحة
مسافات حول + و-calc(100% - 20px)calc(100%-20px)
*: أحد الطرفين على الأقل رقم مجردcalc(2 * 1rem)calc(2px * 3px)
/: اقسم طولًا على رقم مجردcalc(100% / 3)width: calc(300px / 3px) (ليست طولًا)
يجب أن تكون الوحدات متوافقةcalc(1rem + 10px)calc(1rem + 2s)

توجد قاعدة المسافات لأن 100% -20px ستُقرأ كقيمتين منفصلتين، الثانية منهما رقم سالب. حين تكون calc() غير صالحة يُلقى التصريح كله، ويحتفظ العنصر بأي قيمة كانت له من قواعد سابقة.

جرّب تعبيرًا

اكتب أي تعبير لعرض الصندوق. يخبرك المتصفح هل هو صالح، وبالعرض الذي حسبه:

جرّب 100%-200px (غير صالح، بلا مسافات)، و100% / 3، و50% + 4rem، و2 * 120px، و200px * 2px (غير صالح)، و(100% - 40px) / 2.

calc() مع متغيرات CSS

المتغيرات وcalc() تعملان معًا: خزّن قيمة أساسية مرة واحدة واشتق الباقي منها. المتغير بلا وحدة يصبح طولًا حين تضربه في وحدة واحدة:

غيّر --space إلى 12px أو --cols إلى 4 وستتبعه كل القيم المشتقة. تشرح صفحة متغيرات CSS تعريفها وتحديد نطاقها.

استخدامات شائعة

الحاجةcalc()
ملء المساحة بجانب عنصر ثابتwidth: calc(100% - 240px)
قسم تحت ترويسة ثابتةmin-height: calc(100vh - 64px)
نصف العرض ناقص نصف فجوةwidth: calc(50% - 8px)
توسيط صندوق مطلق بعرض 100pxleft: calc(50% - 50px)
حجم خط يكبر قليلًا مع الشاشةfont-size: calc(1rem + 0.5vw)
تحويل متغير رقمي إلى طولcalc(var(--n) * 1px)
سالب قيمة متغيرcalc(var(--space) * -1)

لقيمة يجب أن تبقى بين حدين استخدم clamp()، التي تقبل العمليات الحسابية نفسها في وسائطها من دون كتابة calc().

أين تعمل calc()

في أي مكان يُسمح فيه بطول أو نسبة مئوية أو رقم أو زاوية أو زمن: width وmargin وpadding وtop وfont-size وline-height وأحجام مسارات grid وtransition-delay والزوايا داخل transform. ويمكن تداخلها، وcalc() المتداخلة هي نفسها الأقواس العادية.

الزوايا مثال جيد. لكل علامة أدناه قيمة --i خاصة بها (من 0 إلى 11)، وقاعدة واحدة تحولها إلى زاوية عبر calc(var(--i) * 30deg):

تحصل العلامة 3 على rotate(90deg)، التي يعرضها Chrome كالمصفوفة matrix(0, 1, -1, 0, 0, 0): ربع دورة. وتوسّط left: calc(50% - 2px) كل علامة بطرح نصف عرضها البالغ 4px.

أخطاء شائعة

  • لا مسافات حول - أو +. calc(100%-20px) غير صالحة وتُتجاهل.
  • ضرب طولين. لا معنى لـ calc(10px * 2px) في CSS. أحد طرفي * يجب أن يكون رقمًا مجردًا.
  • استخدام calc() لارتفاع بالنسبة المئوية من دون ارتفاع للأب. تحتاج calc(100% - 20px) في height إلى أب له ارتفاع مضبوط، تمامًا كما تحتاج height: 100%.
  • استخدام calc() حيث يكفي flexbox أو grid. width: calc(33.333% - 10px) للأعمدة هشة؛ وdisplay: grid; grid-template-columns: repeat(3, 1fr); gap: 15px لا تحتاج إلى أي حساب.
  • توقع رسالة خطأ. لا يحذّر المتصفح من calc() غير الصالحة. افحص العنصر في أدوات المطور: التصريح غير الصالح يظهر مشطوبًا.

الأسئلة الشائعة

ماذا تفعل calc() في CSS؟

تحسب قيمة من تعبير فيه + و- و* و/، ويمكنها خلط وحدات لا يعرفها المتصفح إلا وقت التخطيط. width: calc(100% - 200px) هي العرض الكامل للأب ناقص 200px، مهما كان عرض الأب.

لماذا لا تعمل calc() عندي؟

السبب الأكثر شيوعًا غياب المسافات: يجب أن تحيط مسافة بيضاء بـ + و- من الجانبين، فـ calc(100%-20px) غير صالحة. أسباب أخرى: ضرب طولين (10px * 2px) أو القسمة على طول، وهذا لا ينتج طولًا. calc() غير الصالحة تجعل التصريح كله غير صالح، فيتجاهله المتصفح.

هل يمكن استخدام متغيرات CSS داخل calc()؟

نعم. تضاعف calc(var(--gap) * 2) قيمة متغير، وتحوّل calc(var(--columns) * 1px) رقمًا بلا وحدة إلى بكسلات. تُستبدل قيمة المتغير أولًا ثم تُجرى العملية الحسابية.

هل أحتاج إلى مسافات حول * و/ في calc()؟

لا. وحدهما + و- تتطلبان مسافات، لأن -20px من دونها ستُقرأ كرقم سالب. المسافات حول * و/ اختيارية، لكن كتابتها في كل مكان هي أسهل قاعدة للتذكر.

ما الفرق بين calc() وclamp()؟

تحسب calc() قيمة واحدة من تعبير. أما clamp(MIN, VAL, MAX) فتبقي قيمة بين حدين. ويمكن الجمع بينهما: كل وسيط في clamp() يقبل أصلًا عمليات حسابية على طريقة calc، مثل clamp(1rem, 1rem + 2vw, 3rem).

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن