摘要:移動(dòng)端手機(jī)端頁(yè)面自適應(yīng)解決方案布局假設(shè)設(shè)計(jì)妹妹給我們的設(shè)計(jì)稿尺寸為。
移動(dòng)端(手機(jī)端)頁(yè)面自適應(yīng)解決方案—rem布局
假設(shè)設(shè)計(jì)妹妹給我們的設(shè)計(jì)稿尺寸為750 * 1340。結(jié)合網(wǎng)易、淘寶移動(dòng)端首頁(yè)html元素上的動(dòng)態(tài)font-size屬性、設(shè)計(jì)稿尺寸、前端與設(shè)計(jì)之間協(xié)作流程一般分為下面兩種:
一、網(wǎng)易做法:引入:頁(yè)面開頭處引入下面這段代碼,用于動(dòng)態(tài)計(jì)算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引用時(shí),禁止縮放 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; }
換算的依據(jù):
// 乘以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內(nèi)嵌頁(yè)面):
引入:頁(yè)面開頭處引入下面這段代碼,用于動(dòng)態(tài)計(jì)算font-size,或者多帶帶放入一個(gè)文件,引入文件也可以
; (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下,對(duì)于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 { // 其他設(shè)備下,仍舊使用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; }
換算依據(jù):
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,就需要手動(dòng)計(jì)算,當(dāng)然也可以轉(zhuǎn)化為px : rem = 100 : 1。
如果想轉(zhuǎn)化為px : rem = 100 : 1,可以修改上面的refreshRem函數(shù):
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; }
換算依據(jù)就是上面修改的代碼:
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; }
具體實(shí)現(xiàn)原理請(qǐng)參照:從網(wǎng)易與淘寶的font-size思考前端設(shè)計(jì)稿與工作流,寫的很不錯(cuò)!
希望對(duì)需要的朋友有所幫助!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90102.html
摘要:移動(dòng)端手機(jī)端頁(yè)面自適應(yīng)解決方案布局假設(shè)設(shè)計(jì)妹妹給我們的設(shè)計(jì)稿尺寸為。 移動(dòng)端(手機(jī)端)頁(yè)面自適應(yīng)解決方案—rem布局 假設(shè)設(shè)計(jì)妹妹給我們的設(shè)計(jì)稿尺寸為750 * 1340。結(jié)合網(wǎng)易、淘寶移動(dòng)端首頁(yè)html元素上的動(dòng)態(tài)font-size屬性、設(shè)計(jì)稿尺寸、前端與設(shè)計(jì)之間協(xié)作流程一般分為下面兩種: 一、網(wǎng)易做法: 引入:頁(yè)面開頭處引入下面這段代碼,用于動(dòng)態(tài)計(jì)算font-size (funct...
摘要:使用移動(dòng)設(shè)備查看頁(yè)面時(shí)會(huì)發(fā)現(xiàn),在微信瀏覽器中有頂部導(dǎo)航欄有效解決圖片使用單位邊角缺失的問題前端掘金起因在移動(dòng)端使用布局時(shí)圖片也需要用單位。移動(dòng)端實(shí)踐前端掘金說起,相信大家并不陌生。 Sticky Footer,完美的絕對(duì)底部 - 前端 - 掘金寫在前面 做過網(wǎng)頁(yè)開發(fā)的同學(xué)想必都遇到過這樣尷尬的排版問題:在主體內(nèi)容不足夠多或者未完全加載出來之前,就會(huì)導(dǎo)致出現(xiàn)(圖一)的這種情況,原因是因?yàn)?..
摘要:一定要強(qiáng)制自己用命令行,強(qiáng)制自己學(xué)英語(yǔ),強(qiáng)制自己看文檔。只有這三條都做了,才有可能成為前端水平的程序員。設(shè)計(jì)師的設(shè)計(jì)稿寬度需要統(tǒng)一那么相應(yīng)得,這時(shí)會(huì)將自動(dòng)變成寬度為的情況下這樣就無需在手動(dòng)換算的值了。 CSS9:動(dòng)態(tài) REM-手機(jī)專用的自適應(yīng)方案 動(dòng)態(tài) REM是手機(jī)專用,是如何適配所有手機(jī)的方案,不是響應(yīng)式方案,例如 : taobao.com 是專門的PC端m.taobao.com 是...
摘要:一定要強(qiáng)制自己用命令行,強(qiáng)制自己學(xué)英語(yǔ),強(qiáng)制自己看文檔。只有這三條都做了,才有可能成為前端水平的程序員。設(shè)計(jì)師的設(shè)計(jì)稿寬度需要統(tǒng)一那么相應(yīng)得,這時(shí)會(huì)將自動(dòng)變成寬度為的情況下這樣就無需在手動(dòng)換算的值了。 CSS9:動(dòng)態(tài) REM-手機(jī)專用的自適應(yīng)方案 動(dòng)態(tài) REM是手機(jī)專用,是如何適配所有手機(jī)的方案,不是響應(yīng)式方案,例如 : taobao.com 是專門的PC端m.taobao.com 是...
閱讀 1918·2021-11-22 09:34
閱讀 1158·2021-10-09 09:44
閱讀 3046·2021-09-29 09:35
閱讀 3626·2021-09-14 18:01
閱讀 1494·2021-08-16 10:49
閱讀 1096·2019-08-29 14:11
閱讀 859·2019-08-29 12:47
閱讀 3081·2019-08-26 13:47