在今天的移动端开发实践中,本犬构建了一个掘金风格的React应用,涉及了响应式布局、CSS模块化、REM适配等技术要点。当然只是一个壳子,纯页面,并没有什么交互功能,我做这个页面主要是锻炼本犬的
css
,因为平常css写得太少了,和锻炼使用第三方组件库的能力,下面图示是具体效果:

下面通过代码示例复盘核心知识点:
一、REM适配与PostCSS配置
在postcss.config.js
中配置了移动端适配方案,核心是使用postcss-pxtorem
插件:
javascript
export default {
plugins: {
"postcss-pxtorem": {
rootValue: 75, // 设计稿宽度/10(iPhone6为750px)
propList: ['*'], // 所有属性自动转换
exclude: /node_modules/i, // 排除第三方库
},
},
}
这种配置实现了:
- REM基准值:1rem = 75px(基于750px设计稿)
- 自动转换:所有CSS中的px单位自动转为rem
- 开发友好:编写时直接使用设计稿像素值
这样我们能适配各种设备,避免不同设备显示的内容大小差异太大
二、首页布局与组件集成
首页采用flex布局实现响应式结构:
ini
<div className="flex flex-column h-screen">
{/* 顶部导航 */}
<div className={`flex justify-aliign ${styles.top}`}>
<Image src="//lf-web-assets.juejin.cn/..." />
<h2 style={{ fontSize: '16px' }}>掘金</h2>
<Search shape="round" className={styles.search} />
<Bell fontSize="24px" />
<Image round src="user-avatar.png" />
</div>
{/* 标签栏 */}
<div className={styles.tab}>
<Tabbar value={active} onChange={(key) => {
setActive(key);
navigate(tabs[key].path);
}}>
{tabs.map(tab => (
<Tabbar.Item key={tab.id}>{tab.title}</Tabbar.Item>
))}
</Tabbar>
</div>
{/* 内容区 */}
<div className={`flex flex-1 ${styles.body}`}>
<Outlet />
</div>
</div>
技术要点解析:
-
路由导航集成:通过useNavigate实现标签切换路由跳转
-
状态管理:useState管理当前激活标签页
-
响应式布局:
h-screen
实现全屏高度flex-1
让内容区域自动填充剩余空间
-
组件封装:
- Tabbar实现底部导航
- Search提供圆形搜索框
- Image处理头像展示
三、CSS模块化实践
在home.module.css
中定义模块化样式:
css
.top {
background-color: white;
margin-bottom: 30px; /* 转换为0.4rem */
}
.tab {
margin-bottom: 40px; /* 转换为0.533rem */
}
.search {
max-width: 100%;
}
.center {
margin: auto;
}
模块化优势:
- 作用域隔离:避免全局污染
- 语义化命名:直观反映组件用途
- REM适配:通过PostCSS自动转换单位
四、关注页面的数据渲染
关注页(concern.jsx
)展示文章列表:
ini
<div className={`flex flex-column ${styles.concern}`}>
{articles.map(item => (
<div key={item.id} className={`flex flex-column ${styles.article}`}>
<h3 style={{ fontSize: '16px' }}>{item.title}</h3>
<p style={{ fontSize: '12px' }}>{item.content}</p>
<div className={`flex flex-justify-center`}>
<p style={{ fontSize: '12px' }}>{item.author}</p>
<p style={{ fontSize: '12px' }}>{item.time}</p>
<EyeO fontSize="12px" />
<p>{item.view}</p>
<GoodJobO fontSize="12px" />
<p>{item.like}</p>
<MoreO fontSize="12px" />
</div>
<Divider margin="0" />
</div>
))}
</div>
数据驱动视图:
-
Mock数据:使用useState模拟文章数据
-
列表渲染:map遍历生成文章卡片
-
图标集成:使用React Vant图标组件
-
样式控制:
- 固定字号(16px标题/12px正文)
- flex布局实现水平排列元素
- Divider组件添加分割线
五、样式细节优化技巧
在concern.module.css
中体现的细节处理:
css
.article {
padding: 30px 40px; /* 转换为0.4rem/0.533rem */
overflow: auto;
}
.articleBody {
height: 70%;
color: #666; /* 次级文本色 */
}
.disstance1 {
margin-top: 10px; /* 转换为0.133rem */
}
.distance2 {
margin: auto 30px 0 0; /* 右间距0.4rem */
}
最佳实践:
-
间距系统:使用margin-top统一垂直间距
-
颜色层次:
#333
主标题#666
正文内容#999
辅助信息
-
响应式处理:
- max-width: 100% 防止内容溢出
- overflow: auto 确保小屏可滚动
六、技术方案选择思考
-
为什么选择REM适配?
- 兼容性好:支持老版本浏览器
- 调整灵活:通过JS可动态修改根字号
- 开发高效:1:1还原设计稿尺寸
-
CSS模块化 vs CSS-in-JS

-
组件库选择考量:
- React Vant:专为移动端优化的组件库
- 图标库:按需引入减少包体积
- 主题定制:通过CSS变量轻松换肤
总结与思考
通过这个项目,我深刻体会到移动端开发的几个核心要点:
-
适配优先:从配置PostCSS开始建立适配方案
-
组件思维:将UI拆分为可复用的组件
-
性能意识:图片优化、按需引入组件
-
代码组织:
- views/ 页面级组件
- components/ 通用组件
- styles/ 全局样式
后续可能会继续完善交互功能,使用mock
模拟获取后端数据,写掘金页面,本犬只是锻炼一下css能力,熟悉第三方组件库地使用,很多地方做得不好,大佬勿喷
参考文档