参考链接
移动端WEB开发之响应式布局(响应式开发原理、bootstrap、阿里百秀案例)
基于vw等viewport视区单位配合rem响应式排版和布局
移动端响应式布局方式
响应式与自适应式
响应式开发一套界面,通过检测视口分辨率,针对不同客户端在客户端做代码处理,来展现不同的布局和内容;
自适应需要开发多套界面,通过检测视口分辨率,来判断当前访问的设备是pc端、平板、手机,从而请求服务层,返回不同的页面。自适应对页面做的屏幕适配是在一定范围:比如pc端一般要大于1024像素,手机端要小于768像素。而响应式布局是一套页面全部适应。
自适应布局如果屏幕太小会发生内容过于拥挤。而响应式布局正是为了解决这个问题而衍生出的概念,它可以自动识别屏幕宽度并做出相应调整的网页设计。
媒体查询
CSS3
媒体查询可以让我们针对不同的媒体类型定义不同的样式,当重置浏览器窗口大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。
不管是移动优先还是PC优先,都是依据当随着屏幕宽度增大或减小的时候,后面的样式会覆盖前面的样式。因此,移动端优先首先使用的是 min-width
,PC端优先使用的是 max-width
。
max 指的是不大于,例如 max-width:1200px
= 不大于1200px的时候使用该规则中的样式
min 指的是不小于, 例如 min-width:1200px
= 不小于1200px的时候使用规则中的样式
媒体查询需要根据众多的分辨率类型设置不同类型的断点。
百分比
看这里👉百分比
(无定位)子元素的height
或width
中使用百分比,是相对于子元素的直接父元素,width
相对于父元素的width
,height
相对于父元素的height
;
子元素的top
和bottom
如果设置百分比,则相对于直接非static
定位(默认定位)的父元素的高度,同样子元素的left
和right
如果设置百分比,则相对于直接非static
定位(默认定位的)父元素的宽度;
(无定位)子元素的padding
如果设置百分比,不论是垂直方向或者是水平方向,都相对于直接父亲元素的width
,而与父元素的height
无关。
跟padding
一样,margin
也是如此,(无定位)子元素的margin
如果设置成百分比,不论是垂直方向还是水平方向,都相对于直接父元素的width
;
border-radius
不一样,如果设置border-radius
为百分比,则是相对于自身的宽度,
除了border-radius
外,还有比如translate
、background-size
等都是相对于自身的;
如果全部使用百分比单位来实现响应式的布局,有明显的以下两个缺点:
计算困难,如果我们要定义一个元素的宽度和高度,按照设计稿,必须换算成百分比单位。
可以看出,各个属性中如果使用百分比,相对父元素的属性并不是唯一的。
比如width
和height
相对于父元素的width
和height
,而margin
、padding
不管垂直还是水平方向都相对比父元素的宽度、border-radius
则是相对于元素自身等等,造成我们使用百分比单位容易使布局问题变得复杂。
rem
rem
单位都是相对于根元素 html 的 font-size
来决定大小的,根元素的 font-size
相当于提供了一个基准,当页面的 size 发生变化时,只需要改变 font-size
的值,那么以 rem
为固定单位的元素的大小也会发生响应的变化。
rem响应式的布局思想:
- 一般不要给元素设置具体的宽度,但是对于一些小图标可以设定具体宽度值
- 高度值可以设置固定值,设计稿有多大,我们就严格有多大
- 所有设置的固定值都用
rem
做单位(首先在HTML总设置一个基准值:px
和rem
的对应比例,然后在效果图上获取px
值,布局的时候转化为rem
值) - js获取真实屏幕的宽度,让其除以设计稿的宽度,算出比例,把之前的基准值按照比例进行重新的设定,这样项目就可以在移动端自适应了
rem布局的缺点:
在响应式布局中,必须通过js来动态控制根元素 font-size
的大小,也就是说 css 样式和 js 代码有一定的耦合性,且必须将改变 font-size
的代码放在 css
样式之前
vw
1.只用 vw 单位
2.搭配 vw 和 rem
虽然采用vw
适配后的页面效果很好,但是它是利用视口单位实现的布局,依赖视口大小而自动缩放,无论视口过大还是过小,它也随着时候过大或者过小,失去了最大最小宽度的限制,此时我们可以结合rem
来实现布局
- 给根元素大小设置随着视口变化而变化的
vw
单位,这样就可以实现动态改变其大小 - 限制根元素字体大小的最大最小值,配合
body
加上最大宽度和最小宽度
基于 rem
和 vw
和 calc
实践代码:
html {
font-size: 16px;
}
@media screen and (min-width: 375px) {
html {
/* iPhone6的375px尺寸作为16px基准,414px正好18px大小, 600 20px */
font-size: calc(100% + 2 * (100vw - 375px) / 39);
font-size: calc(16px + 2 * (100vw - 375px) / 39);
}
}
@media screen and (min-width: 414px) {
html {
/* 414px-1000px每100像素宽字体增加1px(18px-22px) */
font-size: calc(112.5% + 4 * (100vw - 414px) / 586);
font-size: calc(18px + 4 * (100vw - 414px) / 586);
}
}
@media screen and (min-width: 600px) {
html {
/* 600px-1000px每100像素宽字体增加1px(20px-24px) */
font-size: calc(125% + 4 * (100vw - 600px) / 400);
font-size: calc(20px + 4 * (100vw - 600px) / 400);
}
}
@media screen and (min-width: 1000px) {
html {
/* 1000px往后是每100像素0.5px增加 */
font-size: calc(137.5% + 6 * (100vw - 1000px) / 1000);
font-size: calc(22px + 6 * (100vw - 1000px) / 1000);
}
}
补充
未来的响应式设计
视频:【大咖开讲】阿里CSS专家大漠老师分享:Web终端适配主流方案
比如容器查询等,文章属实很长,只看了视频里的简单介绍。