Emotion: css() وstyled()
طبّق أنماطًا ديناميكية باستخدام المساعد css() ومصنع المكوّنات styled() في Emotion.
Emotion: css() وstyled() درس مجاني في CSS Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في CSS Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة CSS Academy 4 دروس في المجموع.
ما هي Emotion؟
Emotion هي مكتبة CSS-in-JS توفّر واجهة API مرنة. وتقدّم نهجين رئيسيين: دالة css()، وهي مستقلة عن أطر العمل، وواجهة API styled() المشابهة لـ styled-components. وينشئ كلاهما أسماء أصناف محصورة النطاق تلقائيًا.
تثبيت Emotion
توجد حزمتان، ويعتمد اختيارك بينهما على احتياجاتك:
npm install @emotion/react # css prop and Global
npm install @emotion/styled # styled() API
npm install @emotion/css # framework-agnosticدالة css()
تنشئ دالة css() اسم صنف انطلاقًا من كائن CSS أو من template literal:
import { css } from '@emotion/css';
const buttonStyle = css`
background: royalblue;
color: white;
padding: 10px 20px;
border-radius: 4px;
`;
function Button({ children }) {
return <button className={buttonStyle}>{children}</button>;
}كائنات CSS باستخدام css()
تُعد صياغة الكائنات بديلًا عن template literals، وهي مفيدة للإكمال التلقائي في TypeScript:
const cardStyle = css({
background: 'white',
borderRadius: '8px',
padding: '24px',
boxShadow: '0 4px 16px rgba(0,0,0,0.1)'
});واجهة API styled()
تعمل styled في Emotion بالطريقة نفسها تمامًا التي تعمل بها في styled-components، ما يسهّل الانتقال بينهما:
import styled from '@emotion/styled';
const Card = styled.div`
background: white;
border-radius: 8px;
padding: 24px;
`;
const FeaturedCard = styled(Card)`
border: 2px solid gold;
`;خاصية css (التنسيق المضمّن)
تتيح لك خاصية css في Emotion كتابة الأنماط مباشرةً على عناصر JSX، من دون الحاجة إلى مكوّن إضافي. وتتطلب حزمة @emotion/react ومكوّنًا إضافيًا لـ Babel/SWC:
/** @jsxImportSource @emotion/react */
function Component() {
return (
<div css={{ background: 'white', padding: '24px' }}>
Content
</div>
);
}الأنماط الديناميكية باستخدام Emotion
تقبل كلتا الواجهتين API دوالًا تتلقى props لاستخدام قيم ديناميكية:
const Badge = styled.span`
background: ${({ variant }) => variant === 'error' ? 'crimson' : 'royalblue'};
color: white;
padding: 2px 8px;
border-radius: 9999px;
`;الأنماط العامة
استخدم Global من @emotion/react لتطبيق CSS عام:
import { Global, css } from '@emotion/react';
function App() {
return (
<>
<Global styles={css`
*, *::before, *::after { box-sizing: border-box; }
body { margin: 0; }
`} />
</>
);
}مقارنة بين Emotion وstyled-components
تتطابق واجهتا API في Emotion وstyled-components تقريبًا. وتتمتع Emotion بأداء أفضل قليلًا في الاختبارات المعيارية، وحجم حزمة أصغر، كما توفّر خاصية css كواجهة API إضافية. وكلاهما خياران مثبتان للاستخدام في تطبيقات React الإنتاجية.
الإطارات المفتاحية في Emotion
عرّف الرسوم المتحركة باستخدام المساعد keyframes:
import { keyframes, css } from '@emotion/react';
const bounce = keyframes`
from { transform: translateY(0); }
to { transform: translateY(-20px); }
`;
const animated = css`
animation: ${bounce} 1s ease-in-out infinite alternate;
`;التصيير من جهة الخادم
تدعم Emotion التصيير من جهة الخادم عبر extractCriticalToChunks() لجمع CSS الحرج وحقنه أثناء التصيير من جهة الخادم في أطر React مثل Next.js.
تحقق سريع
ما الفرق الأساسي بين دالة css() وواجهة API styled() في Emotion؟
مراجعة
توفّر Emotion واجهتي API رئيسيتين للتنسيق: تنشئ css() أسماء أصناف تُطبَّق عبر className، بينما تنشئ styled() مكوّنات React منسّقة. وتتيح خاصية css كتابة الأنماط بطريقة تشبه الأنماط المضمّنة مع الاستفادة الكاملة من إمكانات CSS. وتتوافق Emotion بدرجة كبيرة مع styled-components من حيث واجهة API، وغالبًا ما تكون أسرع. ويحدّد كلا النهجين نطاق الأنماط تلقائيًا باستخدام أسماء أصناف مولّدة.
الأسئلة الشائعة
هل درس «Emotion: css() وstyled()» مجاني؟
نعم — نص درس «Emotion: css() وstyled()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة CSS Academy، انتقل إلى CoddyKit PRO. تتضمن دورة CSS Academy 4 دروس في المجموع.
ماذا ستتعلم في «Emotion: css() وstyled()»؟
طبّق أنماطًا ديناميكية باستخدام المساعد css() ومصنع المكوّنات styled() في Emotion. تتمرن على CSS Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ CSS Academy؟
لا تُشترط خبرة سابقة. CSS Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Emotion: css() وstyled()»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس CSS Academy هذا؟
نعم. كل درس في CSS Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Styled-components: القوالب النصية الموسومة
- Emotion: css() وstyled()
- CSS Modules: الأنماط ذات النطاق المحدد
- Vanilla Extract: CSS-in-JS بلا وقت تشغيل