摘要:從概念來說,就是設備的物理像素與設備獨立像素也就是邏輯像素,以下就稱為邏輯像素的比率。通過這個標簽,我們可以實現初始縮放,就可以達到的邏輯像素眼睛在設備上看起來的,換句話說可以在上充滿豎屏的整個寬度。
前言:18年12月24日項目成功上線了,在經歷了兩周的線上bug、UI以及代碼優化后,解決了不少問題,于是再完善與優化一下這個項目。
布局優化
高清配置
antd-mobile 自定義配置
antd-mobile Toast組件封裝
布局優化布局優化在這篇文章完成了 → [移動端優雅布局實踐](),最后我使用的方案是——absolute脫離文檔流(好處是設置容器的height: 100%,可以直接繼承html窗口高度)。
高清配置 問題發現開始項目之前沒有對dpr(device pixel radio)與縮放做過多的了解,在項目開發的時候就將它們都直接寫死為1了。到后來UI驗收的時候發現并沒有實現UI設計師預期的細線效果。我在解決這個問題的時候才去認真看了一下dpr的介紹。這篇詳解dpr的文章寫得還不錯。
從概念來說,dpr就是設備的物理像素與設備獨立像素(也就是css邏輯像素,以下就稱為css邏輯像素)的比率。
比如:iPhone 6的分辨率是750*1334,window.screen.width(css邏輯像素)為375,因此
dpr = 750 /375 = 2
再比如:iPhone X的分辨率是1125*2436,window.screen.width(css邏輯像素)也是375,因此
dpr = 1125 /375 = 3
那么dpr有什么用呢?
在這之前先提一下我們移動端必備的一個meta標簽:
device-width在html中也同樣被解讀為理想(基準)視口的寬度,即320px,375px,414px,這里的px就是指css像素,通常也被稱為邏輯像素;那我們可以認為html中的css像素的顯示尺寸應該和NA中的pt、dp的顯示尺寸相等。
通過這個meta標簽,我們可以實現initial-scale=1初始縮放100%,就可以達到1px的css邏輯像素 = 眼睛在設備上看起來的1px,換句話說body { width: 375px; }可以在iPhone 6上充滿豎屏的整個寬度。
那么問題就來了,如果我們要給一個盒子加上一個1px的細線:
border-bottom: 1px solid red;。那么在iPhone 6上真的是1px嗎?
iPhone 6真機截圖(寬度為702px):
可以看出高度明顯不止1像素。這就是由于dpr造成的,因為iPhone 6的dpr為2,且縮放比例為100%,1px的css渲染出來就是2px物理像素。
這就是我們UI粑粑和產品們不滿意的地方。
那接下來如何去解決這個問題呢?
解決方案根據設備的dpr來動態計算縮放比例,以及根節點的font-size。
// rem.js (function(doc, win) { var docEl = doc.documentElement, dpr = Math.min(win.devicePixelRatio, 3); dpr = window.top === window.self ? dpr : 1; //被iframe引用時,禁止縮放 var 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 + ",user-scalable=no,viewport-fit=cover"; docEl.firstElementChild.appendChild(metaEl); var recalc = function() { var width = docEl.clientWidth; // 大于1280按1280來算 if (width / dpr > 1280) { width = 1280 * dpr; } // px : rem = 100 : 1 docEl.style.fontSize = 100 * (width / 375) + "px"; }; recalc(); if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); })(document, window);
如果有顯示富文本元素,則需要處理富文本元素的樣式
移動端為了適配不同的機型,使用rem為單位是一個不錯的選擇,而且我們也一直在用它。
這里除了根據dpr來計算initial-scale,還調整了根節點的font-size,以至于在縮放的時候能夠還原到視窗大小(因為要縮放,所以要相應的增加rem的基數)。
這樣我們上面寫的border-bottom: 1px solid red;在這個方案顯示出來就是這樣的:
哇咔咔,可以看出明顯變細了,這才是我們UI粑粑們想要的O(∩_∩)O~~
但是這樣的設置在結合ant-design-mobile的時候,發現ant-design-mobile的組件都被縮小了。原來是,它的元素都是以px為單位,而我們縮放前沒有對它的最小單位乘以相應的基數。那么,我們需要給它配置一個基數!
antd-mobile自定義配置查文檔發現ant-design-mobile提供了主題配置,而且它提供了一個@hd的變量做為長度基本單位,它的默認值是1px。
這個主題配置的文檔是以webpack項目來做的例子。那如何在next.js項目中完成自定義配置呢?
我在next.js的examples中沒有找到我所需要的example,不過找到了兩個相關的例子:一個是with-antd-mobile,一個是with-ant-design-less。第二個是ant-design的自定義主題配置,那應該就可以仿照這個example去增加with-antd-mobile的自定義主題配置。
這里提一下,這個with-antd-mobile在我寫Next框架與主流工具的整合之后更新了next.config.js的配置,這里也改成了最新的配置。
安裝解析 Less 與 normalize.css 的包
npm i @zeit/next-less @zeit/next-css less less-vars-to-js -S
修改.babelrc配置
{ "presets": ["next/babel"], "plugins": [ [ "import", { "libraryName": "antd-mobile", "style": true } ] ] }
修改next.config.js配置
/* eslint-disable */ const withCSS = require("@zeit/next-css"); const withSass = require("@zeit/next-sass"); const withLess = require("@zeit/next-less"); const lessToJS = require("less-vars-to-js"); const fs = require("fs"); const path = require("path"); // Where your antd-custom.less file lives const themeVariables = lessToJS(fs.readFileSync(path.resolve(__dirname, "./antd-custom.less"), "utf8")); // fix: prevents error when .less files are required by node if (typeof require !== "undefined") { require.extensions[".less"] = file => {}; require.extensions[".css"] = file => {}; } module.exports = withCSS( withLess( withSass({ lessLoaderOptions: { javascriptEnabled: true, modifyVars: themeVariables } }) ) );
在項目下新建Less變量文件 antd-custom.less
@hd: 0.01rem;
重啟項目,就大功告成了。
antd-mobile Toast組件封裝antd-mobile的Toast.info()組件在顯示的時候不能點擊背景就消失,與原生的Toast有些差異,為了體驗,這里再做了一層封裝,在點擊背景的時候隱藏Toast。
// utils/toast.js static info = (content, duration, onClose, mask) => { Toast.info(content, duration, onClose, mask); const toastElement = document.getElementsByClassName("am-toast-mask")[0]; toastElement && toastElement.addEventListener("click", () => { Toast.hide(); onClose && onClose(); }); };
antd-mobile的loading圖在Android上有些怪異,這里也自定義了Loading:
static loading = (content, duration, onClose, mask) => { Toast.info(寫在最后, duration, onClose, mask ); };{content}
一個項目需要在不斷的優化與完善中才能變得更好。搭建項目是對一個項目負責人很大的考驗,如果在項目設計的初期有許多的問題沒有考慮到,就很有可能導致優化的時候需要耗費很大的精力。
總之,不要逃避困難與問題,這些都是成長路上不可或缺的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101188.html
摘要:又從開始學習新的東西了,想著還是記錄一下學習歷程,有輸入就要有輸出吧,免得以后給忘記學了些什么框架與主流工具的整合地址首先,項目,學習里面的。如有錯誤和問題歡迎各位大佬不吝賜教輕量級框架與主流工具的整合二完善與優化 前言 老大說以后會用 next 來做一下 SSR 的項目,讓我們有空先學學。又從 0 開始學習新的東西了,想著還是記錄一下學習歷程,有輸入就要有輸出吧,免得以后給忘記學了些...
摘要:為進一步提升我國云計算發展與應用水平,積極搶占信息技術發展的制高點,制定本行動計劃。支持骨干企業及行業協會實質性參與云計算技術管理服務等方面國際標準的制定。二產業發展行動支持軟件企業向云計算轉型。 發文機關:工業和信息化部標 題:工業和信息化部關于印發《云計算發展三年行動計劃(2017-2019年)》的通知?發文字號:工信部信軟〔2017〕49號?成文日期:2017-04-06發布日期:2...
摘要:的網站仍然使用有漏洞庫上周發布了開源社區安全現狀報告,發現隨著開源社區的日漸活躍,開源代碼中包含的安全漏洞以及影響的范圍也在不斷擴大。與應用安全是流行的服務端框架,本文即是介紹如何使用以及其他的框架來增強應用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清單專注...
閱讀 2014·2021-08-21 14:09
閱讀 482·2019-08-30 15:44
閱讀 2107·2019-08-29 16:32
閱讀 1371·2019-08-29 15:36
閱讀 3433·2019-08-29 12:43
閱讀 2776·2019-08-29 11:14
閱讀 430·2019-08-28 18:26
閱讀 2246·2019-08-26 13:57