FlowingDev

شرح وحدات CSS: البيكسل، والـ em، وفن التحجيم الرقمي

تعلم الفرق بين وحدات CSS المطلقة (px, pt) والنسبية (em, rem, %, vw, vh) ولماذا يعتبر إتقانها مفتاحًا لتصميم الويب الحديث والمتجاوب.

جرّب الأداة: محول وحدات CSS

في جملة واحدة

وحدات CSS هي اللغة اللي نستخدمها عشان نقول للمتصفح يكبر أو يصغر الأشياء في صفحة الويب، وهي اللي تحدد إذا كانت الأحجام ثابتة زي الصخرة أو مرنة زي الموية.

المشكلة التي يحلها

في فجر الويب الغارق في أصوات الدايل-أب، كانت الحياة بسيطة. كان المطورون يصممون المواقع لدقة شاشة واحدة مجيدة—يمكن 800x600، أو 1024x768 إذا كنت متطورًا مرة. وكان الملك المتوج بلا منازع في ذاك العصر هو البيكسل (px). كان اتفاقًا مع الكون: واحد px في كودك يساوي بيكسل ضوئي واحد على الشاشة. كانت التخطيطات متوقعة، وإن كانت هشة.

ثم جاء الانفجار الكامبري للأجهزة. الآيفون. الأندرويد. الأجهزة اللوحية. اللابتوبات ذات الحواف النحيفة كالشفرة. الشاشات العملاقة بدقة 4K. الساعات الذكية. فجأة، أصبح ذلك الموقع بعرض 960px مجرد طابع بريد على شاشة ضخمة، وكابوسًا لا يمكن تصفحه يتطلب التمرير الأفقي على الهاتف. انتهى عهد البيكسل الذي كان يضمن اليقين. وعمّت الفوضى في المملكة.

هذه الفوضى ولّدت "تصميم الويب المتجاوب" (Responsive Web Design)، وهي فكرة أن الموقع يجب أن يتكيف برشاقة مع أي شاشة يُعرض عليها. لتحقيق ذلك، احتجنا إلى مفردات جديدة للحجم—مفردات لا تتعلق بالقياسات المطلقة والثابتة، بل بـالعلاقات.

هذه هي المشكلة التي تحلها وحدات CSS. إنها توفر مجموعة أدوات غنية من الوحدات النسبية (rem, em, %, vw, vh) التي تتيح لنا بناء واجهات مرنة وقابلة للتطوير ومتجاوبة حقًا. فبدلًا من أن نقول لصندوق "كن بعرض 500 بيكسل"، يمكننا الآن أن نقول "كن بعرض 80% من عرض العنصر الأب"، أو "ليكن حجم خطك 1.5 مرة من حجم الخط الأساسي المفضل للمستخدم". إنه تحول من إعطاء أوامر صارمة إلى وضع قواعد ذكية.

كيف تعمل من الداخل

عشان تفهمها صح، لازم تقسم الوحدات إلى كم معسكر مفاهيمي. الموضوع كله يدور حول مصدر الحقيقة اللي تعتمد عليه كل وحدة.

الوحدات المطلقة: المساطر التي لا تتغير

هذه الوحدات ثابتة. لا تهتم بالعنصر الأب، ولا بحجم الشاشة، ولا بأي شيء آخر. هي كما هي.

  • px (البيكسل): الوحدة اللي تعرفها وتحبها. بس هنا المفاجأة: بيكسل CSS ما عاد هو بيكسل فعلي في الشاشة! الشاشات عالية الدقة (مثل شاشات Retina من Apple) تحشر بيكسلات مادية متعددة في مساحة "بيكسل CSS" واحد. المواصفات القياسية تعرّف 1px بأنه 1/96 من البوصة. هذا التجريد يسمح لحدود بعرض 1px أن تبدو بنفس السماكة تقريبًا عبر أجهزة ذات كثافات بيكسل مختلفة. هي الوحدة الأكثر شيوعًا للأشياء التي تريدها أن تظل ثابتة، مثل border-width أو إزاحة box-shadow.
  • pt (النقطة): شبح من عالم الطباعة. في فن الطباعة، 1 نقطة تساوي 1/72 من البوصة. لا تُستخدم تقريبًا لتصميم الشاشات لأنها لا تتوافق مع شبكة البيكسلات، لكنك قد تراها في أوراق الأنماط المخصصة لطباعة صفحة ويب.

الوحدات المرتبطة بالخط: التحجيم مع النص

هذه الوحدات رائعة لإنشاء واجهات مستخدم قابلة للتطوير حيث تنمو أو تتقلص المسافات وأحجام العناصر مع حجم النص.

  • em: مرتبطة بـ font-size الخاص بـعنصرها الأب المباشر. هذه هي نقطة قوتها وضعفها بنفس الوقت. إذا كان لدى <div> font-size بقيمة 20px، فداخل هذا الـ div، padding: 1.5em سيُحتسب ليصبح 30px. لكن إذا وضعت عنصرًا آخر بداخله مع font-size: 0.8em، ستحصل على تأثيرات متراكمة.

    <div style="font-size: 20px;">
      <!-- حجم الخط هنا 20px -->
      <p style="padding: 1.5em;">
        <!-- الحشوة هنا 1.5 * 20px = 30px -->
        <strong style="font-size: 1.2em;">
          <!-- حجم الخط هنا 1.2 * 20px = 24px -->
        </strong>
      </p>
    </div>
    

    هذا التداخل يمكن أن يؤدي بسرعة إلى جنون رياضي.

  • rem (Root Em): البطل اللي كنا نحتاجه. وحدة rem مرتبطة فقط بـ font-size الخاص بالعنصر الجذري (الـ <html> tag). هذا يمحو مشكلة التراكم الموجودة في em. الـ font-size الافتراضي في معظم المتصفحات هو 16px، لذلك افتراضيًا، 1rem يساوي 16px في كل مكان في الصفحة. إذا غيّر المستخدم حجم الخط الافتراضي في متصفحه لتسهيل الوصول، فإن تخطيطك المبني بالكامل على rem سيتكيف معه، وهذا فوز كبير. لهذا السبب، rem هو المعيار الحديث لتحديد أحجام الطباعة، الحشو (padding)، الهوامش (margins)، ومعظم مكونات التخطيط.

وحدات مرتبطة بمنطقة العرض: التحجيم حسب النافذة

هذه الوحدات مرتبطة مباشرة بحجم نافذة المتصفح ("منطقة العرض" أو "viewport").

  • vw (Viewport Width) & vh (Viewport Height): وحدة vw تساوي 1% من عرض منطقة العرض؛ ووحدة vh تساوي 1% من ارتفاعها. width: 50vw يعني "اجعل هذا العنصر بنصف عرض نافذة المتصفح". الاستخدام الأشهر هو height: 100vh، والذي ينشئ قسم "hero" يملأ الشاشة عموديًا بشكل مثالي.
  • % (النسبة المئوية): الوحدة النسبية الأصلية. هي دائمًا مرتبطة بخاصية من خصائص عنصرها الأب. width: 50% يعني نصف عرض الحاوية الأب. font-size: 120% هو في الواقع نفس font-size: 1.2em. سلوكها يعتمد على السياق، مما يجعلها قوية ولكنها تتطلب منك الانتباه إلى العنصر الأب.

سحر دالة clamp(): التحجيم المرن

هنا يجتمع كل شيء. clamp() هي دالة CSS تتيح لك تحديد حجم ينمو ولكنه مقيد بين قيمة دنيا وقيمة قصوى.

صيغتها هي clamp(MIN, PREFERRED, MAX).

  • MIN: القيمة الدنيا المطلقة. لن يصبح أصغر من هذا أبدًا.
  • PREFERRED: القيمة المثالية القابلة للتطوير. هنا عادةً ما تستخدم وحدة مرتبطة بمنطقة العرض، مثل 2vw، وغالبًا ما يتم دمجها مع وحدة rem (مثلًا، 1rem + 2vw).
  • MAX: القيمة القصوى المطلقة. لن يصبح أكبر من هذا أبدًا.

دعنا نلقي نظرة على مثال خرافي للطباعة المرنة: font-size: clamp(1rem, 1rem + 2vw, 2.25rem);

هذا السطر الواحد يخبر المتصفح:

  1. "أريد أن يكون حجم الخط 1rem + 2vw."
  2. "ولكن، إذا كانت قيمة 1rem + 2vw المحسوبة أصغر من 1rem (على شاشة صغيرة جدًا)، فاستخدم 1rem فقط."
  3. "وإذا كانت قيمة 1rem + 2vw المحسوبة أكبر من 2.25rem (على شاشة ضخمة)، فاستخدم 2.25rem فقط."

بهذا تحصل على نص مرن تمامًا يتكيف مع حجم الشاشة ولكنه لا يصبح أبدًا صغيرًا لدرجة عدم القراءة أو كبيرًا بشكل يثير الضحك، كل هذا بدون الحاجة لأي media query.

قصص من الواقع

كارثة تتالي الـ em المتراكمة

كُلف مطور مبتدئ بمهمة بناء سلسلة تعليقات متداخلة. ورغبة منه في أن يكون مطورًا جيدًا وحديثًا، استخدم الوحدات النسبية. قام بتصميم كل تعليق باستخدام font-size: .9em و padding: 1em بحيث تكون الردود أصغر قليلًا ولا تزال تحتوي على حشو متناسب. الرد الأول بدا رائعًا. لكن الرد على الرد كان صغيرًا جدًا. المستوى الرابع من التداخل كان مجرد ضباب من النصوص المجهرية. لقد وقع ضحية الطبيعة التراكمية لوحدة em. كل مستوى يضرب حجم الأب في 0.9، مما أدى إلى تأثير شعاع التصغير الأُسّي.

الدرس المستفاد: الـ em يتتالي. لتحقيق تناسق على مستوى الموقع حيث لا تريد تراكمًا، فإن rem هو صديقك المفضل الذي يمكن التنبؤ به والمستقر.

قسم الـ "Hero" كامل الارتفاع الذي لم يكن كذلك

سلم مصمم نموذجًا جميلًا مع صورة خلفية تملأ الشاشة بالكامل لأعلى الصفحة الرئيسية. وقال: "اجعلها تملأ الشاشة، بغض النظر عن الجهاز". المطور، وهو يفكر منطقيًا، طبق height: 100% على قسم الـ hero. اختفى القسم. حدق بعدم تصديق. بعد جلسة محمومة من تصحيح الأخطاء، تعلم أن height: 100% يعني 100% من ارتفاع الأب. لكن العنصر الأب <body> لم يكن له ارتفاع محدد—كان ارتفاعه يتحدد بمحتواه. 100% من "auto" لا تساوي شيئًا. قام بتغيير النمط إلى height: 100vh. وفجأة، حدث السحر. استقر قسم الـ hero تمامًا في الجزء السفلي من منطقة العرض على حاسوبه المحمول وهاتفه وشاشته العملاقة.

الدرس المستفاد: ارتفاعات النسبة المئوية تتطلب أبًا له ارتفاع محدد. وحدات منطقة العرض (vh و vw) هي خطك المباشر والواضح لأبعاد شاشة المستخدم.

رحلة البحث عن النص المرن المثالي

كان فريق يعمل على بناء صفحة هبوط ذات تأثير قوي. كان العنوان الرئيسي بحاجة إلى أن يكون ضخمًا على سطح المكتب ولكن يمكن التحكم فيه على الجوال. كان نهجهم الأول يستخدم استعلامات الوسائط (media queries): font-size: 80px لسطح المكتب، و 60px للكمبيوتر اللوحي، و 40px للجوال. لقد نجح الأمر، لكنه بدا غريبًا. عند تغيير حجم نافذة المتصفح، كان النص "يقفز" فجأة من حجم إلى آخر عند نقاط التوقف. كان يفتقر إلى الأناقة. ثم اكتشف أحد المطورين clamp(). استبدلوا ثلاثة استعلامات وسائط وثلاث قواعد CSS بسطر واحد: font-size: clamp(2.5rem, 8vw, 5rem);. كانت النتيجة مذهلة. أصبح النص الآن يتكيف بسلاسة ونعومة فائقة مع تغيير حجم النافذة، ينمو ويتقلص في حركة مستمرة ومرنة.

الدرس المستفاد: استعلامات الوسائط مخصصة لتغيير التخطيطات، لكن clamp() مخصصة لإنشاء خصائص مرنة حقًا. إنها توفر تجربة مستخدم أكثر سلاسة وتطورًا تبدو أقل "تقطعًا" من التحجيم القائم على نقاط التوقف.

أخطاء وفخاخ شائعة

  • نسيان قاعدة الـ rem: تحديد جميع الأحجام بوحدات rem دون معرفة ما هو font-size الجذري. حيلة شائعة هي تعيين html { font-size: 62.5%; } لجعل 1rem يساوي 10px سهلة الاستخدام. إذا لم تكن تعلم بحدوث ذلك، فإن عنصرك بحجم 2rem سيكون 20px، وليس 32px كما قد تتوقع.
  • الخلط بين em و rem: استخدام em لحشو مكون ما عندما تريده أن يتكيف مع واجهة المستخدم العامة (سيكون rem أفضل)، أو استخدام rem عندما تريد صراحة أن يتكيف حجم أيقونة مع font-size الزر الذي توجد بداخله (سيكون em أفضل).
  • وحدات vw وأشرطة التمرير: تطبيق width: 100vw على عنصر من المستوى الأعلى هو خطأ كلاسيكي. قياس 100vw يمكن أن يشمل عرض شريط التمرير العمودي، مما يتسبب في أن يكون عنصرك أعرض قليلًا من منطقة المحتوى ويؤدي إلى ظهور شريط تمرير أفقي مزعج.
  • التزمت الصارم بالبيكسل فقط: التمسك الديني باستخدام px لكل شيء، بما في ذلك font-size. هذا يخلق تصميمات جامدة تتجاهل تفضيلات إمكانية الوصول للمستخدم (مثل حجم خط افتراضي أكبر) ولا تتكيف جيدًا عبر الأجهزة.
  • الحماس الزائد في استخدام vh: استخدام height: 100vh على جهاز محمول يمكن أن يكون خادعًا. عندما تظهر واجهة مستخدم المتصفح (مثل شريط العنوان) أو تختفي عند التمرير، تتغير قيمة 1vh، مما يتسبب في "قفز" التخطيط. وقد أدى هذا إلى إدخال وحدات جديدة أكثر استقرارًا مثل dvh (ارتفاع منطقة العرض الديناميكي).

لماذا يجب أن تكون على رادارك

إذا كنت تتعامل مع CSS، فلا مفر من الوحدات. إنها أساسية مثل المحددات والخصائص. يجب أن يكون التفكير في الوحدة التي ستستخدمها عملية تلقائية في كل مرة تكتب فيها قيمة حجم.

اختيار الوحدة الصحيحة هو أساس تطوير الويب الحديث.

  • إنه ضروري لـ إمكانية الوصول (Accessibility): استخدام rem يسمح للمستخدمين بتكييف الواجهة حسب احتياجاتهم.
  • إنه جوهر التجاوب (Responsiveness): استخدام vw و vh و % يسمح للتخطيطات بالتكيف مع الشاشات المختلفة.
  • إنه مفتاح التصميم المرن (Fluid Design): استخدام clamp() يخلق تجارب سلسة وفاخرة تحدد المواقع المعاصرة.

إتقان وحدات CSS هو ما يرتقي بالمطور من مجرد شخص ينسخ ويلصق الأنماط إلى مهندس قادر على بناء واجهة قوية ومرنة ومتمحورة حول المستخدم، تعمل للجميع وعلى أي جهاز.

تعمق أكثر

انتهينا من النظرية. حان وقت التطبيق — 100% في متصفحك.

جرّب الأداة: محول وحدات CSS