[TOC]
概述
文章参考:https://segmentfault.com/a/1190000016149881
文章参考:https://shenbao.github.io/ishehui/html/RN%20%E5%9F%BA%E7%A1%80/React%20Native%20%E5%B8%83%E5%B1%80%E4%B9%8BFlexBox.html
我们在 React Native 中使用 flexbox 规则来指定某个组件的子元素的布局。Flexbox 可以在不同屏幕尺寸上提供一致的布局结构。
一般来说,使用flexDirection、alignItems和 justifyContent三个样式属性就已经能满足大多数布局需求。
React Native 中的 Flexbox 的工作原理和 web 上的 CSS 基本一致,当然也存在少许差异。首先是默认值不同:flexDirection的默认值是column而不是row,而flex也只能指定一个数字值。
Flex Direction
在组件的style中指定flexDirection可以决定布局的主轴。子元素是应该沿着水平轴(row)方向排列,还是沿着竖直轴(column)方向排列呢?默认值是竖直轴(column)方向。
代码的学习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| /** * 设置子元素沿着主轴的排列方式: * 1、flex-start * 2、center 在主轴方向居中显示 * 3、flex-end * 4、space-around * 5、space-between 表示在主轴方向均匀分布 * 6、space-evenly */ const styles = StyleSheet.create({ container: { // 布局方向,决定主轴的方向,默认值是column,即纵向布局 //flexDirection: 'row', // 设置控件排列方向,为按行排列。也就是横向排列 flexDirection: 'column', // 设置控件排列方向,为按列排列。也就是竖向排列 // flex 布局权重 // 1:0:flex=0的项目占用空间仅为内容所需空间,flex=1的项目会占据其余所有空间 flex: 1, // flex-start 表示在靠近主轴的起始段 justifyContent: 'flex-start',
// flex-end 表示在靠近主轴的末尾段 justifyContent: 'flex-end',
// 在主轴方向居中显示 justifyContent: 'center',
// Justify Content 表示在主轴方向等间距对齐,与父容器间距为一半 // child在主轴方向相邻child等间距对齐,首尾child与父容器的间距相等且为相邻child间距的一半 justifyContent: 'space-around',
// Justify Content 表示在主轴方向等间距对齐,与父容器间距对齐 // child在主轴方向相邻child等间距对齐,首尾child与父容器对齐 justifyContent: 'space-between',
// Justify Content 表示在主轴方向均匀分布 // child在主轴方向均匀分布。相邻间距与首尾间距相等 justifyContent: 'space-evenly',
// 件的 style 中指定alignItems可以决定其子元素沿着次轴 //(与主轴垂直的轴,比如若主轴方向为row,则次轴方向为column)的排列方式。 //子元素是应该靠近次轴的起始端还是末尾段分布呢?亦或应该均匀分布? // 对应的这些可选项有: // flex-start // center // flex-end // stretch alignItems: 'flex-start', // 沿次轴方向起始段 alignItems: 'center', // 沿次轴方向居中对齐 alignItems: 'flex-end', // 沿次轴方向末尾段
//注意:要使stretch选项生效的话,子元素在次轴方向上不能有固定的尺寸。 // 以下面的代码为例:只有将子元素样式中的width: 50去掉之后,alignItems: 'stretch'才能生效。 //child为弹性布局时(未设置副轴方向的大小或者为auto),拉伸对齐副轴 alignItems: 'stretch', // 沿次轴方向拉伸对齐次轴
// alignItems: 'baseline', //有文本存在时,child在副轴方向基于第一个文本基线对齐
//backgroundColor: '#C5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', color: '#FE3333', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, });
|
position布局
position:’relative’
相对布局。这个和html的position有很大的不同,他的相对布局不是相对于父容器,而是相对于兄弟节点。
position:’absolute’
绝对布局。这个是相对于父容器进行据对布局。绝对布局是脱离文档流的,不过奇怪的是依旧在文档层次结构里面,这个和html的position也很大不一样。另外还有一个和html不一样的是,html中position:absolute要求父容器的position必须是absolute或者relative,如果第一层父容器position不是absolute或者relative,在html会依次向上递归查询直到找到为止,然后居于找到的父容器绝对定位。
position 示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| /** * Created by GXZ on 16/6/27. */ import React,{Component} from 'react'; import { Text, View, ScrollView } from 'react-native';
export default class PositionExample extends Component { constructor(props) { super(props); this.state = {}; }
render() { return ( <ScrollView> <View style={{flex:1}}> <Text>FlexBox布局</Text> <View style={styles.container}> <View style={styles.box1}/> <View style={[styles.box2]}/> <View style={[styles.box3]}/> </View> <Text>position=relative,top:20</Text> <View style={styles.container}> <View style={styles.box1}/> <View style={[styles.box2,{position:'relative',top:20}]}></View> <View style={styles.box3}/> </View> <Text>position=absolute,top:20</Text> <View style={styles.container}> <View style={styles.box1}/> <View style={[styles.box2,{position:'absolute',top:20}]}></View> <View style={styles.box3}/> </View> </View> </ScrollView> ); } }
const styles = { container: { height: 180, backgroundColor: '#CCCCCC', marginBottom: 10, }, box1: { width: 50, height: 50, backgroundColor: '#FF0000' }, box2: { width: 50, height: 50, backgroundColor: '#00FF00' }, box3: { width: 50, height: 50, backgroundColor: '#0000FF' } };
|