ماذا تفعل transform
تغيّر transform طريقة رسم العنصر: تحريكه، أو تغيير حجمه، أو تدويره، أو إمالته. تُظهر الحدود المتقطعة أدناه أين كان سيقع كل صندوق من دون تحويله:
تحرّك translate(20px, 10px) الصندوق الأزرق 20px إلى اليمين و10px إلى الأسفل. وتجعل scale(1.3) الأخضر أكبر بنسبة 30% حول مركزه. وتدير rotate(20deg) الكهرماني مع عقارب الساعة، وتميل skewX(-20deg) الداكن. في كل الحالات تبقى الخانة المتقطعة، أي المساحة التي يشغلها العنصر في التخطيط، في مكانها تمامًا.
دوال التحويل
| الدالة | ماذا تفعل | مثال |
|---|---|---|
translate(x, y) | تحرّك | translate(20px, -10px)، translate(-50%, -50%) |
translateX(x) / translateY(y) | تحرّك على محور واحد | translateY(-4px) |
scale(s) / scale(x, y) | تغيّر الحجم (1 = الأصلي، 0.5 = النصف، والقيمة السالبة تعكس) | scale(1.1)، scale(-1, 1) |
scaleX(s) / scaleY(s) | تغيّر الحجم على محور واحد | scaleX(0.5) |
rotate(angle) | تدير مع عقارب الساعة (والقيمة السالبة عكسها) | rotate(45deg)، rotate(0.25turn) |
skew(x, y) / skewX(a) / skewY(a) | تميل | skewX(-15deg) |
matrix(a, b, c, d, e, f) | كل ما سبق في مصفوفة واحدة، وهي غالبًا ما يعيده المتصفح | |
none | لا تحويل |
النسب المئوية في translate() نسبية إلى حجم العنصر نفسه، لا إلى حجم أبيه. وللتدوير صفحته الخاصة بالدرجات واللفات والدوران المستمر: rotate في CSS.
ساحة تجربة transform
حرّك المنزلقات. السطر الأول هو قيمة transform التي بنيتها؛ والثاني هو المصفوفة التي حسبها المتصفح منها، وهي ما تعيده getComputedStyle لأي تحويل:
التحويلات لا تحرّك التخطيط
العنصر المحوَّل يُرسم في مكان آخر، لكن الصفحة تُرتَّب كأنه غير محوَّل. يحتفظ جيرانه بمواضعهم. وهذا ما يجعل التحويلات مناسبة لتأثيرات التمرير والحركة: لا يُعاد ترتيب شيء حولها.
يبدو الصندوقان الأوسطان أكبر بمرة ونصف. المكبَّر بالتحويل يتداخل مع جيرانه ويبقى C مكانه؛ أما المكبَّر بـ width وheight فيدفع C مسافة 40px إضافية.
عدة تحويلات وترتيبها
ضع عدة دوال في transform واحدة، تفصل بينها مسافات. الترتيب يغيّر النتيجة، لأن كل دالة، بقراءة القيمة من اليسار إلى اليمين، تعمل في نظام الإحداثيات الذي تركته الدوال التي قبلها:
تحرّك الصندوق الأزرق 120px بشكل مستقيم ثم دار في مكانه. أما الأخضر فدار أولًا، فصار «محور x» الخاص به يشير قطريًا، فتحرّكه translateX(120px) على امتداد القطر. الدوال نفسها، والمكان مختلف.
الفخ الآخر: تصريح transform الثاني يستبدل الأول. إن كان للبطاقة transform: rotate(-2deg) وقاعدة التمرير تقول transform: scale(1.05)، يختفي التدوير عند التمرير. كرر الاثنين (rotate(-2deg) scale(1.05))، أو استخدم الخصائص المنفصلة أدناه.
transform-origin
يحدث تغيير الحجم والتدوير والإمالة حول نقطة ثابتة، هي أصل التحويل، وهي المركز افتراضيًا. غيّرها بكلمات مفتاحية أو أطوال أو نسب مئوية:
تدور الصناديق الثلاثة 25 درجة. الأول يدور حول منتصفه، والثاني يبقي زاويته العلوية اليسرى مثبتة على زاوية الخانة، والثالث زاويته السفلية اليمنى. القائمة المنسدلة التي تكبر خارجة من زرها تستخدم transform-origin: top مع scale().
الخصائص translate وscale وrotate
للمتصفحات الحديثة أيضًا ثلاث خصائص منفصلة تفعل ما تفعله الدوال، لكن يمكن ضبطها وتحريكها كلًا على حدة:
.card {
rotate: -2deg;
transition: scale 0.2s ease-out;
}
.card:hover {
scale: 1.05; /* the rotation stays, because it is a different property */
}
تتجمع دائمًا كأنها مكتوبة transform: translate(...) rotate(...) scale(...) قبل أي قيمة transform، مهما كان ترتيب تصريحك بها. لاحظ الصيغة: translate: 10px 20px وscale: 1.2 تأخذان قيمًا من دون أقواس الدالة.
التوسيط بـ translate(-50%, -50%)
لأن النسب المئوية في translate() تشير إلى حجم العنصر نفسه، توسّط top: 50%; left: 50%; transform: translate(-50%, -50%) عنصرًا بموضع مطلق بأي حجم داخل أبيه. تقارن صفحة توسيط div هذه الطريقة بـ flexbox وgrid.
أخطاء شائعة
- تصريحا
transform. اللاحق يفوز كليًا. اجمع الدوال، أو استخدم الخصائصrotateوscaleوtranslate. - تحويل عنصر سطري. يتجاهل
<span>أو<a>العاديانtransform. اجعلهinline-block. - توقع أن يتحرك الجيران. التحويلات لا تغيّر التخطيط أبدًا. لإفساح مساحة غيّر
widthأوmarginأوgap. - ترتيب خاطئ للدوال.
rotate()قبلtranslate()تحرّك على المحور المُدار. - مفاجآت مع أبناء
position: fixed. العنصر المحوَّل يصبح الكتلة الحاوية لأحفاده ذوي الموضع الثابت، فتتمرر معه الترويسة الثابتة التي بداخله. كما ينشئ سياق تراكب جديدًا لـz-index.
الأسئلة الشائعة
ماذا تفعل transform في CSS؟
تغيّر طريقة رسم العنصر: تحريكه (translate)، أو تغيير حجمه (scale)، أو تدويره (rotate)، أو إمالته (skew). يحتفظ العنصر بمكانه الأصلي في التخطيط، فلا تتحرك العناصر المحيطة به.
كيف أطبّق أكثر من تحويل في CSS؟
اذكرها في قيمة transform واحدة تفصل بينها مسافات: transform: translateX(50px) rotate(20deg) scale(1.2);. كتابة تصريح transform ثانٍ تستبدل الأول بدل أن تضيف إليه.
هل يهم ترتيب دوال التحويل؟
نعم. بقراءة القيمة من اليسار إلى اليمين (كما تُكتب الشيفرة)، تعمل كل دالة في المحاور التي تركتها الدوال السابقة، فتحرّك rotate(45deg) translateX(100px) العنصر على محور مُدار، بينما تحرّكه translateX(100px) rotate(45deg) بشكل مستقيم ثم تديره.
ما هي transform-origin؟
النقطة الثابتة التي يحدث حولها تغيير الحجم والتدوير والإمالة. الافتراضي هو المركز (50% 50%). تجعل transform-origin: top left العنصر يكبر من زاويته العلوية اليسرى أو يدور حولها.
لماذا لا تعمل transform على عنصر span عندي؟
لا تنطبق التحويلات على العناصر السطرية غير المستبدلة مثل <span> أو <a> العاديين. أعطِ العنصر display: inline-block أو block فتعمل التحويلات.