【个人小结】如何开发响应式页面

158 阅读3分钟

什么是“响应式”

响应式 = responsive
i.e. 不论视窗大小如何变化,页面都可以正常且尽可能美观地呈现
→ “正常”:在每一个断点处,该有的组件全都有
→ “美观”:呈现符合人的习惯和直觉

那说到响应式界面,我们会想到什么?
→ 媒体查询 (最常用的CSS手段)
→ 使用相对值而非绝对值
→ min-width & max-width
→ 渐进式的开发方式

但这样散乱的知识在开发时需要串起来。
以下均用 Chakra UI 举例。

当接到“响应式”的需求时,关注什么?

错误的开发方式:
❌ 自测设断点:自己变换视窗大小随意设置页面布局变换的临界值(还自以为很顺滑233)
❌ 对组件之间的遮挡“视而不见”:意识不到页面的布局缺陷
❌ 没有事先仔细了解所使用的组件库:对工具不熟悉
❌ 简单的样式复杂化:CSS基本功不足

切入点:断点(breakpoint)

断点 i.e. 临界点
当使用某一UI组件库时,一般都内置断点,先明确默认断点的值是多少,再确认该断点是否满足需求
⚠️ 断点针对的是整个视窗大小,而不是某个具体组件

✅ 根据断点设置不同情况下的样式
✅ 自测时根据断点看效果

❌ 随意取值

例如当用户不在theme.ts中自定义时,Chakra UI的默认断点可见该doc

明确工具:组件库中是否已内置响应式工具

  • 是否有响应式样式的书写例子?
    if YES,仔细慢慢阅读并模仿例子的写法

  • 是否存在除了styles之外的工具可用?
    e.g. hooks
    例如在 Chakra UI 中的 useBreakpointValue() 可以帮助根据断点值设置具体样式

思考视图:呈现是否符合基本逻辑

❌ 在不同的视窗下把页面中的内容都呈现出来就好了

✅ 注意观察布局变化更好的方式
✅ 注意当组件位置改变时,是否仍满足组件间原有的归属关系

已知:导航栏布局 = 横向布局 = 面包屑路径 + 子页面标题 + 菜单按钮

例1:在窄屏时,三个组件都能原布局放下但有点拥挤
→ better:直接改为竖向布局,叠着放

例2:叠着放之后,导航栏按钮自然排在了最后,即插在子页面标题和子页面之间
→ better:调整布局,将菜单按钮放在面包屑路径之下,让子页面标题和子页面在一起

例3:当视窗收窄时,给子页面内部添加了 overflow: auto ,出现滚动条
→ better:直接给子页面的包含块设置 overflow: clip
→ 如果要用滚动条也应从整个视窗的角度考虑,将滚动条加在外面

开发时的tricks & 个人遇到的小问题

检查页面布局:使用 Chrome DevTools 中的 device toolbar

❌ 低效自行缩放浏览器看布局

✅ 直接设置对应断点值

开发样式:大小优先使用组件库内置值

❌ 直接使用绝对值(尽可能避免)
同样以 Chakra UI 为例,先看本地自定义的theme.ts,如未设置就去看default sizes

开发样式:尽量不用针对浏览器的样式

例:想要实现多行文本溢出时末尾出现省略号
最开始的解法

overflow:hidden; 
text-overflow:ellipsis;
display:-webkit-box; 
-webkit-box-orient:vertical;
-webkit-line-clamp:2;

相对更好的方式:使用组件中内置属性 noOfLines

网格布局变化:不使用 auto-fill 就会始终为设置的列数

参考:[掘金] 5分钟搞定 CSS Grid 布局
当最大宽度为 1 fr 时,使用 auto-fill 又会延展出多列,最后只好根据断点设置不同的 grid-template-columns