移动端是怎么做适配的?


前端进行移动端开发的时候,因为移动端的设备大小种类繁多,如果按照pc端的方式进行开发,则需要很繁琐,要写很多适配移动端设备的样式,这个工作量太大,而且移动端设备尺寸更新太快,所以每个都要写样式,这显然很不合理。
那么有没有更好的方法在移动端进行开发呢?

这里小小的介绍一个常用的移动端开发适配的方法。

1.添加<meta name="viewport">

为什么要添加这个meta便签呢?这个说来话长,有些历史原因。不过需要说明的是,我们平时写的页面内容,在移动端显示的时候,移动端浏览器会把浏览器的设备宽度模拟成980px宽度来进行解析页面。也就是说,我们的网页在移动端显示,和pc上在一个宽度为980px宽的浏览器上显示的比例效果是一样的。
移动端浏览器有这个解析过程,但我们并不想要这个980px的效果,我们想要和设备宽度一直比例的显示内容。

这就是要添加<meta name="viewport">的原因了。

添加meta便签,也不是单单只需要写meta的name属性就行了,一般我们根据需求来写属性content的内容,下面是常用的meta便签书写内容。

<meta name="viewport" content="width=device-width,inital-scale=1,user-scalable=0">

content属性的内容有很多,这里设置了内容宽度(width=device-width)和初始缩放比例(inital-scale=1)和用户是否可以缩放(user-scalable=0),更多内容请另行查阅,不深入说明。

2.媒体查询media

解决了移动端的980问题后,我们可以在直接写移动端样式了。但是我们写移动端内容的时候,又要如何同时兼容pc端的内容呢?这里介绍一个CSS3的新特性,媒体查询(media)。
媒体查询的使用方式有两个。
一个是直接在css样式内容用,添加@media(...){...},符合括号()内容的条件,则使用大括号{}中的样式。

...
@media(max-width:768px){
   a{ ...}
   body{...}
   ...
}

可以使用媒体查询查询不同尺寸时,应执行的样式内容。

@media(max-width:768px){
   a{ ...}
}
@media(max-width:1000px){
   a{ ...}
}
@media(max-width:1200px){
   a{ ...}
}

另一个是在link引用外部样式时,声明使用

  <link href=".../style.css" media="(max-width:768px)" >

这里只介绍media简单的用法,media更多内容,详见 Media MDN

3.动态rem

有了媒体查询的方式适配不同的尺寸样式,开发效率提高了很多。但是多个尺寸的时候,还是得书写多个尺寸的媒体查询。这个解决的方式,就是在一个范围内,就写一套样式,让它自己适配不同的设备尺寸,同时保持页面比例不变化。
这就需要我们rem单位了。

首先说明rem是什么。

要说rem,就想说明下什么是em,这里初略说明下,em是一个字体的大小单位。1em就是当前元素的font-size的大小。例如,body的font-size大小为16px;则在body定义一个1em的单位时,就是16px。
这时,就能理解rem了,rem是根元素的em大小值。我们知道,网页的根元素为html,也就是说rem是html元素的font-size大小。

em——当前元素font-size值
rem——根元素font-size值

了解了什么是rem以后,我们其实知道了其实rem是字体的大小单位,但是我们适配的是宽度单位,让内容自适应宽度,怎么让这两个转换呢?只需要把根元素html的font-size设置成和设备宽度(或者浏览器宽度)一样大小就可以使用类似百分比的效果了。这个有两种方法,第一种可以使用js动态设置rem,第二种是使用sass把px转rem。

3.1 js设置rem

<script>
    var htmlWidth = document.documentElement.clientWidth;
    document.write(" <style> html{ font-size: " +  htmlWidth  + "px}</style>")
<script/>

这时,就可以使用rem的单位来进行书写宽度单位了。1em = 设备宽度(浏览器的宽度)
当设备尺寸变化的时候,页面的比例是没有变化的,可以很好的适不同移动端尺寸的效果。

使用示例

div{
width:0.5rem;
height:0.1rem;
}

值得注意的是,因为font-size的属性是可以继承的,html元素的font-size会继承给它的所有后代元素。
我们知道html元素有两个子元素,body和head元素,我们只需要给body元素设置回想要的额font-size,body的后代元素就会继承body的font-size了。

简单的说,就是再单独给body设置一个font-size。

如果时,不想用太多小数,则可以把font-size的比例调整。 1rem =设备宽度/10

<script>
    var htmlWidth = document.documentElement.clientWidth;
    document.write(" <style> html{ font-size: " +  htmlWidth/10  + "px}</style>")
<script/>

这时,原本写0.1rem的样式,就可以写1rem。这个根据个人想法调整。并不是绝对的。

值得注意的是,谷歌浏览器设置了最小font-size是12px,如果设置小于12px的大小,都只会使用最小的12px大小。所以设置font-size比例大小的时候,也不能设置太小。

3.2 px自动转rem

除了使用js动态设置生成rem外,还有一种方式是,使用sass设置px转rem。这里使用node-sass实现(node-sass安装另行查询)。

@function px($px){                           //px转rem函数
    @return $px/$designWidth +rem; 
}

$designWidth : 750;                          //设计稿的尺寸宽度

body{
    width:px(750);                             //直接使用设计稿元素宽度,自动转rem
    height:px(1334);
}

以上是移动端做适配时的常用方案。前端开发日新月异,以后还会有更多的方案出现。这里只讲一个范例。无需钻牛角尖。

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • 1. meta viewport 2. 媒体查询 媒体查询由一个可选的媒体类型和零个或多个使用媒体功能的限制了...
    庄海鑫阅读 383评论 0 4
  • 我们第一次接触移动web的时候,直观印象样应该是:屏幕比pc小很多,所以对pc端设计的界面,不一定(或者说不完全)...
    Scaukk阅读 16,817评论 6 46
  • 我这个人比较木讷,比较呆,爱计较,没人爱。加油,自己爱自己。
    莲花舒梓慧阅读 98评论 0 0
  • “很久很久以前,有一位帅气多金的国王,爱上了邻国美丽的公主,他们结婚后生下一个可爱的小公主,幸福快乐。森林里有一个...
    简素素阅读 183评论 0 1