页面响应式布局的要点
响应式设计与自适应设计的区别
响应式开发一套界面,通过检测视口分辨率,针对不同客户端在客户端做代码处理,来展现不同的布局和内容;自适应需要开发多套界面,通过检测视口分辨率,来判断当前访问的设备是 pc 端、平板、手机,从而请求服务层,返回不同的页面。
响应式布局实现方案
媒体查询
不管是移动优先还是 PC 优先,都是依据当随着屏幕宽度增大或减小的时候,后面的样式会覆盖前面的样式。因此,移动端优先首先使用的是 min-width,PC 端优先使用的 max-width。
1 |
|
百分比布局
我们必须要弄清楚 css 中子元素的百分比到底是相对谁的百分比。直接上结论吧:
- 子元素的 height 或 width 中使用百分比,是相对于子元素的直接父元素。width 相对于直接父元素的 width,height 相对于直接父元素的 height。
- 子元素的 top 和 bottom 如果设置百分比,则相对于直接非 static 定位(默认定位)的父元素的高度。
- 同样子元素的 left 和 right 如果设置百分比,则相对于直接非 static 定位(默认定位的)父元素的宽度。
- 子元素的 padding 如果设置百分比,不论是垂直方向或者是水平方向,都相对于直接父亲元素的 width,而与父元素的 height 无关。
- 子元素的 margin 如果设置成百分比,不论是垂直方向还是水平方向,都相对于直接父元素的 width
- border-radius 不一样,如果设置 border-radius 为百分比,则是相对于自身的宽度,除了 border-radius 外,还有比如 translate、background-size 等都是相对于自身的。
rem 布局
rem
是css3
中新增的单位,并且移动端支持度很高。
rem
单位都是相对于根元素 html 的font-size
来决定大小的,根元素的font-size
相当于提供了一个基准,当页面的 size 发生变化时,只需要改变font-size
的值,那么以rem
为固定单位的元素的大小也会发生响应的变化。 因此,如果通过rem
来实现响应式的布局,只需要根据视图容器的大小,动态的改变font-size
即可(而 em 是相对于父元素的)。
rem 响应式的布局思想:
- 一般不要给元素设置具体的宽度,但是对于一些小图标可以设定具体宽度值
- 高度值可以设置固定值,设计稿有多大,我们就严格有多大
- 所有设置的固定值都用 rem 做单位(首先在 HTML 总设置一个基准值:px 和 rem 的对应比例,然后在效果图上获取 px 值,布局的时候转化为 rem 值)
- js 获取真实屏幕的宽度,让其除以设计稿的宽度,算出比例,把之前的基准值按照比例进行重新的设定,这样项目就可以在移动端自适应了
rem
布局也是目前多屏幕适配的最佳方式。
vw/vh 视口单位
vw
表示相对于视图窗口的宽度,vh
表示相对于视图窗口高度,除了vw
和vh
外,还有vmin
和vmax
两个相关的单位。
单位 | 含义 |
---|---|
vw | 相对于视窗的宽度,1vw 等于视口宽度的 1%,即视窗宽度是 100vw |
vh | 相对于视窗的高度,1vh 等于视口高度的 1%,即视窗高度是 100vh |
vmin | vw 和 vh 中的较小值 |
vmax | vw 和 vh 中的较大值 |
vw 和%的区别为:
| 单位 | 含义 |
| —– | —————————————————————————- |
| % | 大部分相对于祖先元素,也有相对于自身的情况比如(border-radius、translate 等) |
| vw/vh | 相对于视窗的尺寸 |
- 1 物理像素线(也就是普通屏幕下 1px,高清屏幕下 0.5px 的情况)采用 transform 属性 scale 实现
1 |
|
图片响应式
- 1.使用 max-width(图片自适应)
图片自适应意思就是图片能随着容器的大小进行缩放
1 |
|
- 2.使用
srcset
1 |
|
如果屏幕的 dpi = 1 的话则加载 1 倍图,而 dpi = 2 则加载 2 倍图,手机和 mac 基本上 dpi 都达到了 2 以上,这样子对于普通屏幕来说不会浪费流量,而对于视网膜屏来说又有高清的体验。
响应式布局的成型方案
现在的 css,UI 框架等都已经考虑到了适配不同屏幕分辨率的问题,实际项目中我们可以直接使用这些新特性和框架来实现响应式布局。可以有以下选择方案:
- 利用上面的方法自己来实现,比如 CSS3 Media Query,rem,vw 等
- Flex 弹性布局,兼容性较差
- Grid 网格布局,兼容性较差
- Columns 栅格系统,往往需要依赖某个 UI 库,如 Bootstrap
要点
在实际项目中,我们可能需要综合使用响应式布局方案,比如用 rem 来做字体的适配,用 srcset 来做图片的响应式,宽度可以用 rem,flex,栅格系统等来实现响应式,然后可能还需要利用媒体查询来作为响应式布局的基础,因此综合上面的实现方案,项目中实现响应式布局需要注意下面几点:
- 设置 viewport
- 媒体查询
- 字体的适配(字体单位)
- 百分比布局
- 图片的适配(图片的响应式)
- 结合 flex,grid,BFC,栅格系统等已经成型的方案