flex, flexGrow en responsieve afmetingen
Gebruik de eigenschap flex om beschikbare ruimte proportioneel over aangrenzende Views te verdelen en bouw een layout die zich aanpast aan elke schermbreedte.
flex, flexGrow en responsieve afmetingen is een gratis React Native Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject React Native Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus React Native Academy bevat in totaal 4 lessen.
De eigenschap flex uitgelegd
De eigenschap flex is een verkorte notatie waarmee je instelt hoe een View groeit en krimpt om de beschikbare ruimte binnen de bovenliggende container te vullen. In React Native lijkt flex op flex-grow uit CSS: het staat voor de verhouding van de beschikbare ruimte die het onderdeel inneemt. Als je flex: 1 instelt op één onderliggend element, vult dit alle resterende ruimte. Wanneer meerdere elementen op hetzelfde niveau een waarde voor flex hebben, wordt de ruimte evenredig verdeeld: een element met flex: 2 krijgt twee keer zoveel ruimte als een element met flex: 1.
import { View } from 'react-native';
export default function FlexDemo() {
return (
<View style={{ flex: 1, flexDirection: 'column' }}>
{/* Takes 1/3 of height */}
<View style={{ flex: 1, backgroundColor: '#ff6b6b' }} />
{/* Takes 2/3 of height */}
<View style={{ flex: 2, backgroundColor: '#4f86f7' }} />
</View>
);
}flex: 1 op de hoofdcontainer
Als je hoofdcomponent App of de buitenste View van het scherm geen flex: 1 heeft, krimpt het onderdeel tot de grootte van de inhoud en vult het niet het scherm. Dit is een van de meest voorkomende React Native-fouten bij beginners: de app lijkt geen opmaak te hebben omdat de hoofd-View geen hoogte heeft. Stel altijd flex: 1 in op de View op hoofdniveau en op tussenliggende containers die de beschikbare ruimte moeten vullen. Onderliggende Views zonder vaste grootte of eigenschap flex krimpen zodat hun inhoud precies past.
import { View, Text, StyleSheet } from 'react-native';
// WRONG: root View has no flex, collapses to text height
function WrongLayout() {
return (
<View style={{ backgroundColor: '#f5f5f5' }}>
<Text>This View only wraps its content.</Text>
</View>
);
}
// CORRECT: flex: 1 fills the screen
function CorrectLayout() {
return (
<View style={{ flex: 1, backgroundColor: '#f5f5f5' }}>
<Text>This View fills the entire screen.</Text>
</View>
);
}flexGrow, flexShrink en flexBasis
De verkorte notatie flex van React Native stelt flexGrow, flexShrink en flexBasis tegelijk in. flexGrow bepaalt hoeveel een onderliggend element groeit in extra ruimte. flexShrink bepaalt hoeveel het krimpt wanneer de ruimte beperkt is. flexBasis stelt de begin grootte in voordat het element groeit of krimpt (zoals CSS flex-basis). In de praktijk dekt flex: 1 de meeste gebruikssituaties. Gebruik flexShrink: 1 op een Text binnen een rij wanneer je wilt dat de tekst krimpt en een weglatingsteken toont in plaats van buiten de rij te vallen.
import { View, Text, StyleSheet } from 'react-native';
export default function FlexShrinkExample() {
return (
<View style={styles.row}>
<View style={styles.icon} />
{/* flexShrink: 1 allows text to shrink if the row is too small */}
<Text style={styles.label} numberOfLines={1}>
A very long label that could overflow without flexShrink
</Text>
<Text style={styles.badge}>NEW</Text>
</View>
);
}
const styles = StyleSheet.create({
row: { flexDirection: 'row', alignItems: 'center', padding: 12, gap: 8 },
icon: { width: 40, height: 40, borderRadius: 8, backgroundColor: '#4f86f7', flexShrink: 0 },
label: { flex: 1, flexShrink: 1, fontSize: 16, color: '#333' },
badge: { paddingHorizontal: 8, paddingVertical: 2, backgroundColor: '#ff6b6b', color: '#fff', borderRadius: 10, fontSize: 11, fontWeight: 'bold' },
});Dimensions API voor schermgrootte
Gebruik de Dimensions API uit react-native om in JavaScript de huidige breedte en hoogte van het scherm op te vragen. Dimensions.get('window') geeft het zichtbare appgebied terug (zonder systeembalken), terwijl Dimensions.get('screen') het volledige fysieke scherm teruggeeft. Dimensions is echter een statische momentopname en wordt niet bijgewerkt wanneer de gebruiker het apparaat draait. Gebruik voor responsieve indelingen die reageren op wijzigingen in de oriëntatie de hook useWindowDimensions, die bij elke wijziging van de afmetingen bijgewerkte waarden teruggeeft.
import { View, Text, Dimensions, useWindowDimensions } from 'react-native';
// Static (doesn't update on rotation)
const { width, height } = Dimensions.get('window');
// Reactive (updates on rotation — preferred)
export default function ResponsiveScreen() {
const { width, height } = useWindowDimensions();
const isLandscape = width > height;
return (
<View style={{ flex: 1, padding: 16 }}>
<Text>Width: {Math.round(width)}</Text>
<Text>Height: {Math.round(height)}</Text>
<Text>Mode: {isLandscape ? 'Landscape' : 'Portrait'}</Text>
</View>
);
}Percentages voor responsieve kolommen
Gebruik percentages als tekenreeksen voor width om indelingen te maken die zich aanpassen aan verschillende schermformaten zonder pixelwaarden hard te coderen. Een raster met twee kolommen gebruikt width: '48%' voor elke kaart, met een kleine tussenruimte. Een indeling met drie kolommen gebruikt width: '32%'. Het percentage is relatief aan de breedte van de bovenliggende container. Stel de breedte van de bovenliggende container expliciet in of maak deze flex: 1 om ervoor te zorgen dat de berekening klopt. Gebruik ook flexWrap: 'wrap' op de rijcontainer, zodat kolommen correct naar de volgende regel doorlopen.
import { View, StyleSheet } from 'react-native';
export default function TwoColumnGrid() {
return (
<View style={styles.grid}>
{[1, 2, 3, 4, 5, 6].map(n => (
<View key={n} style={styles.card} />
))}
</View>
);
}
const styles = StyleSheet.create({
grid: {
flexDirection: 'row',
flexWrap: 'wrap',
gap: 12,
padding: 16,
},
card: {
width: '47%', // ~2 per row with gap
height: 120,
backgroundColor: '#4f86f7',
borderRadius: 12,
},
});flex combineren met vaste afmetingen
Je kunt op flex gebaseerde afmetingen combineren met vaste waarden voor width en height in dezelfde indeling. Een veelgebruikt patroon is een zijbalkindeling: een zijpaneel met een vaste breedte (bijvoorbeeld width: 280) naast een inhoudsgebied met flex: 1 dat de rest van het scherm vult. Het paneel met de vaste grootte neemt precies 280 punten in, ongeacht de schermgrootte, terwijl het inhoudspaneel groeit of krimpt om alle resterende ruimte te gebruiken. Dit werkt ook voor kop- en voetteksten: containers met een vaste hoogte bovenaan en onderaan, met daartussen een inhoudsgebied met flex: 1.
import { View, Text, StyleSheet } from 'react-native';
export default function MasterDetail() {
return (
<View style={styles.container}>
{/* Fixed-width sidebar */}
<View style={styles.sidebar}>
<Text style={{ color: '#fff' }}>Sidebar</Text>
</View>
{/* flex: 1 content fills remaining space */}
<View style={styles.content}>
<Text>Main content area</Text>
</View>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, flexDirection: 'row' },
sidebar: { width: 200, backgroundColor: '#333', padding: 16 },
content: { flex: 1, backgroundColor: '#f5f5f5', padding: 16 },
});useWindowDimensions voor adaptieve indelingen
De hook useWindowDimensions rendert je component opnieuw wanneer de oriëntatie van het apparaat verandert of een indeling met meerdere vensters van grootte verandert. Gebruik deze hook om dynamisch te wisselen tussen indelingen met één kolom (staand) en twee kolommen (liggend). Bereken het aantal kolommen op basis van de vensterbreedte: als de breedte boven een drempelwaarde ligt (bijvoorbeeld 600), schakel je over naar twee of drie kolommen. Dankzij deze aanpak ziet je app er goed uit op telefoons, grote telefoons, tablets en zelfs desktops met Expo Web, zonder afzonderlijke indelingscomponenten te schrijven.
import { View, StyleSheet, useWindowDimensions } from 'react-native';
export default function AdaptiveGrid({ items }) {
const { width } = useWindowDimensions();
const numColumns = width >= 768 ? 3 : width >= 480 ? 2 : 1;
const cardWidth = (width - 32 - (numColumns - 1) * 12) / numColumns;
return (
<View style={styles.grid}>
{items.map(item => (
<View key={item.id} style={[styles.card, { width: cardWidth }]} />
))}
</View>
);
}
const styles = StyleSheet.create({
grid: { flexDirection: 'row', flexWrap: 'wrap', gap: 12, padding: 16 },
card: { height: 120, backgroundColor: '#4f86f7', borderRadius: 10 },
});minWidth, maxWidth, minHeight en maxHeight
Gebruik minWidth, maxWidth, minHeight en maxHeight om te beperken hoeveel een View kan groeien of krimpen. Dit is handig voor componenten die er goed uitzien bij verschillende hoeveelheden inhoud zonder aan de uitersten problemen te geven. Een knop kan bijvoorbeeld minWidth: 120 hebben, zodat deze altijd aanraakbaar is, zelfs met een label van één teken, en maxWidth: 320, zodat deze nooit over de volledige breedte van een tabletscherm uitrekt. Deze eigenschappen combineren met flex: 1 en width: '100%' is een gebruikelijk patroon voor gecentreerde inhoud met begrensde afmetingen op grotere schermen.
import { View, Text, StyleSheet } from 'react-native';
export default function BoundedContent() {
return (
<View style={styles.screen}>
{/* Content is at most 480px wide, centered */}
<View style={styles.content}>
<Text style={styles.text}>This content is bounded to look good on all screen sizes.</Text>
</View>
</View>
);
}
const styles = StyleSheet.create({
screen: { flex: 1, alignItems: 'center', backgroundColor: '#f5f5f5', padding: 16 },
content: {
width: '100%',
maxWidth: 480, // doesn't stretch on tablets/web
backgroundColor: '#fff',
borderRadius: 12,
padding: 20,
},
text: { fontSize: 16, lineHeight: 24, color: '#333' },
});Beeldverhouding voor consistente verhoudingen
De stijleigenschap aspectRatio stelt de verhouding tussen de breedte en hoogte van een component in. Wanneer width is ingesteld (of door flex wordt bepaald), berekent aspectRatio automatisch de height om de verhouding te behouden. aspectRatio: 16/9 maakt een videominiatuur in breedbeeldformaat. aspectRatio: 1 maakt een perfecte vierkant. Dit is vooral krachtig voor media-inhoud die zich aan verschillende schermbreedtes moet aanpassen: de hoogte wordt automatisch evenredig geschaald, zonder berekeningen of JavaScript.
import { View, Image, StyleSheet } from 'react-native';
export default function VideoThumbnail() {
return (
<View style={styles.thumbnailContainer}>
<Image
source={{ uri: 'https://picsum.photos/640/360' }}
style={styles.thumbnail}
/>
</View>
);
}
const styles = StyleSheet.create({
thumbnailContainer: {
width: '100%',
},
thumbnail: {
width: '100%',
aspectRatio: 16 / 9, // height auto-computed = width * 9/16
borderRadius: 10,
},
});Responsieve indeling met drie panelen
Combineer alle concepten voor afmetingen: flex, maxWidth en useWindowDimensions om een klassieke indeling met drie panelen te bouwen voor een notitie- of e-mailapp. Op kleine telefoons wordt er steeds maar één paneel tegelijk weergegeven. Op tablets in liggende stand verschijnen alle drie de panelen naast elkaar met behulp van verhoudingen in flex. Dit adaptieve patroon is mogelijk met Flexbox en hooks voor afmetingen in React Native, zonder complexe CSS-mediaquery's of afzonderlijke indelingen.
import { View, useWindowDimensions, StyleSheet } from 'react-native';
export default function ThreePanel() {
const { width } = useWindowDimensions();
const isTablet = width >= 768;
if (!isTablet) {
// Phone: single panel
return <View style={{ flex: 1, backgroundColor: '#f5f5f5' }} />;
}
// Tablet: three panels
return (
<View style={styles.row}>
<View style={[styles.panel, { flex: 1 }]} />
<View style={[styles.panel, { flex: 2, backgroundColor: '#e8f0fe' }]} />
<View style={[styles.panel, { flex: 2 }]} />
</View>
);
}
const styles = StyleSheet.create({
row: { flex: 1, flexDirection: 'row' },
panel: { backgroundColor: '#f5f5f5', borderRightWidth: 1, borderRightColor: '#ddd' },
});Indelingsproblemen voorkomen
Let op deze veelvoorkomende problemen met indelingen in React Native: een ontbrekende flex: 1 op een container laat deze tot nulhoogte krimpen; percentages voor de breedte zonder een container met afmetingen worden nul; vaste hoogtes in diep geneste Views veroorzaken afkapping op kleine schermen; minHeight in plaats van flex op scrollcontainers verhindert een correcte grootte. Voeg tijdelijk tinten met backgroundColor toe aan elke View om fouten op te sporen. Zo zie je onmiddellijk welke vakken de juiste afmetingen hebben en welke krimpen. Wanneer een component onzichtbaar is, controleer dan eerst of de bovenliggende container nulhoogte heeft voordat je de eigen stijlen van de component onderzoekt.
// Debugging checklist when a component is invisible:
// 1. Does its parent have flex: 1 or an explicit height?
// 2. Does the component itself have flex or height/width?
// 3. Are percentage dimensions resolving against a zero-width parent?
// 4. Is backgroundColor set (to verify the View is rendered but transparent)?
// Quick visibility check:
<View style={{ flex: 1, backgroundColor: 'rgba(255,0,0,0.1)' }}>
{/* If this shows red tint, the container is sized correctly */}
<YourComponent />
</View>Korte controle
Test je begrip van de concepten voor mobiele ontwikkeling met React Native uit deze les.
Samenvatting van de les
In deze les heb je geleerd: flex: 1 vult de resterende beschikbare ruimte evenredig, useWindowDimensions levert reactieve schermafmetingen voor indelingen die rekening houden met de oriëntatie, en aspectRatio berekent automatisch de hoogte op basis van de breedte om consistente verhoudingen te behouden. Hierna verkennen we hoe je met wrapping in Flexbox een responsief raster met kaarten bouwt.
Leer JavaScript met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “flex, flexGrow en responsieve afmetingen” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad React Native Academy, waaronder “flex, flexGrow en responsieve afmetingen”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus React Native Academy bevat in totaal 4 lessen.
Wat leer ik in “flex, flexGrow en responsieve afmetingen”?
Gebruik de eigenschap flex om beschikbare ruimte proportioneel over aangrenzende Views te verdelen en bouw een layout die zich aanpast aan elke schermbreedte. Je oefent met React Native Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met React Native Academy te beginnen?
Ervaring vooraf is niet nodig. React Native Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “flex, flexGrow en responsieve afmetingen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over React Native Academy?
Ja. Elke les over React Native Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- StyleSheet.create en inline stijlen
- Flexbox-richting, JustifyContent en AlignItems
- flex, flexGrow en responsieve afmetingen
- Een responsief kaartengrid bouwen