博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react-native项目之样式总结
阅读量:5033 次
发布时间:2019-06-12

本文共 4377 字,大约阅读时间需要 14 分钟。

  react native(以下简称rn)里面涉及到的样式规则都是在js文件中写的,一改pc端的在样式文件中定义规则,所以pc端开发习惯的童鞋转向开发rn项目时,可能会对样式感到有些奇怪;其实react在地面实现时会转化对应的样式。

  rn中的css样式是css中的一个子集,对css的一些规程进行了阉割,此外还扩展了一些css中没有的规则,例如图片样式中的resizeMode规则属性就是css没有的。具体的rn样式可以参考这篇文章,里面列出了rn中涉及到的样式规则;下面就将个人参与rn项目遇到的css进行个总结,若有错误的地方,请大家多多指教。

 

1、rn的布局

  rn的布局是完全是用flex来实现。使用flex来进行布局是多么让人爽心悦目的一件事,按照设计图来实现一个页面是很容易的事情,写过pc端布局转向写rn的布局的童鞋,这种感觉更有强烈(个人YY的哈);用flex解决pc端的垂直居中的问题真是小菜一碟啊;

flex的用法就不多说了,具体可参考阮一峰老师的这篇文章,里面对flex的讲解非常详细;

需要注意的是:rn中的flex的相关属性不是完全依照w3c规范提供的各种值,对其中的某些属性值进行了阉割,下面就借用中内容说明一下:

 

补充一点:

  rn块元素默认的flex布局为column布局;

  一定要注意justifyContent和alignItems这个两个属性的区别,许多开发者很容易会产生误导;

  justifyContent是相对于主轴的对齐方式,而alignItems是相对于交叉轴的对齐方式。

  那么,这个主轴和交叉轴如何确定呢?初学者会认为水平方向就是主轴,垂直方向就是交叉轴;错!主轴和交叉轴是相对于flexDireaction的值而言的,主轴和交叉轴是相对于flexDireaction的值而言的,主轴和交叉轴是相对于flexDireaction的值而言的。重要的事情说三遍。具体而言:

flexDireaction 主轴 交叉轴
row 水平方向 垂直方向
column 垂直方向 水平方向

来看一段代码:

1 
2
水平居中
3
4
5
6

上面代码中,最外层的View容器默认为column布局,即flexDireaction值为column,那么主轴就是垂直方向,所以alignItems就是设置交叉轴水平方向的对齐方式,所以上面的代码运行结果是水平对齐:

2、rn样式与css样式的异同

  首先样式的命名规则全部采用驼峰写法,不能使用其他写法,这样的要求估计也是按照js的写法规则来走的;其次就是上面说的rn样式是css样式的一个子集;下面列出了一些其他的差异:

  • View类似于DIV,会默认占用容器的100%的宽度
  • rn元素的绝对定位和相对定位不需要父元素设置position,且没有zIndex配置
  • 不能以偏概全说rn的inline元素不能设置marginTop、marginBottom;
    需要注意的是:包裹在View元素中的Text表现为block,可以设置margin和padding的各种属性;包裹在Text元素中的Text表现为inline元素,不能设置其marginTop和marginBottom, padding等用于block元素的属性
  • 样式的继承只存在于Text元素内的Text元素,换句话说是Text元素里面的Text元素存在继承;继承的规则是子Text元素继承祖先Text和父Text元素的样式整合后的样式。
    文本样式继承
    父:我是white还是red{'\n'}
    子:那我是神马颜色
    {'\n'}我应该是white

    上面运行结果如下:

    可以看出,子Text元素继承了父Text的color样式和祖先Text元素的样式fontSize、fontWeight

3、一个rn样式实现的例子

  例如在很多有电商公司,提供了供客户查询购物的物流追踪的一个进度信息,例如下图,这样的一个样式如何用rn的样式来完成的呢,下面就简单介绍了个人的思路,可能有其他更好的实现,有的话大家可以积极的分享。

实现这样的样式,需要position和border来配合实现,主要是左边链接圆点的一条竖线,具体思路:

  • 利用每行条目边界来实现,从而形成一条连续的竖线
  • 每行条目的圆点采用定位,定位到竖线上,注意这个地方需要将定位的元素写在非定位元素的后面,这样才能使圆点覆盖竖线,否则竖线会覆盖在圆点上,可以清晰看到竖线,达不到产品的要求,如下图
  • 第一个位置左边界需要修剪掉圆点上面的多余边界,方法是:采用和容器背景颜色一致的颜色来覆盖掉圆点之上的边界

具体代码可以参考如下:

1 render(){ 2     let invoice = this.props.invoiceInfo; 3     let items = []; 4     invoice.expressInfoList.map((el,index)=>{ 5         let colorValue = index === 0 ? '#0b74c4' : '#888'; 6         let backgroundColor = index === 0 ? '#0b74c4' : '#e0e0e0'; 7         let className = index === 0 ? "expressRightFirst" : "expressRight"; 8         let fixEl = index === 0? 
:
; 9 items.push(10
11
12
13
{el.context}
14
{el.ftime}
15
16
17 {fixEl}18
19
20 );21 });22 return (23
{items}
24 )25 }26 27 const styles = {28 expressItem:{29 flex: 1,30 flexDirection: 'row',31 justifyContent: 'flex-start',32 alignItems: 'flex-start',33 paddingLeft: 10,34 width: Dimensions.get('window').width35 },36 expressLeft:{37 width: 10,38 height: 10,39 borderRadius: 5,40 backgroundColor: '#e0e0e0',41 position: 'relative',42 left: 15 - width,43 top: 1144 },45 expressRight: {46 flex:1,47 paddingLeft: 25,48 borderLeftWidth: 1,49 borderLeftColor: '#e0e0e0',50 flexDirection: 'column'51 },52 expressRightFirst: {53 flex:1,54 paddingLeft: 25,55 borderLeftWidth: 1,56 borderLeftColor: '#e0e0e0',57 flexDirection: 'column'58 },59 process: {60 paddingVertical: 10,61 flexDirection: 'column',62 borderBottomColor: '#e0e0e0',63 borderBottomWidth: 1,64 paddingRight: 2065 },66 fix:{67 height:15,68 width:30,69 position: 'relative',70 left: 25-width,71 backgroundColor: '#fff',72 } 73 }
View Code

 

转载于:https://www.cnblogs.com/wonyun/p/5481134.html

你可能感兴趣的文章
模式匹配-BF算法
查看>>
Cocos2d-x 3.x版2048游戏开发
查看>>
Uva 11174 Stand in a Line
查看>>
Eclipse Photon 小技巧(tips)
查看>>
Java NIO 必知必会(Example)
查看>>
js 三元表达式 复杂写法
查看>>
nova创建虚拟机源码分析系列之三 PasteDeploy
查看>>
使用Hudson搭建自动构建服务器
查看>>
linux su 认证失败解决方案<转>
查看>>
mybooklist 日志5.12
查看>>
python 正则表达式
查看>>
将iso文件刻录为CD或DVD【转】
查看>>
文件链接_rpm_yum
查看>>
【转载】OLTP 与 OLAP
查看>>
DEVELOPER: ODP.NET Instant ODP.NET Deployment
查看>>
移动端click延迟和tap事件
查看>>
BZOJ3456: 城市规划
查看>>
小程序采坑之setData
查看>>
完美去除快捷方式小箭头软件 V1.0
查看>>
弹出框插件layer使用
查看>>