解决移动适配问题

1,379 阅读3分钟

响应式设计--viewport

即视窗、视口,用于显示网页部分的区域,在 PC 端视口即是浏览器窗口区域,在移动端,为了让页面展示更多的内容,视窗的宽度默认不为设备的宽度,在移动端视窗有三个概念:布局视窗、视觉视窗、理想视窗

  • layout viewport布局视窗:在浏览器窗口css的布局区域,布局视口的宽度限制css布局的宽。为了能在移动设备上正常显示那些为pc端浏览器设计的网站,移动设备上的浏览器都会把自己默认的 viewport 设为 980px 或其他值,一般都比移动端浏览器可视区域大很多,所以就会出现浏览器出现横向滚动条的情况
  • visual viewport视觉视窗:终端设备显示网页的区域
  • ideal viewport理想视窗:针对当前设备最理想的展示页面的视窗,不会出现横向滚动条,页面刚好全部展现在视窗内,理想视窗也就是终端屏幕的宽度。

使用viewport标签控制布局

<mate name='viewport' content='width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no'>

属性介绍

属性名取值描述
Width正整数或device-width定义视口的宽度,单位为像素
Height正整数或device-height定义视口的高度,单位为像素,一般不用
Initial-scale[0.0-10.0]定义初始缩放值
Minimum-scale[0.0-10.0]定义缩小最小比例,它必须小于或等于maximum-scale
Maximum-scale[0.0-10.0]定义放大最大比例,它必须大于等于minimum-scale
User-scalableYes/no定义是否允许手动缩放,默认值yes

使用css媒体查询 @media

基于 css 的媒体查询属性 @media 分别为不同屏幕尺寸的移动设备编写不同尺寸的 css 属性,示例如下所示。虽然此方法能在一定程度上解决移动设备适配的问题,但我们也可以看出其存在以下问题,所以其已几乎被历史潮流淘汰。

  • 页面上所有的元素都得在不同的 @media 中定义一遍不同的尺寸,这个代价有点高;
  • 如果再多一种屏幕尺寸,就得多写一个 @media 查询块;
@media only screen and (min-width: 375px) { 
    .logo { width : 62.5px; 
    }
} 
@media only screen and (min-width: 360px) { 
    .logo { width : 60px; 
    } 
}
@media only screen and (min-width: 320px) { 
    .logo { width : 53.3333px; 
    } 
}

使用 rem 单位

rem(font size of the root element)是指相对于根元素的字体大小的单位,如果我们设置 html 的 font-size 为 16px,则如果需要设置元素字体大小为 16px,则写为 1rem。但是其还是必须得借助 @media 属性来为不同大小的设备设置不同的 font-size,相对上一种方案,可以减少重复编写相同属性的代价,简单示例如下所示。
我们也能看到该方案存在以下问题:

  • 不同的尺寸需要写多个 @media;
  • 所有涉及到使用 rem 的地方,全部都需要调用方法 calc() ,这个也挺麻烦的;

vw/vh 布局

vw/vh 方案与 rem 方案类似,都是将页面分成一份一份的,只不过 vw/vh 是将页面分为 100 份,1vw = device-width/100