RN 样式特点:Flex 布局默认、没有像素单位、样式不能级联

React Native(RN)的样式系统与 Web CSS 有不少区别,你提到的三点都是 RN 的核心特点:

1. Flex 布局默认(Default Flexbox)

RN 默认采用 Flexbox 进行布局,不需要写 display: flex。

css 复制代码
<View style={{
  flex: 1,
  flexDirection: 'column',
}}>
  <View style={{ flex: 1 }} />
  <View style={{ flex: 2 }} />
</View>

特点:

  • 默认就是 display: flex

  • 默认主轴方向是 column(纵向) ,而 Web CSS 默认是 row

  • 常用属性:

    • flex
    • flexDirection
    • justifyContent
    • alignItems
    • alignSelf
    • flexWrap

例如:

css 复制代码
<View style={{
  flexDirection: 'row',
  justifyContent: 'space-between',
  alignItems: 'center',
}}>

2. 没有像素单位(No px)

RN 中所有尺寸都不写单位。

例如:

php 复制代码
const styles = StyleSheet.create({
  box: {
    width: 100,
    height: 50,
    marginTop: 20,
    fontSize: 16,
  },
});

而不是:

css 复制代码
width: 100px;

原因:

RN 使用的是逻辑像素(Density-independent Pixels,dp) ,框架会根据不同设备的屏幕密度自动进行适配,因此无需写 px。

例如:

less 复制代码
padding: 10
margin: 15
borderRadius: 8

都是合法写法。


3. 样式不能级联(No Cascading)

RN 没有 CSS 的层叠(Cascade)和继承机制。

例如 Web:

xml 复制代码
<div class="parent">
    <p>Hello</p>
</div>
css 复制代码
.parent {
    color: red;
}

子元素 <p> 会继承颜色。

但是 RN:

xml 复制代码
<View style={{ backgroundColor: 'red' }}>
    <Text>Hello</Text>
</View>

Text 不会自动继承 大多数样式(只有少数文本相关属性在嵌套 Text 中会继承)。

必须显式写:

scss 复制代码
<Text style={{ color: 'red' }}>
    Hello
</Text>

也没有:

  • .box .title
  • #id
  • div p
  • :hover
  • :before
  • @media

这些 CSS 选择器和规则。

RN 的样式是直接绑定到组件上的:

ini 复制代码
<Text style={styles.title}>

样式组合方式

RN 推荐使用数组组合样式:

scss 复制代码
<Text style={[styles.title, styles.active]}>
    Hello
</Text>

后面的样式会覆盖前面的同名属性,相当于:

复制代码
{
  ...styles.title,
  ...styles.active
}

总结

特点 React Native Web CSS
默认布局 Flexbox(display: flex 默认开启) Block 布局,需要写 display: flex
默认主轴 column row
单位 不写单位(逻辑像素) px、em、rem、% 等
样式级联 不支持 支持
CSS 选择器 不支持 支持
样式复用 StyleSheet.create()、数组合并 class、继承、层叠、选择器

这三点可以概括为:RN 默认使用 Flexbox(纵向布局),样式值使用无单位的逻辑像素,样式仅作用于当前组件,不支持 CSS 的层叠和复杂选择器。

相关推荐
空中湖1 天前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
来一首_We_go3 天前
React Flow Pro 高级交互实现
前端·react.js
weedsfly3 天前
React 不可变数据:为什么页面“明明数据变了却不更新
前端·javascript·react.js
随风一样自由3 天前
【React+TS71007】Next.js “use client” 误用导致 TS71007:客户端/服务端引入问题的完整排查与修复
前端·javascript·react.js
tech_zjf4 天前
下班后,我做了一个把照片贴进日历的 iPhone 应用:Daypatch
react native·app·产品
ZoeLandia4 天前
React6:组件通信
前端·react.js·typescript
ZoeLandia4 天前
React03:useState 与不可变更新
前端·react.js·typescript·react
鬼手点金4 天前
单轮对话:最简单的 API 调用
java·服务器·前端·javascript·react.js·servlet·tomcat
console.log('npc')4 天前
从0到1实现任务评价统计功能:React + TypeScript 实战指南(小白注释版)
前端·react.js·typescript
ZoeLandia4 天前
React04:事件处理与受控表单
开发语言·前端·react.js·typescript