Я новичок в React Native, поэтому прошу прощения, если это простой вопрос. Я пытаюсь создать гибкий макет, содержащий два дочерних гибких контейнера с собственным содержимым, где, если содержимое одного дочернего элемента переполняется, другой дочерний элемент сжимается.
Я добился того, чего хотел, используя обычный html/css:
Никакого переполнения контентом
но когда я воспроизвел те же элементы/стиль в React Native, другой дочерний элемент не сжимается, как я хочу:
Не сжиматься при переполнении контента
Может ли кто-нибудь объяснить, почему эти два разных? И как мне правильно реализовать это в React Native?
Вот как я реализовал это, используя простой HTML/CSS:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.container{
width: 300px;
height: 600px;
display: flex;
align-items: center;
flex-direction: column;
border: 2px solid black;
padding: 30px;
}
.flexChild{
padding: 15px;
flex: 1;
display: flex;
justify-content: center;
align-items: center;
border: 1px solid black;
}
.child1Content {
border: 3px solid purple;
height: 100px; /* CHANGE TO 400px FOR OVERFLOW */
width: 300px;
}
.child2Content {
border: 3px solid purple;
height: 100px;
width: 300px;
}
</style>
</head>
<body>
<div class = "container">
<div class = "flexChild">
<div class = "child1Content"></div>
</div>
<div class = "flexChild">
<div class = "child2Content"></div>
</div>
</div>
</body>
</html>
А вот моя версия React Native:
import { SafeAreaView, StyleSheet, View } from 'react-native';
const App = () => {
return (
<SafeAreaView style = {styles.container}>
<View style = {styles.flexChild}>
<View style = {styles.child1Content}>
</View>
</View>
<View style = {styles.flexChild}>
<View style = {styles.child2Content}>
</View>
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
alignSelf: 'center',
marginTop: 100,
width: 300,
height: 600,
display: 'flex',
alignItems: 'center',
flexDirection: 'column',
paddingTop: 30,
borderWidth: 2,
borderStyle: 'solid',
borderColor: 'black',
},
flexChild: {
padding: 15,
flex: 1,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
borderWidth: 1,
borderStyle: 'solid',
borderColor: 'black',
},
child1Content:{
borderWidth: 3,
borderStyle: 'solid',
borderColor: 'purple',
height: 100, // CHANGE TO 400px FOR OVERFLOW
width: 300,
},
child2Content:{
borderWidth: 3,
borderStyle: 'solid',
borderColor:
width: 300,
}
});
export default App;
🤔 А знаете ли вы, что...
HTML поддерживает атрибуты для определения языка и кодировки веб-страницы.
Стилизация в React Native во многом отличается от веб-стилизации (а иногда и между платформами).
Одна из них заключается в том, что заданный размер (ваш рост) имеет приоритет flex: 1
. Кроме того, установка представлений двух братьев и сестер на flex: 1
приводит к тому, что братья и сестры имеют одинаковый размер. Вместо этого при использовании flexGrow: 1
при определении размера представления учитываются размеры внутреннего содержимого.
Другие изменения:
display: 'flex'
и flexDirection: 'column'
являются значениями по умолчанию в React NativealignSelf: 'stretch'
для расширения просмотра по горизонталиЯ положила его в закуску, чтобы с ним было легче экспериментировать.
import { SafeAreaView, StyleSheet, View } from 'react-native';
const App = () => {
return (
<SafeAreaView style = {styles.container}>
<View style = {[styles.flexChild, styles.flexChild1]}>
<View style = {styles.child1Content}/>
</View>
<View style = {styles.flexChild}>
<View style = {styles.child2Content} />
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: 'black',
padding: 15,
},
flexChild: {
flexGrow: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'yellow',
padding: 15,
},
flexChild1: {
backgroundColor: 'orange',
},
child1Content: {
alignSelf: 'stretch',
backgroundColor: 'purple',
height: 400, // CHANGE TO 400px FOR OVERFLOW
},
child2Content: {
alignSelf: 'stretch',
height: 100,
backgroundColor: 'indigo',
},
});
export default App;