移动端适配问题

前言

最近自己在整一个移动端的项目,自认为之前已经开发过很多的移动端项目,对适配还算比较了解,但是这次在做的时候自己静下心来考虑,现在的适配方式有很多种,那么在做项目的时候我应该选择哪种方式来做适配呢?

适配方式

1.rem

这种方式相信用的人还是比较多的,我也一直在用。原理非常简单,rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。在加上一段js动态设置html的font-zise大小,这样在不同设备上的展示就是无限接近相同。

function setRem () {
  var width=document.documentElement.clientWidth;
  var styleNode=document.createElement("style");
  styleNode.innerHTML="html{font-size:"+ width/10 +"px !important}";
  document.head.appendChild(styleNode);
}

// 初始化
setRem();
// 改变窗口大小时重新设置 rem
window.onresize = debounce(function () {
  setRem()
},500);

lib-flexible淘宝项目组开发出来的一个小插件,属于开源项目,可以在各类项目中引入并使用。这个插件可以直接在项目中写px,它帮助你转换成rem。
这篇文章是介绍怎么使用:lib-flexible适配大屏方案(附移动端适配)

2、vw,vh布局

vh、vw方案个人理解就是百分比布局,只不过是相对于视觉视口的百分比。将视觉视口宽度 window.innerWidth和视觉视口高度 window.innerHeight 等分为 100 份。

image.png

这个方案在写的时候也会遇到和rem一样需要转换单位,而且px转换成vw不一定能完全整除,因此有一定的像素差。

不过可以使用webpack解析css 的时候用postcss-loader 有个postcss-px-to-viewport能自动实现px到vw的转化。

{
    loader: 'postcss-loader',
    options: {
        plugins: ()=>[
            require('autoprefixer')({
                browsers: ['last 5 versions']
            }),
            require('postcss-px-to-viewport')({
                viewportWidth: 375, //视口宽度(数字)
                viewportHeight: 1334, //视口高度(数字)
                unitPrecision: 3, //设置的保留小数位数(数字)
                viewportUnit: 'vw', //设置要转换的单位(字符串)
                selectorBlackList: ['.ignore', '.hairlines'], //不需要进行转换的类名(数组)
                minPixelValue: 1, //设置要替换的最小像素值(数字)
                mediaQuery: false //允许在媒体查询中转换px(true/false)
            })
        ]
}

3.rem+vw

因为rem的方式根元素font-size值强耦合,系统字体放大或缩小时,会导致布局错乱,并且html文件头部需插入一段js代码。那么利用vw的方式来设置根元素的font-zise,省去那一小段js代码,让你的代码更纯粹。

以750的图纸为例
//375 / 100 = 3.75
//为了方便计算,使用100px
//100 / 3.75 = 26.66666666666667vw
//这里就得出26.66666666666667 = 100px
html {font-zise: 26.66666666666667vw }

//70 / 100 = 0.7
div {
  width:0 .7rem
}

4.px为主,vx和vxxx(vw/vh/vmax/vmin)为辅,搭配一些flex

这是看到一位大佬写的文章后了解到的一种适配方式
原文地址:面试官:你了解过移动端适配吗?
这套方案的中心思想,用户之所以去买大屏手机,不是为了看到更大的UI,而是为了看到更多的UI。

适配流程
  1. 在head 设置width=device-width的viewport‘
  2. 在css中使用px
  3. 在适当的场景使用flex布局,或者配合vw进行自适应
  4. 在跨设备类型的时候(pc <-> 手机 <-> 平板)使用媒体查询
  5. 在跨设备类型如果交互差异太大的情况,考虑分开项目开发

我在尝试过这套方案之后存在一些疑问,屏幕大的上面确实做到了可以展示更多的ui,小屏幕上的展示也友好,就是写的时候繁琐,还有就是轮播图的高度因为是写px的所以在大屏上会被挤压。

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