Débutant50 min35 XP
Objectifs de cette leçon
- Styler avec StyleSheet.create
- Créer des mises en page flexbox
- Adapter le style selon la taille de l'écran
Styling et Flexbox en React Native 🎨
En React Native, pas de CSS ! Tout se fait avec StyleSheet et Flexbox (le système de layout). C'est comme du CSS mais en JavaScript, et encore plus puissant !
1. StyleSheet.create() — la base 🎯
' StyleSheet.create() = l'équivalent de CSS en JavaScript ' ⚠️ Pas de classes CSS, pas de selecteurs, pas d'héritage ' Chaque propriété est en camelCase (pas de kebab-case) ' CSS → React Native : ' background-color → backgroundColor ' font-size → fontSize ' border-radius → borderRadius ' text-align → textAlign ``' ```tsx import { StyleSheet, View, Text } from "react-native"; // StyleSheet = style "optimisé" // Meilleure performance que les objets inline const styles = StyleSheet.create({ boite: { backgroundColor: "blue", padding: 16, borderRadius: 8, }, texte: { color: "white", fontSize: 18, fontWeight: "bold", }, }); ``' --- ## 2. Flexbox — tout le layout repose dessus 📐 text ' Flexbox en React Native = CSS Flexbox mais adapté ' ⚡ C'est LE système de layout, pas une option ! ' flexDirection : comment les enfants s'alignent ' column (défaut) : empilement vertical ' row : alignement horizontal ' justifyContent : alignement sur l'axe principal ' flex-start, center, flex-end, space-between ' alignItems : alignement sur l'axe secondaire ' stretch (défaut), center, flex-start, flex-end ' flex = proportion d'espace que prend un élément ' flex: 1 → prend tout l'espace disponible ' flex: 2 → prend 2× plus qu'un flex: 1 ``' --- ## 3. Exemple concret : mise en page d'une app 📱 ```tsx import { View, Text, StyleSheet } from "react-native"; function EcranAccueil() { return ( <View style={styles.container}> {/* En-tête */} <View style={styles.header}> <Text style={styles.titre}>Mon App</Text> <Text style={styles.sousTitre}>Bienvenue !</Text> </View> {/* Corps principal - prend tout l'espace */} <View style={styles.corps}> <View style={styles.carte}> <Text style={styles.carteTitre}>Carte 1</Text> </View> <View style={styles.carte}> <Text style={styles.carteTitre}>Carte 2</Text> </View> </View> {/* Barre de navigation en bas */} <View style={styles.footer}> <Text style={styles.footerTexte}>Accueil</Text> <Text style={styles.footerTexte}>Profil</Text> <Text style={styles.footerTexte}>Paramètres</Text> </View> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, // Prend tout l'écran backgroundColor: "#f5f5f5", }, header: { backgroundColor: "#6200ee", padding: 24, paddingTop: 60, // Safe area iOS }, titre: { color: "#fff", fontSize: 28, fontWeight: "bold" }, sousTitre: { color: "rgba(255,255,255,0.8)", fontSize: 16, marginTop: 4 }, corps: { flex: 1, // Prend tout l'espace restant flexDirection: "row", // Côte à côte justifyContent: "center", alignItems: "center", gap: 16, // Espacement padding: 16, }, carte: { flex: 1, // 50/50 entre les deux cartes backgroundColor: "#fff", borderRadius: 12, padding: 20, shadowOpacity: 0.1, shadowRadius: 4, elevation: 3, }, footer: { flexDirection: "row", justifyContent: "space-around", padding: 16, backgroundColor: "#fff", borderTopWidth: 1, borderColor: "#eee", }, }); ``' --- ## 4. Dimensions responsives 📏 ```tsx import { Dimensions, useWindowDimensions, StyleSheet, View, Text } from "react-native"; // Méthode 1 : Dimensions (statique) const { width, height } = Dimensions.get("window"); // Méthode 2 : useWindowDimensions (réactive, se met à jour) ✅ function EcranAdaptatif() { const { width, height } = useWindowDimensions(); const estPaysage = width > height; return ( <View style={[styles.container, estPaysage && styles.paysage]}> <Text> Largeur : {width}px | Hauteur : {height}px {"\n"}Mode : {estPaysage ? "🌅 Paysage" : "📱 Portrait"} </Text> </View> ); } ``' --- ## 5. NativeWind (Tailwind pour RN) 💨 ```tsx // NativeWind = écrire du Tailwind en React Native // Installation : npx expo install nativewind // Au lieu de StyleSheet.create() : { /* <View className="flex-1 bg-gray-100 p-4"> <Text className="text-2xl font-bold text-purple-600"> Hello NativeWind ! </Text> </View> */ } // Avantages : // • Plus rapide à écrire // • Mêmes classes que Tailwind web // • Dark mode facile // • Pas besoin de nommer les styles ``' --- ## Exercices pour toi 🎯 1. **Page profil** : crée un écran avec une photo ronde (borderRadius: 50), un nom centré, et 3 statistiques côte à côte (abonnés, abonnements, publications) 2. **Grille responsive** : affiche une grille 2×2 de cartes avec flexWrap: "wrap" et 50% de largeur chacune 3. **Adaptation** : utilise useWindowDimensions pour changer le layout entre portrait (colonne) et paysage (ligne)
Création des variables pas à pas
Prêt à explorer la mémoire
Appuie sur Play pour voir les variables se créer une par une
0/6
Visualisation d'exécution
ligne 6code
1import { StyleSheet, View, Text, Platform } from 'react-native';
2
3const styles = StyleSheet.create({
4 container: {
5 flex: 1,
6 flexDirection: 'row',
7 justifyContent: 'center',
8 alignItems: 'center',
9 backgroundColor: '#f0f0f0',
10 },
11 carte: {
12 flex: 1,
13 padding: 16,
14 margin: 8,
15 borderRadius: 12,
16 backgroundColor: '#fff',
17 ...Platform.select({
18 ios: { shadowColor: '#000', shadowOpacity: 0.2 },
19 android: { elevation: 4 },
20 }),
21 },
22});
Variables
flexDirection='row' (horizontal)
justifyContent='center'
alignItems='center'
Platform.OS=iOS/Android
📐 Bac à sable Flexbox
1
2
3
flexDirection
justifyContent
alignItems
⚡ Simulateur — Styling et Flexbox
Étape 1/7📝 Pseudo-code
1// StyleSheet.create()
2const styles = StyleSheet.create({ # ⬅ créer styles
3 container: {
4 flex: 1, # ⬅ prend tout
5 flexDirection: 'row', # ⬅ horizontal
6 justifyContent: 'center', # ⬅ centré axe principal
7 alignItems: 'center', # ⬅ centré axe secondaire
8 backgroundColor: '#f0f0f0',
9 padding: 16,
10 },
11 carte: {
12 flex: 1,
13 padding: 16,
14 margin: 8,
15 borderRadius: 12,
16 backgroundColor: '#fff',
17 ...Platform.select({ # ⬅ adaptatif
18 ios: { shadowColor: '#000', shadowOpacity: 0.2 },
19 android: { elevation: 4 },
20 }),
21 },
22});
📐 Styling React Native
💡 Règles Flexbox RN
- camelCase : backgroundColor, fontSize, etc.
- Nombres : padding: 16 (pas de px)
- flex: 1 : prend tout l'espace disponible
- Platform.select() : styles adaptatifs iOS/Android
StyleSheet.create() crée un objet de styles optimisé. Les styles sont en camelCase et prennent des nombres (pas de 'px').