التخطيط بـ Flexbox في الأجهزة الذكية
ترتيب الواجهة على شاشات الهواتف بـ Flexbox. ⏱ نحو 35 دقيقة.
- تعرف أن كل تخطيطٍ في
RNهوFlexbox، واتجاهه الافتراضي عموديّ. - تضبط الاتجاه والتوزيع والمحاذاة.
- توزّع المساحة نسبيًّا بـ
flexلتصميمٍ متجاوب.
١كل تخطيطٍ Flexbox
في React Native، كل View صندوق Flexbox — لا شبكة CSS ولا float. تتحكّم في الترتيب بثلاث خصائص رئيسة. وأهم فرقٍ عن الويب:
| الخاصية | تتحكّم في | قيَم شائعة |
|---|---|---|
flexDirection | اتجاه المحور الرئيس | column (افتراضي) · row |
justifyContent | التوزيع على المحور الرئيس | flex-start · center · space-between |
alignItems | المحاذاة على المحور المتعامد | stretch · center · flex-start |
٢الاتجاه: عمود أم صف
import { View, Text, StyleSheet } from 'react-native'; function Box({ n }) { return <Text style={styles.box}>{n}</Text>;} export default function App() { return ( <View style={{ padding: 12 }}> <Text style={styles.h}>row (صفّ):</Text> <View style={{ flexDirection: 'row', gap: 8 }}> <Box n="1" /><Box n="2" /><Box n="3" /> </View> <Text style={styles.h}>column (عمود — الافتراضي):</Text> <View style={{ gap: 8 }}> <Box n="1" /><Box n="2" /><Box n="3" /> </View> </View> );} const styles = StyleSheet.create({ h: { fontWeight: 'bold', marginTop: 10, marginBottom: 4 }, box: { backgroundColor: '#E8820C', color: 'white', padding: 12, borderRadius: 8, textAlign: 'center', minWidth: 40 },});
٣التوزيع والمحاذاة
justifyContent يوزّع على المحور الرئيس، وalignItems يحاذي على المتعامد. مفيدةٌ لشريطٍ علويّ: عنوانٌ ناحية وأيقونةٌ ناحية:
import { View, Text, StyleSheet } from 'react-native'; export default function App() { return ( <View style={styles.bar}> <Text style={styles.title}>الرئيسية</Text> <Text style={styles.icon}>☰</Text> </View> );} const styles = StyleSheet.create({ bar: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#E8820C', padding: 14, }, title: { color: 'white', fontSize: 18, fontWeight: 'bold' }, icon: { color: 'white', fontSize: 22 },});
٤flex: توزيع المساحة
الخاصية flex توزّع المساحة الفارغة بين العناصر نسبيًّا. flex: 1 لكليهما = نصفان متساويان؛ قيمٌ مختلفة = نِسبٌ مختلفة:
import { View, Text, StyleSheet } from 'react-native'; export default function App() { return ( <View style={{ flexDirection: 'row', height: 100, padding: 8, gap: 6 }}> <View style={[styles.col, { flex: 2, backgroundColor: '#E8820C' }]}> <Text style={styles.t}>flex: 2</Text> </View> <View style={[styles.col, { flex: 1, backgroundColor: '#2E7D32' }]}> <Text style={styles.t}>flex: 1</Text> </View> </View> );} const styles = StyleSheet.create({ col: { justifyContent: 'center', alignItems: 'center', borderRadius: 8 }, t: { color: 'white', fontWeight: 'bold' },});
اليسار يأخذ ضعف اليمين. flex ثورةٌ للتصميم المتجاوب: لا أبعاد ثابتة، بل نِسب.
توقّع وتحقّق
الاتجاه الافتراضي لـ View في React Native:
أي خاصية توزّع العناصر على المحور الرئيس؟
لجعل عنصرٍ يأخذ كل المساحة المتاحة:
لوضع عنوانٍ ناحية وأيقونةٍ ناحية في صفّ:
الخلاصة
- كل
ViewصندوقFlexbox، والاتجاه الافتراضيcolumn(عكس الويب). justifyContentللمحور الرئيس،alignItemsللمتعامد.flexيوزّع المساحة نسبيًّا — أساس التجاوب بلا أبعادٍ ثابتة.
تحدٍّ برمجي: شريط علويّ متوازن
سهلاصنع شريطًا علويًّا: عنوانٌ على جهة وزرُّ إعداداتٍ على الجهة الأخرى.
- View بـ
flexDirection: 'row'وjustifyContent: 'space-between'وalignItems: 'center'. <Text testID="brand">نصّه «تطبيقي».<Text testID="gear">نصّه «⚙».
👀 اعرض الناتج المطلوب (وجرّبه)
- الكود يعمل بلا أخطاء في Console
- العلامة في
testID=brand - الزرّ في
testID=gear - استُخدم
flexDirection: row - استُخدم
space-between
💡 تلميح 1
💡 تلميح 2
space-between يدفع الأول للبداية والأخير للنهاية.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
import { View, Text, StyleSheet } from 'react-native'; export default function App() { return ( <View style={styles.bar}> <Text testID="brand" style={styles.t}>تطبيقي</Text> <Text testID="gear" style={styles.t}>⚙</Text> </View> );} const styles = StyleSheet.create({ bar: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#E8820C', padding: 14 }, t: { color: 'white', fontSize: 18, fontWeight: 'bold' },});