本文針對手機設備設計的頁面,並不是兼容全設備的響應式佈局,常見的MobileWeb頁面如H5頁面、手機頁面、WAP頁、webview頁面等等。在不一樣尺寸的手機設備上,頁面「相對性的達到合理的展現(自適應)」或者「保持統一效果的等比縮放(看起來差很少)。css
CRT顯示器html
CSS像素與屏幕像素1:1一樣大小時:前端
瀏覽器窗口寬度必定的狀況下,把頁面放大(Ctrl+),CSS像素(黑色邊框)開始被拉伸,此時1個CSS像素大於1個屏幕像素html5
PPi中的pixel指的是物理(設備)像素。node
ppi是每臺設備的一個定值,一個固定參數,下圖以Samsung Galaxy S4爲例android
ppi太高帶來的問題,相同的圖片素材,ppi越高的設備顯示越小。下圖爲一個分辨率像素在屏幕中的位置css3
因爲這樣的問題存在,高ppi(高清屏)設備下的UI會採起必定的縮放比例,讓文本或素材放大(也就是讓分辨率像素或CSS像素放大),下面是CSS像素和物理像素的比例公式:DevicePixelRatio是手機的物理像素與實際使用像素的縮放比(會隨着手機默認縮放比和人爲縮放瀏覽器頁面改變))git
DevicePixelRatio定義以下: window.devicePixelRatio = physical pixels / dips(device-independent pixels即CSS像素)
經過CSS參考像素能夠計算出在不一樣的設備上使用合適的CSS像素大小,使得視覺上一致。
github
那麼問題來了,如何實踐這個標準呢?經過使用viewportweb
<meta name="viewport">
默認狀況下,手機屏幕以980px去渲染頁面,(下圖圖像爲320px,設備爲iphone4)
此時經過設置渲染寬度爲320px,即爲手機設備的分辨率,此時圖像是充滿整個區域的
下面爲viewport的通常設置
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
另外Viewport還分爲兩種,Layout Viewport和Visual Viewport
[max-]width: 100%
,背景圖像使用background-size
),佈局只針對元素進行。如下圖爲例,分析移動Web開發在頁面架構和佈局的方法及差別性(效果圖爲640px)
device-width
,以較小寬度(如 320px)的視覺稿做爲參照進行佈局代碼段
<meta name="viewport" content="width=device-width,initial-scale=1">
px
便可。head頭部(根據屏幕寬度來動態生成viewport,生成的 viewport 基本是這樣)
<meta name="viewport" content="width=640,initial-scale=0.5,maximum-scale=0.5,minimum-scale=0.5,user-scalable=no">
css style
body { width: 640px; margin: 0 auto; }
縮放失效問題需經過 js 動態設定 initial-scale。
var fixScreen = function() { var metaEl = doc.querySelector('meta[name="viewport"]'), metaCtt = metaEl ? metaEl.content : '', matchScale = metaCtt.match(/initial\-scale=([\d\.]+)/), matchWidth = metaCtt.match(/width=([^,\s]+)/); if ( metaEl && !matchScale && ( matchWidth && matchWidth[1] != 'device-width') ) { var width = parseInt(matchWidth[1]), iw = win.innerWidth || width, ow = win.outerWidth || iw, sw = win.screen.width || iw, saw = win.screen.availWidth || iw, ih = win.innerHeight || width, oh = win.outerHeight || ih, ish = win.screen.height || ih, sah = win.screen.availHeight || ih, w = Math.min(iw,ow,sw,saw,ih,oh,ish,sah), scale = w / width; if ( ratio < 1) { metaEl.content += ',initial-scale=' + ratio + ',maximum-scale=' + ratio + ', minimum-scale=' + scale; } } }
文本折行問題
section, p, div, h1, h2, h3, h4, h5, h6, .fix-break { background: tranparent url('about:blank'); word-break: break-all; }
px
爲單位。代碼段(動態生成 viewport)
不用寫 meta 標籤,該方法mobile-util.js根據 dpr 自動生成,並在 html 標籤中加上 data-dpr 和 font-size 兩個屬性值。一些注意的地方
background-size: contain|cover
來縮放。動態調整 rem 的方法以下:
var fixScreen = function() { var metaEl = doc.querySelector('meta[name="viewport"]'), metaCtt = metaEl ? metaEl.content : '', matchScale = metaCtt.match(/initial\-scale=([\d\.]+)/), matchWidth = metaCtt.match(/width=([^,\s]+)/); if ( !metaEl ) { // REM var docEl = doc.documentElement, maxwidth = docEl.dataset.mw || 750, // 每 dpr 最大頁面寬度 dpr = isIos ? Math.min(win.devicePixelRatio, 3) : 1, scale = 1 / dpr, tid; docEl.removeAttribute('data-mw'); docEl.dataset.dpr = dpr; metaEl = doc.createElement('meta'); metaEl.name = 'viewport'; metaEl.content = 'initial-scale=' + ratio + ',maximum-scale=' + ratio + ', minimum-scale=' + scale; docEl.firstElementChild.appendChild(metaEl); var refreshRem = function() { var width = docEl.getBoundingClientRect().width; if (width / dpr > maxwidth) { width = maxwidth * dpr; } var rem = width / 16; docEl.style.fontSize = rem + 'px'; }; //... refreshRem(); } }
無需安裝成本,迭代更新容易
移動
經常使用方案rem
和px
。原生Android下中文字體與英文字體都選擇默認的無襯線字體
body { font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif; }
設置全局的CSS樣式,避免圖中的長按彈出菜單與選中文本的行爲
a, img { -webkit-touch-callout: none; /* 禁止長按連接與圖片彈出菜單 */ } html, body { -webkit-user-select: none; /* 禁止選中文本(如無文本選中需求,此爲必選項) */ user-select: none; }
瀏覽器兼容性:
BrowserSync 同步操做
- 使用node.js command prompt 安裝BrowserSync
- 在node.js command prompt 在要建立服務器的目錄下面執行:browser-sync start --server --files="*" 命令便可,表示建立一個服務器並監聽該目錄下的文件變更
- 讓手機與電腦處於同一局域網下,可使用電腦分享熱點手機鏈接(如360無線wifi + 網卡)