這裏有一份簡潔的前端知識體系等待你查收,看看吧,會有驚喜哦~若是以爲不錯,懇求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)