从网易和淘宝的font-size思考前端设计稿和工作流程思考学习size属性,讨论html5设计稿的大小和前端与设计的协作过程。内容很多,但一定对你的技术和工作有价值。欢迎阅读和评论:)。这是淘宝的github网址,里面有适配需要的js和文档地址:https://github.com/amfe/lib-f...问题是看了白书的博文导致的《移动web资源整理》最近,他在博文中的一段话中指出,如果html5要适配各种分辨率的移动设备,就应该使用rem这样的尺寸单位,同时给出了在html上设置font-size的代码对于每个分辨率范围:复制代码html{font-size:10px}@mediascreenand(min-width:321px)and(max-width:375px){html{font-size:11px}}@mediascreenand(min-width:376px)and(max-width:414px){html{font-size:12px}}@mediascreenand(min-width:415px)and(max-width:639px){html{font-size:15px}}@mediascreenand(min-width:640px)and(max-width:719px){html{font-size:20px}}@mediascreenand(min-width:720px)and(max-width:749px){html{font-size:22.5px}}@mediascreenand(min-width:750px)and(max-width:799px){html{font-size:23.5px}}@mediascreenand(min-width:800px){html{font-size:25px}}复制代码在实际项目中,与元素大小相关的css,如width、height、line-height、margin、padding等,都在rem,使页面在不同设备下网页布局保持一致。比如一个网页有一个.item类,宽度设置为3.4rem。该类在不同分辨率下的实际宽度如下:复制代码321px<=device-width<=375px,font-size:11px-->widthof.item:34px376px<=device-width<=414px,font-size:12px--->.item的宽度:37.4px415px<=device-width<=639px,font-size:15px--->.item的宽度:40.8px640px<=device-width<=719px,font-size:20px--->.item的宽度:51px720px<=device-width<=749px,font-size:22.5px--->.item的宽度:76.5px750px<=device-width<=799px,font-size:23.5px--->.item的宽度:79.8999999px800px<=device-width,font-size:25px--->.itemwidth:85px复制代码上面的代码乍一看还不错,这不就是响应式设计应该做的吗?但是考虑到工作量和复杂度,它有以下缺点:(1).item类的宽度在所有设备下都是3.4rem,但是不同分辨率下实际像素是不一样的,所以在某些分辨率下,界面效果宽度可能不合适。它可能太宽或太窄。这时候就需要调整宽度。那么,就需要编写媒体查询代码了。设计一个rem值。不过这里的mediaquery有7种,css中有很多size相关的属性。不确定哪个属性不适合哪个分辨率范围。最终,会导致编写大量的媒体查询来适应所有设备。而且写的时候rem要根据某个分辨率html的font-size来计算,这个计算不一定每次都那么容易,比如40px/23.5px,这个rem值是计算不出来的!由此可见麻烦有多大。(2)上面代码给出的7个范围下的font-size可能不合适,这7个范围也不一定合适。其实可能没有那么多,所以找出这几个范围,每个范围最合适的font-size也是很麻烦的(3)设计稿上标注了resolution。前端将设计稿中每个元素的像素大小转换成rem时,应该以哪个font-size为标准呢??需要写作才能知道。也正是因为上面提到的不足,我觉得这种适配方式不是特别好,写起来也太麻烦了。为了完成工作,我们需要找到更简单、更有效的方法。那么html5应该如何适配众多的移动设备呢?我目前知道的有3种解决方案,将在下面的第2、3和4部分中进行解释。如果大家阅读后有什么想法,欢迎在评论中与我交流。简单的问题和简单的解决方案我觉得有些webapp不一定很复杂,比如拉勾网,你可以看看它的页面在iphone4、iphone6、ipad下是怎样的:imageimageimage它的页面有一个特点,就是:top而无论底部bar的分辨率如何变化,其高度和位置都不会发生变化典型的弹性布局:关键元素的高度、宽度和位置保持不变,只有容器元素在缩放。对于这类app,最好记住一个开发原则:文字流转、控制灵活、图片按比例缩放。一张图描述:imagerule是一套基本的适配规则,对于这个简单的app来说已经足够了,也是后面要讲的rem布局的基础。此外,对于拉钩等应用,可能需要额外的媒体查询来调整小屏幕设备的布局。比如,因为很多设计稿都是基于iphone6的尺寸,而iphone6设备的逻辑像素宽度是375px,而iphone4的逻辑像素是320像素,所以如果你根据设计稿做东西,在iphone4中可能无法显示。比如拉勾网底部的下载框,对比一下就可以看到。Thisis4:imageandthisis6:image6的两边距离比4大很多,也就是说拉钩必须为4做的。已经适配了,这个也可以从中确认code:image但是如果你拿到的是基于4的设计稿,那就没有问题了。分辨率大于4的设备肯定能显示按照4尺寸制作的东西。还有一点,在这种情况下,最好使用px作为css大小单位而不是rem,以避免增加复杂度。网易的做法下面看看网易在不同分辨率下的效果:宽度和高度以及间距。375680明显高于320680导航栏。能达到这个效果的根本原因是网易页面上除了font-size以外的所有css尺寸都是以rem为单位的。比如可以看到导航栏的高度设置代码:image在本文第一部分有提到。使用rem布局结合在html上根据不同的分辨率设置不同的font-size有很多麻烦不好解决。网易是怎么解决的?最根本的原因是网易页面的html的font-size不是通过mediaquery预先定义在css中的,而是js计算出来的,所以当分辨率改变的时候,html的font-size也会改变,但是你有调整分辨率后刷新页面查看效果。看代码就知道为什么font-size直接写在html的style上了(js设置的原因):什么是基于图片的计算,跟设计稿有关系。以网易为例,它的设计稿应该是基于iphone4或者iphone5的,所以它的设计稿竖放时水平分辨率为640px。为了计算方便,以font-size为100px作为参考,那么body元素的宽度可以设置为width:6.4rem,所以html的font-size=deviceWidth/6.4。这个deviceWidth就是viewport设置中的deviceWidth。根据这个计算规则,可以得出这部分开头的四个截图中html的font-size为:deviceWidth=320,font-size=320/6.4=50pxdeviceWidth=375,font-size=375/6.4=58.59375pxdeviceWidth=414,font-size=414/6.4=64.6875pxdeviceWidth=500,font-size=500/6.4=78.125px其实网易就是这么干的,可以看它的代码,width的body元素为:imageaccordingto这可以确定其设计稿的水平分辨率在垂直时为640。然后可以看看当网易分辨率为320680、375680、414680、500680时,html的font-size是否与上面的计算一致:image320*680image375*680image414*680image500*680,deviceWidth是通过document.documentElement传递的。clientWidth是可以获取到的,所以当页面的dom准备好后,首先要做的是:document.documentElement.style.fontSize=document.documentElement.clientWidth/6.4+'px';这个6.4是怎么来的,当然是根据设计稿的水平分辨率/100推导出来的。总结一下网易的做法:(1)将设计稿的垂直水平分辨率除以100得到body元素的宽度:如果设计稿是基于iphone6,水平分辨率为750,body宽度为750/100=7.5rem如果设计稿是基于iphone4/5,横向分辨率为640,机身宽度为640/100=6.4rem(2)layout时,将设计图标注的尺寸划分绘制100得到css中的大小,比如下图:图片播放器的高度为210px。写样式的时候css应该这样写:height:2.1rem。之所以以100为参考,是为了这里计算rem方便!(3)dom准备好后,通过以下代码设置html的font-size:document.documentElement.style.fontSize=document.documentElement.clientWidth/6.4+'px';6.4只是一个例子,如果是750的设计稿,应该除以7.5。(4)font-size可能需要额外的媒体查询,font-size不能使用rem,比如网易的设置:复制代码@mediascreenand(max-width:321px){.m-navlist{font-size:15px}}@mediascreenand(min-width:321px)and(max-width:400px){.m-navlist{font-size:16px}}@mediascreenand(min-width:400px){.m-navlist{font-size:18px}}复制代码最后分两种情况说明一下:第一,如果采用网易的话,viewport应该设置如下:
