响应式布局&自适应布局

首先两种的方式的解决问题是不一样的。

宽度自适应

是为了解决如何才能在不同大小的设备上呈现相同的网页。手机的屏幕比较小,宽度通常在500像素以下,pc的像素一般在1000像素以上。因此就有人想出了一个办法,能不能"一次设计,普遍适用",让同一张网页自动适应不同大小的屏幕,根据屏幕的宽度,自动调节网页的内容大小,但是无论怎么样子,他们的主体的内容和布局没有变化。核心是使用rem代替绝对单位px。

自适应还是暴露出一个问题,如果屏幕太小,即使网页能够根据屏幕大小进行适配,但是会感觉在小屏幕上查看,内容过于拥挤,响应式正是为了解决这个问题而衍生出来的概念。它可以自动识别屏幕宽度、并做出相应调整的网页设计,布局和展示的内容可能会有所变动。

响应式Web设计

让一个网站同时适配多种设备和多个屏幕,可以让网站的布局和功能随用户的使用环境(屏幕大小、输入方式、设备/浏览器能力)而变化。核心是使用媒体查询相对于视口大小应用CSS规则。

响应式的概念应该覆盖了自适应(因为可以使用rem代替绝对单位px+媒体查询),而且涵盖的内容更多。

自适应实现方式

1. 首先在网页代码的头部,加入一行viewport元标签。

 <meta name="viewport" content="width=device-width, initial-scale=1" /> 

viewport是网页默认的宽度和高度,上面这行代码的意思是,网页宽度默认等于屏幕宽度(width=device-width),原始缩放比例(initial-scale=1)为1.0,即网页初始大小占屏幕面积的100%。

2. 使用rem代替绝对单位px

动态 rem是针对移动端页面的适配方法。例如手机淘宝 在移动端宽度不适合再用固定宽度px,我们希望整体等比缩放。

rem是CSS3新增的一个相对单位(root em,根em),相对的只是HTML根元素(1rem=html font size)。通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应(em也是相对长度单位,但会继承父级元素的字体大小)。

注意:rem是相对于根节点html的font-size的倍数,浏览器对font-size值有限制,一般font-size最小值默认为12。

动态rem方案

  1. meta:vp禁止缩放
    <meta name="viewport" content="width=device-width, height=device-height, inital-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
  2. document.documentElement.clientWidth动态获取页面宽度width
  3. 赋给html的font-size,即拼接成html{font-size:'+ width/10 +'px;}
  4. 10rem==页面宽度width
  5. 所有单位都用rem == 所有长度都以页面的宽度为基准
    示例

3. 使用视口单位(Viewport units) vw/vh

rem单位来实现适配,但是它还需要内嵌一段脚本去动态计算跟元素大小。
那有没有一个单位不需要JS和CSS耦合在一起的单位?答案是有的,就是vw/vh。

视口单位(Viewport units)

视口单位中的“视口”,桌面端指的是浏览器的可视区域;移动端指的就是Viewport中的Layout Viewport。

单位 解释
vw 1vw = 视口宽度的1%
vh 1vh = 视口高度的1%
vmin 选取vw和vh中最小的那个
vmax 选取vw和vh中最大的那个

vh/vw与%区别

vh/vw与%区别在于:

单位 依赖于
% 元素的祖先元素
vh/vw 视口的尺寸

自适应基础上的响应式页面

3. 媒体查询

目前一般常见的实现响应式有两种方法,一种是利用媒体查询,另外一种是bootstrap下的栅格布局。

媒体查询,即 @media 查询,可以针对不同的屏幕尺寸设置不同的样式,当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。

媒体查询示例

如果页面宽度小于 300 像素,则修改body的背景颜色为红色:

@media screen and (max-width: 300px) {
    body {
         background-color:red;
    }
}

如果页面宽度大于 300 像素并且小于600像素,则修改body的背景颜色为绿色:

@media screen and (min-width: 300px) and (max-width:600px) {
    body {
         background-color:green;
    }
}

如果页面宽度大于 600 像素,则修改body的背景颜色为蓝色:

@media screen and (min-width: 600px) {
    body {
         background-color:blue;
    }
}

还有一种响应式是使用绝对宽度px + 媒体查询,那么对于宽度不同的手机,显示页面内容的宽度仍然一样,内容居中,只是两边留白宽度不同。

4. 使用Flex弹性布局

布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。

Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。可以简便、完整、响应式地实现各种页面布局。
具体用法

一个使用rem实现自适应+媒体查询实现响应式+使用Flex弹性布局的例子

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容