RN的像素及布局

转自:http://www.cocoachina.com/ios/20150420/11608.html

宽度单位和像素密度

react的宽度不支持百分比,设置宽度时不需要带单位 {width: 10}, 那么10代表的具体宽度是多少呢?

不知道是官网文档不全还是我眼瞎,反正是没找到,那做一个实验自己找吧:

默认用的是iPhone6的模拟器结果是:

我们知道iPhone系列的尺寸如下图:

可以看到iphone 6的宽度为 375pt,对应了上边的375,由此可见react的单位为pt。 那如何获取实际的像素尺寸呢? 这对图片的高清化很重要,如果我的图片大小为100*100 px. 设置宽度为100 * 100. 那在iphone上的尺寸就是模糊的。 这个时候需要的图像大小应该是 100 * pixelRatio的大小 。

react 提供了PixelRatio 的获取方式

flex的布局

默认宽度

我们知道一个div如果不设置宽度,默认的会占用100%的宽度, 为了验证100%这个问题, 做三个实验

  1. 根节点上方一个View, 不设置宽度
  2. 固定宽度的元素上设置一个View, 不设置宽度
  3. flex的元素上放一个View宽度, 不设置宽度

结果可以看到flex的元素如果不设置宽度, 都会百分之百的占满父容器。

水平垂直居中

css 里边经常会做的事情是去讲一个文本或者图片水平垂直居中,如果使用过css 的flexbox当然知道使用alignItems 和 justifyContent . 那用react-native也来做一下实验

网格布局

网格布局实验, 网格布局能够满足绝大多数的日常开发需求,所以只要满足网格布局的spec,那么就可以证明react的flex布局能够满足正常开发需求

等分的网格

左边固定, 右边固定,中间flex的布局

嵌套的网格
通常网格不是一层的,布局容器都是一层套一层的, 所以必须验证在real world下面的网格布局

好在没被我玩儿坏,可以看到上图的嵌套关系也是足够的复杂的,(我还加了一个ScrollView,然后再嵌套整个结构)嵌套多层的布局是没有问题的。

图片布局

首先我们得知道图片有一个stretchMode. 通过Image.resizeMode访问

找出有哪些mode

尝试使用这些mode

100px 高度, 可以看到图片适应100高度和全屏宽度,背景居中适应未拉伸但是被截断也就是cover。

contain 模式容器完全容纳图片,图片自适应宽高

cover模式同100px高度模式

stretch模式图片被拉伸适应屏幕

随便试验了一下, 发现高度设置到父容器,图片flex的时候也会等同于cover模式

绝对定位和相对定位

和css的标准不同的是, 元素容器不用设置position:‘absolute|relative‘ .

相对定位的可以看到很容易的配合margin做到了。 (我还担心不能配合margin,所以测试了一下:-:)

padding和margin

我们知道在css中区分inline元素和block元素,既然react-native实现了一个超级小的css subset。那我们就来实验一下padding和margin在inline和非inline元素上的padding和margin的使用情况。

padding

在View上设置padding很顺利,没有任何问题, 但是如果在inline元素上设置padding, 发现会出现上面的错误, paddingTop和paddingBottom都被挤成marginBottom了。 按理说,不应该对Text做padding处理, 但是确实有这样的问题存在,所以可以将这个问题mark一下。

margin

我们知道,对于inline元素,设置margin-left和margin-right有效,top和bottom按理是不会生效的, 但是上图的结果可以看到,实际是生效了的。所以现在给我的感觉是Text元素更应该理解为一个不能设置padding的block。

算了不要猜了, 我们看看官方文档怎么说Text

也就是如果Text元素在Text里边,可以考虑为inline, 如果单独在View里边,那就是Block。

下面会专门研究一下文本相关的布局

文本元素

首先我们得考虑对于Text元素我们希望有哪些功能或者想验证哪些功能:

  1. 文字是否能自动换行?
  2. overflow ellipse?
  3. 是否能对部分文字设置样式 ,类似span等标签

先看看文字有哪些支持的style属性

实验1, 2, 3

从结果来看1,2,3得到验证。 但是不知道各位有没有发现问题, 为什么底部空出了这么多空间, 没有设置高度啊。 我去除numberOfLines={5} 这行代码,效果如下:

所以实际上, 那段空间是文本撑开的, 但是文本被numberOfLines={5} 截取了,但是剩余的空间还在。 我猜这应该是个bug。

其实官方文档里边把numberOfLines={5}这句放到的是长文本的Text元素上的,也就是子Text上的。 实际结果是不生效。 这应该又是一个bug。

Text元素的子Text元素的具体实现是怎样的, 感觉这货会有很多bug, 看官文

Behind the scenes, this is going to be converted to a flat

NSAttributedString that contains the following information

好吧, 那对于numberOfLines={5} 放在子Text元素上的那种bug倒是可以解释了。

Text的样式继承

实际上React-native里边是没有样式继承这种说法的, 但是对于Text元素里边的Text元素,上面的例子可以看出存在继承。 那既然有继承,问题就来了!

到底是继承的最外层的Text的值呢,还是继承父亲Text的值呢?

结果可见是直接继承父亲Text的。

总结

  1. react 宽度基于pt为单位, 可以通过Dimensions 来获取宽高,PixelRatio 获取密度,如果想使用百分比,可以通过获取屏幕宽度手动计算。
  2. 基于flex的布局
    1. view默认宽度为100%
    2. 水平居中用alignItems, 垂直居中用justifyContent
    3. 基于flex能够实现现有的网格系统需求,且网格能够各种嵌套无bug
  3. 图片布局
    1. 通过Image.resizeMode来适配图片布局,包括contain, cover, stretch
    2. 默认不设置模式等于cover模式
    3. contain模式自适应宽高,给出高度值即可
    4. cover铺满容器,但是会做截取
    5. stretch铺满容器,拉伸
  4. 定位
    1. 定位相对于父元素,父元素不用设置position也行
    2. padding 设置在Text元素上的时候会存在bug。所有padding变成了marginBottom
  5. 文本元素
    1. 文字必须放在Text元素里边
    2. Text元素可以相互嵌套,且存在样式继承关系
    3. numberOfLines 需要放在最外层的Text元素上,且虽然截取了文字但是还是会占用空间
时间: 2024-10-07 18:55:29

RN的像素及布局的相关文章

React Native基础&入门教程:初步使用Flexbox布局

在上篇中,笔者分享了部分安装并调试React Native应用过程里的一点经验,如果还没有看过的同学请点击<React Native基础&入门教程:调试React Native应用的一小步>. 在本篇里,让我们一起来了解一下,什么是Flexbox布局,以及如何使用. 一.长度的单位 在开始任何布局之前,让我们来首先需要知道,在写React Native组件样式时,长度的不带单位的,它表示“与设备像素密度无关的逻辑像素点”. 这个怎么理解呢? 我们知道,屏幕上一个发光的最小点,对应着一个

React-Native 之控件布局

Nodejs 一度将前端JS 推到了服务器端,而15年FB的React-Native RN再一次将JS 推到了移动端的开发浪潮中.RN的优势这里不再重复,它是我们这些习惯了服务端.web端开发,而又不想去花太多时间掌握Android.IOS移动端原生开发的人员的福音,可以说是我们通向全栈工程师的快速捷径!于是乎最近开始学习React-Native,并将学习中的一些点滴记录下来. 网上关于RN的资料不少了,首先是环境配置,不一定非得Mac 下.我是基于Windows开发的,Windows下环境如何

Bootstrap 3 How-To #3 布局

对于 Web 开发来说,一个永远的话题是如何创建一个跨浏览器兼容的布局.许多年来,各种框架使用各种技术来解决这个问题.Bootstrap 使用了一个不同的方式来解决这个问题.基于 960 像素的布局 http://960.gs,bootstrap 提供了更为简单的语法,它还支持响应式布局,布局可以根据设备的不同尺寸进行调整,从桌面计算机到平板和手持设备. 以前版本的 bootstrap 在没有使用响应式布局的时候,使用了 940px 布局使用 span* 和 offset* 布局.在使用响应式布

html5+css3+jquery完成响应式布局

响应式布局,流体布局,自适应布局,静态布局等等,这是移动设备的飞速发展,前端人员不得不跟上潮流的一个方向.实际上各种设备尺寸,分辨率大都不同,真的适应各种设备依旧是不现实的,首先是浏览器差异化,让我们去hack,现在是终端问题,让我展现出不同的设备不同的样式,折腾来折腾去,终于我们走进了热火朝天的响应式布局,自适应只能算是响应式布局的一个子集吧,对于流体个栅格后面会再次提到,有兴趣可以关注. 首先讲讲实现原理吧,css3的媒体查询功能的确帮了我们很大一个忙,@media query,它的出现也带

设备像素比devicePixelRatio简单介绍

本文所说devicePixelRatio其实指的是window.devicePixelRatio, 被所有WebKit浏览器以及Opera所支持,随着显示器的发展,这个属性也慢慢登上了前端技术的舞台. 本文内容大部分属于翻译性质内容,因此,会不那么通俗易懂.不过,你是做手机开发的,或是有意向的,本文的内容如果细细读来,还是有些收获的. 一.定义 定义如下: window.devicePixelRatio是设备上物理像素和设备独立像素(device-independent pixels (dips

#原创# 前端布局基础及移动端运用的思考

目录: 历史及发展变化 Html5的新结构元素 基于Css的布局之道 考虑屏幕分辨率 关于布局的几个名词 基本布局样式属性 其他布局相关 CSS框架 人类阅读舒适度的考虑 Css具体属性创建的目的与后期使用时和意义偏离的思考 1)历史及发展变化1 1991年第一个网页的诞生只有简单的文字及链接,涉及应用的元素较少且简单,后来设计师们发现table能更好的展现网页内容于是表格布局时代出现. 随着,w3c规范的提出,出现了块级元素和内联元素的定义,2000年后进入div布局时代:截至目前,大多数页面

Flipboard web移动端-打造每秒60帧的流畅体验

在智能手机和平板电脑的黎明时期, Flipboard 推出“移动先行”的体验,使我们可以重新思考页面中内容布局的原则,以及与触摸屏相关的,如何获得更好的用户体验的因素. 为了建立完整的体验,我们将 Flipboard 带到 web 端.我们在 Flipboard 所做的,在每台用户使用的设备上都拥有独立的价值:整理那些来自你最关心的主题,来源以及人的最好的故事.因此把我们的服务带到web端,也是一个合乎逻辑的延伸. 当我们开始这个项目后,认识到我们需要把源自移动体验的思考搬到 web 端,试图提

Android屏幕适配解决方案

1.概述 Android碎片化问题是每个开发者心中的噩梦,本文就Android适配问题进行了全面的总结. 首先看下谷歌官方2016 年 8 月 1 日发布的报告: Android 平台版本的相对数量设备的相关数据: 可以看出4.1版本及以上占有量达到96%,所以适配优先考虑4.1以上的版本适配问题. 特定屏幕配置的设备的数据,屏幕配置由屏幕尺寸和密度定义: 从统计数据可以看出,hdpi.xhdpi和xxhdpi的占有率达到95%. 详细统计数据看这里: https://developer.and

【转】Android屏幕适配全攻略(最权威的官方适配指导)

Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺寸 使用wrap_contentmatch_parentweight 使用相对布局