摘要:移動端手機端頁面自適應解決方案布局假設設計妹妹給我們的設計稿尺寸為。
移動端(手機端)頁面自適應解決方案—rem布局
假設設計妹妹給我們的設計稿尺寸為750 * 1340。結合網易、淘寶移動端首頁html元素上的動態font-size屬性、設計稿尺寸、前端與設計之間協作流程一般分為下面兩種:
一、網易做法:引入:頁面開頭處引入下面這段代碼,用于動態計算font-size
(function(doc, win) { var docEl = doc.documentElement, isIOS = navigator.userAgent.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), dpr = isIOS ? Math.min(win.devicePixelRatio, 3) : 1, dpr = window.top === window.self ? dpr : 1, //被iframe引用時,禁止縮放 dpr = 1, scale = 1 / dpr, resizeEvt = "orientationchange" in window ? "orientationchange" : "resize"; docEl.dataset.dpr = dpr; var metaEl = doc.createElement("meta"); metaEl.name = "viewport"; metaEl.content = "initial-scale=" + scale + ",maximum-scale=" + scale + ", minimum-scale=" + scale; docEl.firstElementChild.appendChild(metaEl); var recalc = function() { var width = docEl.clientWidth; if (width / dpr > 750) { width = 750 * dpr; } // 乘以100,px : rem = 100 : 1 docEl.style.fontSize = 100 * (width / 750) + "px"; }; recalc() if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); })(document, window);使用:
未引入前:
body { width: 750px; height: 640px; }
引入后:除以100并將px換成rem
body { width: 7.5rem; height: 6.4rem; }
換算的依據:
// 乘以100,px : rem = 100 : 1 var recalc = function() { var width = docEl.clientWidth; if (width / dpr > 750) { width = 750 * dpr; } // 乘以100,px : rem = 100 : 1 docEl.style.fontSize = 100 * (width / 750) + "px"; };二、淘寶做法(推薦做法,尤其是app內嵌頁面):
引入:頁面開頭處引入下面這段代碼,用于動態計算font-size,或者多帶帶放入一個文件,引入文件也可以
; (function(win, lib) { var doc = win.document; var docEl = doc.documentElement; var metaEl = doc.querySelector("meta[name="viewport"]"); var flexibleEl = doc.querySelector("meta[name="flexible"]"); var dpr = 0; var scale = 0; var tid; var flexible = lib.flexible || (lib.flexible = {}); if (metaEl) { var match = metaEl.getAttribute("content").match(/initial-scale=([d.]+)/); if (match) { scale = parseFloat(match[1]); dpr = parseInt(1 / scale); } } else if (flexibleEl) { var content = flexibleEl.getAttribute("content"); if (content) { var initialDpr = content.match(/initial-dpr=([d.]+)/); var maximumDpr = content.match(/maximum-dpr=([d.]+)/); if (initialDpr) { dpr = parseFloat(initialDpr[1]); scale = parseFloat((1 / dpr).toFixed(2)); } if (maximumDpr) { dpr = parseFloat(maximumDpr[1]); scale = parseFloat((1 / dpr).toFixed(2)); } } } if (!dpr && !scale) { var isAndroid = win.navigator.appVersion.match(/android/gi); var isIPhone = win.navigator.appVersion.match(/iphone/gi); var devicePixelRatio = win.devicePixelRatio; if (isIPhone) { // iOS下,對于2和3的屏,用2倍的方案,其余的用1倍方案 if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) { dpr = 3; } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) { dpr = 2; } else { dpr = 1; } } else { // 其他設備下,仍舊使用1倍的方案 dpr = 1; } scale = 1 / dpr; } docEl.setAttribute("data-dpr", dpr); if (!metaEl) { metaEl = doc.createElement("meta"); metaEl.setAttribute("name", "viewport"); metaEl.setAttribute("content", "initial-scale=" + scale + ", maximum-scale=" + scale + ", minimum-scale=" + scale + ", user-scalable=no"); if (docEl.firstElementChild) { docEl.firstElementChild.appendChild(metaEl); } else { var wrap = doc.createElement("div"); wrap.appendChild(metaEl); doc.write(wrap.innerHTML); } } function refreshRem() { var width = docEl.getBoundingClientRect().width; // 適配平板 if (width / dpr > 540) { width = 540 * dpr; } var rem = width / 10; docEl.style.fontSize = rem + "px"; flexible.rem = win.rem = rem; } win.addEventListener("resize", function() { clearTimeout(tid); tid = setTimeout(refreshRem, 300); }, false); win.addEventListener("pageshow", function(e) { if (e.persisted) { clearTimeout(tid); tid = setTimeout(refreshRem, 300); } }, false); if (doc.readyState === "complete") { doc.body.style.fontSize = 12 * dpr + "px"; } else { doc.addEventListener("DOMContentLoaded", function(e) { doc.body.style.fontSize = 12 * dpr + "px"; }, false); } refreshRem(); flexible.dpr = win.dpr = dpr; flexible.refreshRem = refreshRem; flexible.rem2px = function(d) { var val = parseFloat(d) * this.rem; if (typeof d === "string" && d.match(/rem$/)) { val += "px"; } return val; } flexible.px2rem = function(d) { var val = parseFloat(d) / this.rem; if (typeof d === "string" && d.match(/px$/)) { val += "rem"; } return val; } })(window, window["lib"] || (window["lib"] = {}));使用:
未引入前:
body { width: 750px; height: 640px; }
引入后:
@font-size-base: 75; body { width: 750rem/@font-size-base; height: 640rem/@font-size-base; }
換算依據:
function refreshRem() { var width = docEl.getBoundingClientRect().width; // 適配平板 if (width / dpr > 540) { width = 540 * dpr; } var rem = width / 10; docEl.style.fontSize = rem + "px"; flexible.rem = win.rem = rem; }
這邊是用的less,如果您沒有用less,就需要手動計算,當然也可以轉化為px : rem = 100 : 1。
如果想轉化為px : rem = 100 : 1,可以修改上面的refreshRem函數:
function refreshRem() { var width = docEl.getBoundingClientRect().width // 適配平板 if (width / dpr > 750) { width = 750 * dpr } var rem = 100 * (width / 750) docEl.style.fontSize = rem + "px" flexible.rem = win.rem = rem; }
使用:
未引入前:
body { width: 750px; height: 640px; }
引入后:除以100并將px換成rem
body { width: 7.5rem; height: 6.4rem; }
換算依據就是上面修改的代碼:
function refreshRem() { var width = docEl.getBoundingClientRect().width // 適配平板 if (width / dpr > 750) { width = 750 * dpr } var rem = 100 * (width / 750) docEl.style.fontSize = rem + "px" flexible.rem = win.rem = rem; }
具體實現原理請參照:從網易與淘寶的font-size思考前端設計稿與工作流,寫的很不錯!
希望對需要的朋友有所幫助!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/112811.html
摘要:移動端手機端頁面自適應解決方案布局假設設計妹妹給我們的設計稿尺寸為。 移動端(手機端)頁面自適應解決方案—rem布局 假設設計妹妹給我們的設計稿尺寸為750 * 1340。結合網易、淘寶移動端首頁html元素上的動態font-size屬性、設計稿尺寸、前端與設計之間協作流程一般分為下面兩種: 一、網易做法: 引入:頁面開頭處引入下面這段代碼,用于動態計算font-size (funct...
摘要:使用移動設備查看頁面時會發現,在微信瀏覽器中有頂部導航欄有效解決圖片使用單位邊角缺失的問題前端掘金起因在移動端使用布局時圖片也需要用單位。移動端實踐前端掘金說起,相信大家并不陌生。 Sticky Footer,完美的絕對底部 - 前端 - 掘金寫在前面 做過網頁開發的同學想必都遇到過這樣尷尬的排版問題:在主體內容不足夠多或者未完全加載出來之前,就會導致出現(圖一)的這種情況,原因是因為...
摘要:一定要強制自己用命令行,強制自己學英語,強制自己看文檔。只有這三條都做了,才有可能成為前端水平的程序員。設計師的設計稿寬度需要統一那么相應得,這時會將自動變成寬度為的情況下這樣就無需在手動換算的值了。 CSS9:動態 REM-手機專用的自適應方案 動態 REM是手機專用,是如何適配所有手機的方案,不是響應式方案,例如 : taobao.com 是專門的PC端m.taobao.com 是...
摘要:一定要強制自己用命令行,強制自己學英語,強制自己看文檔。只有這三條都做了,才有可能成為前端水平的程序員。設計師的設計稿寬度需要統一那么相應得,這時會將自動變成寬度為的情況下這樣就無需在手動換算的值了。 CSS9:動態 REM-手機專用的自適應方案 動態 REM是手機專用,是如何適配所有手機的方案,不是響應式方案,例如 : taobao.com 是專門的PC端m.taobao.com 是...
閱讀 3627·2023-04-26 02:32
閱讀 3903·2021-11-23 10:05
閱讀 2291·2021-10-08 10:04
閱讀 2710·2021-09-22 16:06
閱讀 3612·2021-09-22 15:27
閱讀 764·2019-08-30 15:54
閱讀 1697·2019-08-30 13:50
閱讀 2704·2019-08-29 13:56