在viewport 等比適配始末 說過使用 viewport 來實現等比適配的例子,本文詳解等比適配的另一種方式拿到乙個寬度為 vwidth 的視覺稿
設裝置螢幕寬度為 dwidth
在視覺稿上量得乙個元素的寬度為 elevwidth
那麼要實現按照寬度等比適配,在各種裝置中元素的實際寬度 x 將滿足公式
//等比
elevwidth/vwidth = x/dwidth;
//我們的目的是求x
x = (elevwidth/vwidth)dwidth;複製**
拿到視覺稿之後,elevwidth 和 vwidth 都已經固定了,但是 dwidth 在不同的裝置中確實不同的,而且需要實際執行的時候我們才能拿到 dwidth,這個時候就要利用 rem 的特性了,我們通過阻塞執行的 js 動態設定 rem,使得rem=dwdith/10
,套入剛才的公式:
x=(elevwidth/vwidth)*10*rem
//體現在css中
.classname 複製**
為什麼設定是 dwdith/10 呢?方便計算而已,當然也可以除以別的基數,但是盡量不要讓 rem 太小,有相容性問題這段 css 需要放在 body 標籤的開始位置,因為 rem 值要盡可能早的設定成功,避免無謂的重排重繪(有些裝置中若元素樣式已經生效,動態改變 rem 未必能起作用,所以這個動作更需要提前)
(function()
// 設定 data-dpr 屬性,留作的 css hack 之用
html.setattribute('data-dpr', dpr);
// 安卓平台額外加上標記類
if (isandorid)
})();
script>
...複製**
如果每在視覺稿上量出乙個值,在寫到樣式檔案之前都得通過那個公式計算一翻,那絕對不是乙個好策略,我們希望量到啥就寫啥使用 less,sass 等 css 預處理器的函式
//設計稿為640
@function
rem($val)
//設計稿為750
@function
rem750($val)
//使用
.classname 複製**
也可以使用 webpack-loader,例如:change-rem-loader,這個 loader **做的事也是上述的轉化計算(寫乙個 webpack loader 並不複雜,你可以自己寫乙個符合自己情況的 loader)
'use strict';
module.exports = function(source)
return (value / divval).tofixed(6) + 'rem';
});return source;
}複製**
這樣之後,我們 css 同樣可以這樣寫(如何讓 loader 起作用不是本文的範圍)
.classname 複製**
也許你的工程技術棧裡面,使用的不是 webpack,也沒有使用 less、sass 等預處理器,那你可以根據你的實際情況去尋找一種預處理方案,只要達到推導公式的效果就可以了。期待您的關注~~什麼?沒有合適的方案,那你是時候充充電了
rem動態適配
function doc,win if doc.addeventlistener return win.addeventlistener resizeevt,recalc,false doc.addeventlistener domcontentloaded recalc,false documen...
移動端rem適配
3 使用js 將設計圖劃分為10等份或者15等份。新建common.less檔案,這是乙個專門來適配的檔案。我們大概可以寫如下的檔案 設定常見的螢幕尺寸 修改裡面的html文字大小 a 一定要寫到最上面 html 我們此次定義的劃分的份數 為 15 no 15 320 media screen an...
rem 適配方案
首先我們要明白,為什麼要用rem單位呢,常用的px不好嗎?原因是如果我們用px作為長度大小單位的話,就無法根據螢幕大小變化實時改變頁面元素的大小,反之,rem就可以做到實時適配。其次,我們也要清楚以rem為單位的元素大小是根據css html根標籤下的文字大小 fontsize 來改變的。在實際開發...