React Native 绝对定位

摘要:在本教程中,您将学习如何使用相对和绝对位置在 flexbox 布局中放置组件。

相对定位

React Native 使用 flexbox 布局 来排列屏幕上的组件。默认情况下,每个组件的 position 属性为 relative

{ 
   position: 'relative'
}Code language: JavaScript (javascript)

{ position: 'relative ' } 表示组件相对于其在 flexbox 布局中的原始位置进行定位。

React Native 允许您使用 toprightbottomleft 属性来相对于其原始位置定位组件。

例如,以下显示了一个大的绿色框和一个小的黄色框。

React Native Position Relative - Setting Left

如果您单击“向右移动 100”按钮,它会将小的黄色框相对于其在 flexbox 布局中的原始位置向右移动 100 个单位。

React Native Position Relative - Left 100
import { View, Text, StyleSheet, SafeAreaView, Button } from 'react-native';
import { useState } from 'react';

const PositionRelative = () => {
    const [position, setPosition] = useState({});

    return (
        <SafeAreaView style={styles.container}>
            <View style={styles.app}>
                <View style={styles.actions}>
                    <Button title="Move to the right 100" onPress={() => { setPosition({ left: 100 }); }} />
                    <Button title="Reset" onPress={() => { setPosition({}); }} />
                </View>

                <View style={styles.layout}>
                    <Text style={styles.bigBox}>React Native</Text>
                    <Text style={[styles.box, position]}>React</Text>
                </View>

            </View>
        </SafeAreaView>
    );
};

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
    app: {
        flex: 1,
        padding: 20,
        alignItems: 'flex-start',
    },

    layout: {
        borderColor: '#EE5013',
        borderWidth: 1,
    },
    bigBox: {
        marginBottom: 10,
        position: 'relative',
        padding: 10,
        backgroundColor: '#78B500',
        height: 100,

    },
    box: {
        marginBottom: 10,
        position: 'relative',
        padding: 10,
        backgroundColor: '#FFD966'
    },
    actions: {
        alignSelf: 'stretch',
        flexDirection: 'row',
        justifyContent: 'space-between',
        marginBottom: 20,
    }
});

export default PositionRelative;
Code language: JavaScript (javascript)

绝对定位

除了 relative 位置之外,您还可以将组件的 position 设置为 absolute

{
   position: 'absolute'
}Code language: JavaScript (javascript)

在这种情况下,React Native 会将组件从 flexbox 流布局中移除,并将其放置到最接近的包含组件中。

在下图中,我们还有一个包含两个框的 View:一个大的绿色框和一个小的黄色框。

如果您单击“更改位置为绝对”按钮,它将更改小的黄色框的 display 属性为 absolute,并将组件相对于 View 重新定位。

请注意,绝对定位仅更改小的黄色框的位置。它不会更改 flexbox 的其他属性,如 alignItems: 'flex-start'

将位置设置为绝对后,您还可以使用包含组件中的 toprightleftbottom 属性来控制组件的位置。这些属性接受正值和负值。

例如,以下显示了如何使用绝对定位来创建带有项目数量的购物车图标。

React Native Position Absolute - Cart Icon
import { StyleSheet, Text, View, SafeAreaView } from 'react-native'
import Icon from '@expo/vector-icons/MaterialCommunityIcons';

const Cart = () => {
    return (
        <SafeAreaView style={styles.container}>
            <View style={styles.app}>
                <View style={styles.cart}>
                    <Icon name="cart-outline" size={32} color="#4B4942" />
                    <Text style={styles.cartText}>5</Text>
                </View>
            </View>
        </SafeAreaView>
    )
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
    },
    app: {
        flex: 1,
        padding: 20,
    },
    cartText: {
        backgroundColor: '#EE5013',
        width: 20,
        height: 20,
        borderRadius: 10,
        textAlign: 'center',
        color: '#fff',
        fontSize: 14,
        position: 'absolute',
        left: 15,
        top: -10
    }
});

export default Cart;Code language: JavaScript (javascript)

总结

  • 使用 position relative 来相对于其原始位置移动组件。
  • 使用 position absolute 来将组件从其 flexbox 布局流中移除,并将其重新定位到最接近的包含组件中。
  • 使用 toprightbottomleft 属性来定位组件。
本教程是否有帮助?