欢迎转载,转载请标明出处:

http://blog.csdn.net/johnny901114/article/details/53241550

本文出自:【余志强的博客】

在React Native中主要使用FlexBox来布局。

安装过React Native的开发环境的就知道,在index.android.js/index.ios.js的文件内容如下:

export default class TemplateDemo extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit index.ios.js
        </Text>
        <Text style={styles.instructions}>
          Press Cmd+R to reload,{'\n'}
          Cmd+D or shake for dev menu
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

上面的:

<View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit index.ios.js
        </Text>
        <Text style={styles.instructions}>
          Press Cmd+R to reload,{'\n'}
          Cmd+D or shake for dev menu
</View>

就像Android里面的布局一样,其中style是对view如何显示进行定义。 下面我们来看看flexbox的一些属性。

一、容器属性

1、flexDirection :

容器内的元素的排列方式[主轴方向],可取值row | row-reverse | column | column-reverse

column: 从上至下,纵向排列[默认]. 效果如下图所示:

column-reverse: 从下至上,纵向排列. 效果如下图所示:

row: 从左至右,水平排列, 效果如下图所示:

row-reverse: 从右至左,水平排列,效果如下图所示:

2、justifyContent 属性

justifyContent 属性 指定容器内的元素在主轴线的对齐方式,可取值flex-start | flex-end | center | space-between | space-around

flex-start(默认值):伸缩项目向一行的起始位置靠齐 ,效果如下图所示:

flex-end:元素向一行的结束位置靠齐 ,效果如下图所示:

center:元素向一行的中间位置靠齐 ,效果如下图所示:

space-between:两端对齐,元素之间的间隔都相等,效果如下图所示:

space-around:元素会平均地分布在行里,两端保留一半(中间间隔的一半)的空间,效果如下图所示:

3、alignItems属性

alignItems: 侧轴(垂直于主轴)的“对齐方式”。

flex-start:交叉轴的起点对齐。 效果如下所示:

flex-end:交叉轴的终点对齐 。 效果如下所示:

center:交叉轴的中点对齐。 效果如下所示:

stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。我们先把第一个View的height属性注释掉,然后把alignItems设置为stretch,效果如下:

4、flexWrap属性

flexWrap: 默认情况下,项目都排在一条线(又称”轴线”)上。flex-wrap属性定义,如果一条轴线排不下,如何换行。

nowrap(默认值):不换行。 效果如下:

wrap: 换行,第一行在上方。 效果如下:

wrap-reverse:换行,第一行在下方。【react Native不支持此属性值】

二、元素属性

1、flex属性

flex属性是“flex-grow”、“flex-shrink”和“flex-basis”三个属性的缩写,

其中第二个和第三个参数(flex-shrink、flex-basis)是可选参数。

默认值为“0 1 auto”。

宽度 = 弹性宽度 ( flexGrow / sum( flexGrow ) )

如果该元素设置了宽高,那么他的宽度 = 原来的宽度 + 一行中空白的宽度 (flexGrow / sum(flexGrow))

如下如的三个控件,它们的flex属性分别设置为1,2,3。

据此第一个控件占屏幕宽度的1/(1+2+3), 第二个控件占2(1+2+3),第三个占3/(1+2+3). 如下所示:

2、alignSelf属性

alignSelf取值范围:“auto | flex-start | flex-end | center | baseline | stretch”

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。

默认值为auto,表示继承父元素的alignItems属性,如果没有父元素,则等同于stretch

注意:react Native不支持此属性值: baseline

现在我们把第二个View设置为alignSelf:’flex-start’,效果如下:

设置为alignSelf:’flex-end’ 效果如下:

设置为alignSelf:’center’ 效果如下:

设置为alignSelf:’stretch’ 且不设置高度,效果如下:

三、几个简单的示例

1,绝对定位和相对定位:

与css定位不同,在React Native中定位不需要再父组件中设置position属性。

通常情况下设置position:’relative’,和不设置position属性,定位的效果是一样的

但是如果父组件设置了内边距,position会做出相应的定位改变,而absolute则不会。

如果View设置了position: ‘absolute’,那么该View或父View设置padding对该View都无效:

2,获取宽高分辨率

var width = require(‘Dimensions’).get(‘window’).width;

var height = require(‘Dimensions’).get(‘window’).height;

var scale = require(‘Dimensions’).get(‘window’).scale;

还有一种更简洁的方式:

var {width,height,scale} = require(‘Dimensions’).get(‘window’);

3,默认宽度问题

View不设置宽度默认占一行

把上面显示屏幕分辨率的View设置一个背景,就会发现View不设置宽度默认是占一行的:

四、本博客所有代码展示:


import React, {Component} from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View
} from 'react-native';
//330 375  =  45   15+30
var {width, height,scale} = require('Dimensions').get('window');
export default class FlexBoxDemo extends Component {
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.text_style1}>{width}</Text>
                <Text style={styles.text_style2}/>
                <Text style={styles.text_style3}/>
                <Text style={styles.text_style4}/>
                <Text style={styles.text_style5}/>
                <Text style={styles.text_style6}/>
            </View>
        );
    }
}

class PositionDemo extends Component {
    render() {
        return (
            <View style={{backgroundColor: '#F5FCFF', height: 200, paddingTop: 30,paddingBottom:100,flexDirection:'column'}}>
                <Text style={styles.positionStyle}/>

                <Text style={{backgroundColor:'gray'}}>width x height={width} x {height}; scale:{scale}</Text>
                {/*默认占一行
                <Text style={{backgroundColor:'blue'}}/>*/}
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        //flex: 1,
        backgroundColor: '#F5FCFF',
        flexDirection: 'row',
        marginTop: 30,
        height: 200,
        justifyContent: 'flex-start',
        alignItems: 'stretch',
        flexWrap: 'wrap',
    },
    text_style1: {
        width: 40,
        height: 50,
        backgroundColor: '#9900ff',
        //flex: 1,

        //textAlign: 'center',//文字仅仅水平居中
    },

    text_style2: {
        width: 40,
        height: 60,
        backgroundColor: '#99ee00',
        //flex: 2,
        // alignSelf: 'stretch'
    },

    text_style3: {
        width: 80,
        height: 30,
        backgroundColor: '#ff9900',
        //flex: 3,

    },

    text_style4: {
        width: 50,
        height: 70,
        backgroundColor: '#99ff00',
        //flex: 3,
    },

    text_style5: {
        width: 90,
        height: 70,
        backgroundColor: '#99ee00',
        //flex: 3,
    },
    text_style6: {
        width: 80,
        height: 70,
        backgroundColor: '#ff9900',
    },

    positionStyle: {
        //flex:1,
        height: 50,
        width: 100,
        backgroundColor: 'black',
        position: 'absolute',//absolute
        bottom: 20,
        left: 120,
        //paddingBottom: 40, //如果position:'absolute',则paddingBottom:40无效
        //通常情况下设置position和absolute,定位的效果是一样的,
        //但是如果父组件设置了内边距,position会做出相应的定位改变,而absolute则不会。
    }

});

AppRegistry.registerComponent('FlexBoxDemo', () => PositionDemo);

React Native(一) FlexBox布局的更多相关文章

  1. React Native之FlexBox布局

    参考原文链接:https://www.cnblogs.com/wujy/p/5841685.html 弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局” ...

  2. React Native,flexbox布局

    Flexbox布局 flex:使组件在可利用的空间内动态地扩张或收缩.flex:1会使组件撑满空间.当有多个组件都指定了flex的值,那么谁的flex值大谁占得空间就大,占得大小的比例就是flex值的 ...

  3. React Native之FlexBox介绍和使用

    # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...

  4. React Native知识1-FlexBox 布局内容

    一:理论知识点 1:什么是FlexBox布局? 弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其 ...

  5. react native 之页面布局

     第一章 flexbox 布局 1.flexDirection:'row', 水平 flexDirection:'column',垂直 需要在父元素上设置这种属性才能实现flex. flex:1 会撑 ...

  6. 从零学React Native之06flexbox布局

    前面我们接触了好多React Native代码, 并没有介绍RN中的组件具体是如何布局的,这一篇文章,重点介绍下flexbox布局. 什么是flexbox布局 React中引入了flexbox概念,f ...

  7. React Native 系列(四) -- 布局

    前言 本系列是基于React Native版本号0.44.3写的.RN支持CSS中的布局属性,因此可以使用CSS布局属性,这里就不详细地讲解了,这篇文章的重点主要是讲述一下RN中的Flex布局. CS ...

  8. React Native填坑之旅--布局篇

    代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...

  9. React Native布局

    一款好的APP离不了一个漂亮的布局,本文章将向大家分享React Native中的布局方式FlexBox. 在React Native中布局采用的是FleBox(弹性框)进行布局. FlexBox提供 ...

  10. React-Native(四):React Native之View学习

    React Native实现以下布局效果:携html5(http://m.ctrip.com/html5/) 基于HelloWord修改项目代码: /** * Sample React Native ...

随机推荐

  1. [Nginx]-外部多端口映射Https443端口配置

    https服务器配置完成后,域名访问默认匹配至443端口,如果想同时通过https域名网址来请求多个对外服务,就需要在Nginx配置里来对请求进行规则判断,并匹配至相应的内部端口,这也是Nginx反向 ...

  2. (hdu-4280)Island Transport~测试网络流模板速度~要加挂才能过啊

    Problem Description In the vast waters far far away, there are many islands. People are living on th ...

  3. [LeetCode] Convert BST to Greater Tree 将二叉搜索树BST转为较大树

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  4. win10+ ubuntu12.04双系统安装教程与遇到的问题

    1. 准备ISO. 参考:网站http://mirrors.ustc.edu.cn/ubuntu-releases/precise/ 下载 ubuntu-12.04.5-desktop-amd64.i ...

  5. 分布式版本管理工具 git常用命令

    Git global setup git config --global user.name "joey" git config --global user.email " ...

  6. [USACO 06NOV]Corn Fields

    Description 题库链接 给你一个 \(0,1\) 矩阵,只准你在 \(1\) 上放物品:并且要满足物品不能相邻.允许空放,问方案数,取模. \(1\leq n,m\leq 12\) Solu ...

  7. 计蒜客NOIP模拟赛(2) D2T2紫色百合

    [问题描述] “牵着你的手的是她,路边开满了紫色的百合花……” 你从梦中醒来,却依然忘不了梦中的她百合花,每朵百合花都有一个权值,在二进制下写成一行‘1’,第i朵紫色百合的权值在二进制下写成i个‘1’ ...

  8. [POI2007]POW-The Flood

    题目描述 给定一张地势图,所有的点都被水淹没,现在有一些关键点,要求放最少的水泵使所有关键点的水都被抽干 输入输出格式 输入格式: In the first line of the standard ...

  9. NOIP2014-6-14模拟赛

    Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤1 ...

  10. Bubble Cup X - Finals [Online Mirror]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 组了个菜鸡队打cf上的ACM比赛 比较快做完了8题但是菜的抠脚罚时巨多,所以最后被顶到了19名(居然没出首页) 自己的号自从上次疯狂掉分就没动 ...