这里有一份简洁的前端知识体系等待你查收,看看吧,会有惊喜哦~若是以为不错,恳求star哈~javascript
一直以来移动端适配即是困扰本身的一个难题,今天休息,查阅了不少资料将其整理出来。本文中不少作法是直接借鉴了网上的文章,主要有从网易与淘宝的font-size思考前端设计稿与工做流跟手机端页面自适应解决方案—rem布局进阶版(附源码示例),向大神致谢。css
设备 | 屏幕尺寸 | 逻辑分辨率(pt) | Reader | 物理分辨率(px) |
---|---|---|---|---|
iPhone 3GS | 3.5寸 | 320*480 | @1x | 320*480 |
iPhone 4/4S | 3.5寸 | 320*480 | @2x | 640*960 |
iPhone 5/5S/5C | 4.0寸 | 320*568 | @2x | 640*1136 |
iPhone 6/6S | 4.7寸 | 375*667 | @2x | 750*1134 |
iPhone 6/6S Plus | 5.5寸 | 414*736 | @3x | 1242*2208 |
小结:pt与px的关系是,一个单位的pt里包含几个px,包含的px越多,则越清晰。但由于人视网膜的关系,最多只能识别单位pt里2个像素点,大于2个像素点,人眼识别不出,因此6plus看上去不会比6更清晰。html
移动端web开发的难点之一是适应各类分辨率的移动设备——众所周知,应该使用rem。 但实际操做中,如何肯定html上的font-size,是一个难点。通常有如下几种方式:前端
html{font-size:10px}
@media screen and (min-width:321px) and (max-width:375px){html{font-size:11px}}
@media screen and (min-width:376px) and (max-width:414px){html{font-size:12px}}
@media screen and (min-width:415px) and (max-width:639px){html{font-size:15px}}
@media screen and (min-width:640px) and (max-width:719px){html{font-size:20px}}
@media screen and (min-width:720px) and (max-width:749px){html{font-size:22.5px}}
@media screen and (min-width:750px) and (max-width:799px){html{font-size:23.5px}}
@media screen and (min-width:800px){html{font-size:25px}}
复制代码
用CSS3媒体查询明显不足有:java
小结:CSS3媒体查询理论上能够,但操做起来不灵活git
有些web app比较简单,记住一个开发原则就好:文字流式,控件弹性,图片等比缩放。以图描述: github
网易的页面复杂度较高,随着分辨率增大,网易页面的效果也会发生明显变化,要达到这种效果,就须要使用rem做为单位,且html的font-size是经过js计算出来的。 网易移动web的工做流能够总结以下:web
<meta name="viewport" content="initial-scale=1,maximum-scale=1, minimum-scale=1">
sass
网易网页的设计稿是基于iphone6/6S,物理分辨率(设计稿宽度)为750px,逻辑分辨率(deviceWidth)为375。 为了计算方便,先拿设计稿竖着的横向分辨率除以100获得body元素的宽度:750 / 100 = 7.5rem
同理,布局时页面上的元素的尺寸,能够拿设计图标注的尺寸除以100获得。bash
document.documentElement.style.fontSize = document.documentElement.clientWidth / 7.5 + 'px';
复制代码
之因此这么干,是由于当deviceWidth大于640时,则物理分辨率大于1280,应该去访问pc网站了。只需将第三步作下调整便可。
var deviceWidth = document.documentElement.clientWidth;
if(deviceWidth > 640) deviceWidth = 640;
document.documentElement.style.fontSize = deviceWidth / 6.4 + 'px';
复制代码
网页上有一些结构是不须要随着屏幕变大而相应调整,好比底部导航栏,此时可使用媒体查询。
一般咱们采用以下代码设置viewport:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
复制代码
这样整个网页在设备内显示时的页面宽度就会等于设备逻辑像素大小,也就是device-width。这个device-width的计算公式为:设备的物理分辨率/(devicePixelRatio * scale)
devicePixelRatio称为设备像素比,每款设备的devicePixelRatio都是已知,而且不变的,目前高清屏,广泛都是2,不过还有更高的,好比2.5,3等。淘宝触屏版布局的前提就是viewport的scale根据devicePixelRatio动态设置.
这么作目的是为了保证页面的大小与设计稿保持一致,好比若是是750的横向物理分辨率,那么实际页面的device-width也等于750。
接下来要解决的问题是: 元素的尺寸该如何计算,好比说设计稿上某一个元素的宽为150px,换算成rem应该怎么算呢?这个值等于设计稿标注尺寸/该设计稿对应的html的font-size
。拿淘宝来讲的,他们用的设计稿是750的,因此html的font-size就是75,若是某个元素时150px的宽,换算成rem就是150 / 75 = 2rem。
var scale = 1 / devicePixelRatio;
document.querySelector('meta[name="viewport"]').setAttribute('content','initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
复制代码
document.documentElement.style.fontSize = document.documentElement.clientWidth / 10 + 'px';
复制代码
由于第一步已经根据devicePixelRatio动态设置scale,此时device-width便等于页面的横向物理分辨率(document.documentElement.clientWidth),也就是设计稿的的横向物理分辨率。 淘宝的作法是,设计稿是750,那么html的font-size就是75。
布局的时候,各元素的css尺寸 = 设计稿标注尺寸/设计稿横向分辨率/10 = 设计稿标注尺寸/html的font-size
共同点:
不一样点
'use strict';
/**
* @param {Boolean} [normal = false] - 默认开启页面压缩以使页面高清;
* @param {Number} [baseFontSize = 100] - 基础fontSize, 默认100px;
* @param {Number} [fontscale = 1] - 有的业务但愿能放大必定比例的字体;
*/
const win = window;
export default win.flex = (normal, baseFontSize, fontscale) => {
const _baseFontSize = baseFontSize || 100;
const _fontscale = fontscale || 1;
const doc = win.document;
const ua = navigator.userAgent;
const matches = ua.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i);
const UCversion = ua.match(/U3\/((\d+|\.){5,})/i);
const isUCHd = UCversion && parseInt(UCversion[1].split('.').join(''), 10) >= 80;
const isIos = navigator.appVersion.match(/(iphone|ipad|ipod)/gi);
let dpr = win.devicePixelRatio || 1;
if (!isIos && !(matches && matches[1] > 534) && !isUCHd) {
// 若是非iOS, 非Android4.3以上, 非UC内核, 就不执行高清, dpr设为1;
dpr = 1;
}
const scale = normal ? 1 : 1 / dpr;
let metaEl = doc.querySelector('meta[name="viewport"]');
if (!metaEl) {
metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
doc.head.appendChild(metaEl);
}
metaEl.setAttribute('content', `width=device-width,user-scalable=no,initial-scale=${scale},maximum-scale=${scale},minimum-scale=${scale}`);
doc.documentElement.style.fontSize = normal ? '50px' : `${_baseFontSize / 2 * dpr * _fontscale}px`;
};
复制代码
与上述淘宝的原理一致。 动态设置 html 的font-size, 同时根据设备DPR调整页面的缩放值,此时device-width便等于页面的横向物理分辨率(document.documentElement.clientWidth),也就是设计稿的的横向物理分辨率。
此方案也是默认 1rem = 100px,布局时,根据设计稿尺寸/100便可获得物理分辨率的尺寸
flex(false, 100, 1)
修改为flex(false, 66.66667, 1)