移动端适配方案

视口介绍

1、布局视口(layout viewpor)

var width=document.documentElement.clientWidth

​可以看作为当前顶级HTML元素的宽度,也就是咱们浏览器当前的可视区域的宽度,咱们的媒体查询max-width和min-width的值也是布局视口的宽度,布局视口中的宽度和高度都是像素,也就是px,是一个抽象单位。​ 布局视口宽度受到meta标签内的width属性和initial-scale的影响,仅设置width的值时,这个值就是布局视口的宽度,它的值可以是正整数或者特殊值device-width。​ 布局视口宽 = 可视视口宽时html 元素正好横向铺满窗口(但其后代元素若有横向 overflow 的情况,仍然会出现滚动条),布局视口宽 > 可视视口宽时,出现横向滚动条。

2 : 可视视口(visual viewport)

var width=window.innerWidth

可视视口是当前可见区域的CSS像素数,和布局视口差不多,区别可视视口的宽度决定了将页面分成了多少份,每份对应一个CSS像素。可视视口受到缩放比例的影响,在meta标签内设置了initial-scale=0.5 后会改变可视视口的尺寸,可视视口尺寸越小显示的CSS像素数也越少,则单位CSS像素数对应的可视区域越大,对应的缩放比例也就越大。缩放比例是相对于理想视口而言缩放比例 = 理想视口尺寸/可是视口尺寸,而当没有设置initial-scale的时候,浏览器会取适当的缩放比例,一般情况下为1,使布局正好铺满屏幕,此时布局视口尺寸 = 可视视口尺寸。

3 : 理想视口(ideal viewport)

var width=screen.width

理想视口是一个比较适合移动布局的视口尺寸,作为计算布局视口和可视视口尺寸的基准值,上面mete标签中的device-width 就是理想视口的宽度。上面三个视口属性中,只有理想视口是不可以改变的,因为理想视口的宽度拒绝与设备的物理像素比存在着比例的关系,这个比例叫做设备像素比(device pixel ratio,dpr)。

公式为 :设备像素比 = 物理像素数 / 理想视口尺寸。

iPhone 物理宽度像素 640 理想视口宽度 320 设备像素比 2

​var c=window.devicePixelRatio 这样可以获取设备像素比(Android系统下可能不符合预期),由于没有禁用缩放属性,手动缩放不会影响布局视口或者理想视口,只会影响到可视视口的尺寸,而且可能导致布局视口小于理想视口。设置 initial-scale 的值时,布局视口的尺寸与可视视口的计算方式相同,但不受手动缩放的影响同时设置 width 和 intial-scale 的值时,布局视口的宽取上述两个值中较大的一个。

总结

 1 : 将meta标签中的width设为device-width时,布局视口 = 可视视口 = 理想视口,这时设备像素比,设备像素比 = 物理像素 / 理想视口尺寸 = 物理像素比 / 布局视口尺寸,对iphone而言,一个CSS像素对应4个物理像素。

​  2 : initial-scale 设置任意合法的值同时禁用手动缩放时,布局视口 = 可视视口

​  3 : initial-scale 设置为1时也可以使布局视口 = 可视视口 =理想视口

flexible的适配方案

flexible方案会把视觉稿分为100份,主要是为了更好的兼容vh 和 vw ,而每一份被称为一个单位a,同时1rem单位被认定为10a。假设设计稿是750px规格,1a = 750px/100,1rem = 10a = 75px,所以根元素相对应的font-size=75px。

但在开发过程中我们怎么将设计稿的px转换成相对单位的rem呢?

方法一: 根据计算转换得到易于计算的比例值

rem 计算

刚才我们计算了设计稿1rem = 750px/10 = 75px , 实际屏幕1rem = clientWidth / 10; 根据比例得到 1rem = 75px = clientWidth/10 ,我们发现根据上图公式Math.floor(100 * (clientWidth / 750))发现右边除以750在乘1000(为什么要成1000呢,为了减小计算误差咯),所以左边也除以750在乘1000,可以得到 1rem = 100px; 现在设计稿有段长度是240px,口算得到相对单位2.4rem

方法二:根据css预编译sass或less的函数来计算rem值

根据设计稿得到1rem = 75px; 编写scss文件

//   rem.scss

$baseUnit = 75px;

@function pxToRem($px){

    @return $px / $baseUnit + 'rem'

}

// 如何使用

@import 'rem.scss'

div {

    height: pxToRem(200)

}

方法三:借助插件自动计算:px2rem,postcss-pxtorem等,请自行选择,这里介绍在Vue中使用px2rem。

    1 、npm install px2rem-loader

    2、在vue-cli 项目中build下的 utils.js中,找到generateLoaders 方法修改配置

var px2remLoader={

loader:'px2rem-loader',

options:{

    remUnit:75 // 设计稿宽度/10

}};

// generate loader string to be used with extract text plugin

function generateLoaders(loader,loaderOptions){

    var loaders=[cssLoader,px2remLoader];//添加px2rem 插件

    if(loader){

        loaders.push({

        loader:loader+'-loader',

        options:Object.assign({},loaderOptions,{sourceMap:options.sourceMap})

    })

}

3、vue-cli3.0中需要在vue.config.js中配置 chainWebpack

chainWebpack: config=> {

    config.module

    .rule('scss')

    .oneOf('vue')

    .use('px2rem-loader')

    .loader('px2rem-loader')

    .before('postcss-loader') // this makes it work.

    .options({remUnit:75})

    .end()

}

现在就可以在项目中愉快的使用px了,设计稿是多少,就写多少,自动转换成rem,不要太爽

注意:这里是通过自定义函数来设置根元素html的字体大小(即rem),我们可以使用淘宝的库lib-flexible,这个库会自动计算设置根元素html的字体大小

npm install lib-flexible -save 然后在main.js 中引入这个文件

// main.js

import 'lib-flexible/flexible'

参考文章:

https://www.jianshu.com/p/213f98766769

https://www.jianshu.com/p/444b099a5706

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容