0Pricing
React Academy · درس

التنسيق باستخدام StyleSheet API وFlexbox

اكتب تنسيقات للجوال باستخدام StyleSheet.create وFlexbox دون أسماء فئات CSS.

التنسيق باستخدام StyleSheet API وFlexbox درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

لا توجد CSS في React Native

تستخدم React Native واجهة برمجة تطبيقات للتنسيق مبنية على JavaScript — فلا توجد ملفات CSS أو أسماء أصناف أو أسلوب التدرّج في تطبيق الأنماط. الأنماط عبارة عن كائنات JavaScript تُطبَّق عبر الخاصية style.

StyleSheet.create()

غلّف كائنات الأنماط داخل StyleSheet.create() لتحسين الأداء (إذ يجري التحقق من الأنماط وتحسينها مرة واحدة) وللاستفادة من الإكمال التلقائي في بيئة التطوير المتكاملة.

import { StyleSheet, View, Text } from 'react-native';

function Card() {
  return (
    <View style={styles.card}>
      <Text style={styles.title}>Hello</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  card: { padding: 16, backgroundColor: '#fff', borderRadius: 8, shadowColor: '#000', shadowOpacity: 0.1, elevation: 2 },
  title: { fontSize: 18, fontWeight: 'bold', color: '#111' },
});

الأنماط المضمّنة

طبّق الأنماط مباشرةً عبر الخاصية style. تدمج صيغة المصفوفة عدة كائنات للأنماط، وتتجاوز الأنماط اللاحقة الأنماط السابقة.

<View style={{ padding: 16, backgroundColor: '#f5f5f5' }} />

// Array merging:
<Text style={[styles.base, isActive && styles.active, { marginTop: 8 }]} />

Flexbox في React Native

تستخدم React Native تنسيق Flexbox افتراضيًا لترتيب العناصر، لكن بإعدادات افتراضية مختلفة عن الويب: القيمة الافتراضية لـ flexDirection هي 'column' (وليست 'row')، كما أن flex: 1 يملأ المساحة المتاحة.

const styles = StyleSheet.create({
  container: {
    flex: 1,                   // fill available space
    flexDirection: 'column',   // default in RN (web default is 'row')
    justifyContent: 'center',  // main axis alignment
    alignItems: 'center',      // cross axis alignment
  },
});

تنسيق الصف

استخدم flexDirection: 'row' لترتيب العناصر الفرعية أفقيًا، بما يحاكي CSS display: flex; flex-direction: row.

const styles = StyleSheet.create({
  row: {
    flexDirection: 'row',
    alignItems: 'center',
    gap: 12, // gap is supported in RN 0.71+
  },
});

<View style={styles.row}>
  <Image source={avatar} />
  <Text>{username}</Text>
</View>

flex مقارنةً بـ width/height

استخدم flex: N لتحديد الأحجام بشكل نسبي. تملأ flex: 1 كل المساحة المتبقية، بينما تحصل flex: 2 على ضعف المساحة التي تحصل عليها العناصر الشقيقة ذات flex: 1.

// Sidebar takes 1/3, content takes 2/3:
<View style={{ flexDirection: 'row', flex: 1 }}>
  <View style={{ flex: 1, backgroundColor: '#eee' }}>Sidebar</View>
  <View style={{ flex: 2 }}>Content</View>
</View>

تحديد الموضع المطلق

استخدم position: 'absolute' مع top وright وbottom وleft لعناصر التراكب — تمامًا كما يحدث عند تحديد الموضع المطلق في CSS داخل عنصر أب ذي موضع نسبي.

const badge = StyleSheet.create({
  badge: {
    position: 'absolute',
    top: -4,
    right: -4,
    width: 16,
    height: 16,
    borderRadius: 8,
    backgroundColor: 'red',
  },
});

الأنماط الخاصة بالمنصة

استخدم Platform.OS أو Platform.select() لتطبيق أنماط مختلفة على iOS وAndroid.

import { Platform } from 'react-native';

const styles = StyleSheet.create({
  shadow: {
    ...Platform.select({
      ios: { shadowColor: '#000', shadowOpacity: 0.2, shadowRadius: 4 },
      android: { elevation: 4 },
    }),
  },
});

الألوان

تقبل React Native سلاسل ألوان CSS (السداسية وrgb والمسمّاة)، كما توفر واجهة PlatformColor لألوان النظام.

import { PlatformColor } from 'react-native';

// System color — adapts to dark mode automatically:
const labelColor = PlatformColor('label', '#000'); // iOS 'label' semantic color

الأنماط الديناميكية باستخدام Props

احسب الأنماط من Props داخل المكوّن. مرّر دالة إلى StyleSheet أو احسب كائن الأنماط مباشرةً داخل السطر.

function Badge({ color, size = 16 }: { color: string; size?: number }) {
  return (
    <View
      style={[
        styles.badge,
        { backgroundColor: color, width: size, height: size, borderRadius: size / 2 },
      ]}
    />
  );
}

const styles = StyleSheet.create({ badge: { position: 'absolute' } });

تحقق سريع

ما القيمة الافتراضية لـ flexDirection في React Native، والتي تختلف عن الويب؟

مراجعة

استخدم StyleSheet.create() للأنماط المحسّنة، ثم طبّقها عبر الخاصية style. تكون القيمة الافتراضية لـ Flexbox في React Native هي flexDirection: 'column'، وتملأ flex: 1 المساحة المتبقية. استخدم Platform.select() لأنماط الظلال الخاصة بنظام التشغيل.

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

هل درس «التنسيق باستخدام StyleSheet API وFlexbox» مجاني؟

نعم — نص درس «التنسيق باستخدام StyleSheet API وFlexbox» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «التنسيق باستخدام StyleSheet API وFlexbox»؟

اكتب تنسيقات للجوال باستخدام StyleSheet.create وFlexbox دون أسماء فئات CSS. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «التنسيق باستخدام StyleSheet API وFlexbox»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مكوّنات React Native الأساسية مقابل DOM للويب
  2. التنسيق باستخدام StyleSheet API وFlexbox
  3. التنقل باستخدام Expo Router
  4. الوصول إلى واجهات الجهاز: الكاميرا والموقع والإشعارات الفورية
← العودة إلى React Academy