再聊移動端頁面適配,rem和vw適配方案卵史!

現(xiàn)在回過頭來看战转,感覺自己以前寫復(fù)雜了,其實(shí)道理很簡單以躯;

就是利用vw槐秧,rem隨屏幕,或者跟字體正比變化的特性忧设;

1.就是開發(fā)的時(shí)候用的750設(shè)計(jì)稿的尺寸刁标;單位是px;

2.然后編譯工具址晕,如postcss 會自動將px單位轉(zhuǎn)成對應(yīng)rem和vw單位膀懈;

3.如果是vw很好轉(zhuǎn)轉(zhuǎn)行,比如寫的40px谨垃;40/750 vw就完了启搂;

4.如果是rem就多一步罷了;要用js計(jì)算出根字體大小刘陶,并設(shè)置給html胳赌;

正常是 375 ,16px;所以比例常數(shù)就是 :? ? 屏幕尺寸/750*32 匙隔,也就是html?根字體?大幸缮弧;

e.g : postcss將40px轉(zhuǎn)化成rem單位纷责; 1rem/(屏幕尺寸/750*32) = x/40

x 就等于 40/(屏幕尺寸/750*32)? ?rem;

動態(tài)改變(屏幕尺寸/750*32) 這個(gè)?根字體?就可以動態(tài)適應(yīng)屏幕了捍掺!


看了一周的rem手機(jī)適配方案;搞的腦殼痛碰逸;現(xiàn)在總于搞明白了乡小!建議一次性看完本片文章再去百度相關(guān)知識點(diǎn)!不要離開饵史!


基礎(chǔ)點(diǎn):rem相對根節(jié)點(diǎn)<html>字體的大小满钟。所以不用px;

根字體:<html>字體的大小px;

px:你就當(dāng)成cm(厘米)這樣的東西吧;

基準(zhǔn):750設(shè)計(jì)稿胳喷;


這是方案的基礎(chǔ)理論湃番,在這個(gè)基礎(chǔ)上,我們還要搞明白吭露,到底要干一件什么事情吠撮!

目標(biāo)一 、手機(jī)適配:就是頁面上的尺寸讲竿,無論高度泥兰,還是寬度弄屡,還有字體,隨屏幕的寬度變化鞋诗!這里是屏幕寬度膀捷!是不是想到了vw,對削彬,就是這個(gè)意思全庸;——最大程度在各個(gè)尺寸屏幕上還原設(shè)計(jì)稿

目標(biāo)二、px轉(zhuǎn)換成rem:一般UI給的設(shè)計(jì)稿寬度大小是750融痛,所以壶笼,我們想直接寫上面UI標(biāo)記的尺寸;——最大程度減少工作

為什么選擇rem?

很久之前沒有vw雁刷,怕vw的兼容問題覆劈,就用了rem;也就是:rem的兼容性>vw的兼容性安券;(vw的適配方案墩崩!非常簡單!)侯勉;

還有一種就是自己寫百分比,不但要自己算哭铝阐,而且很不優(yōu)雅(我以前就是這樣干的址貌,有時(shí)候?yàn)榱俗尭叨群蛯挾鹊陌俜直纫粯樱疫€把高度寫成0徘键,{padding:40%,width:40%,height:0})练对。



一、理論基礎(chǔ)吹害!

實(shí)現(xiàn)目標(biāo)一

用rem就可以了吧螟凭!因?yàn)閞em就可以隨根字體大小改變而改變,從而實(shí)現(xiàn)了自適應(yīng)的功能它呀。

但是螺男,但是,重點(diǎn)來纵穿,如果下隧,根字體的大小默認(rèn)是16px;那么谓媒,我們的1rem淆院;就永遠(yuǎn)是16px,懂么句惯?也就是如果設(shè)計(jì)稿是750(放大了一倍土辩,iphone是375pt),我們想要個(gè)50%的大小:

? ? 50%*357px/16=11.718rem(這里還要自己換算支救,要哭)

如果我們寫一個(gè)11.718rem的寬度,然而這只能在能iphone6還原設(shè)計(jì)稿拷淘,也就是只有在iphone6上這樣的寬度才剛好占一半各墨;

那么問題來了,如果在每個(gè)屏幕上都是50%呢辕棚,直接改變根字體大杏鳌(16px)不就完了么!J藕俊扁瓢;11.718rem永遠(yuǎn)還是那個(gè)11.718rem,不用擔(dān)心补君;

實(shí)現(xiàn)目標(biāo)二引几、

用工具,webpack挽铁,postcss,postcss-pxtorem

二伟桅、準(zhǔn)備主要工具!

viewport: 建議自行百度叽掘;

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

vue-cli: 用這個(gè)主要是用webpack,這個(gè)構(gòu)建工具大大降低了webpack的使用難度;快速構(gòu)建出一個(gè)前端項(xiàng)目楣铁。(親測,真的很快)更扁;

postcss:? 官網(wǎng)解釋:PostCSS is a tool for transforming styles with JS plugins盖腕,就是postcss用js插件幫你轉(zhuǎn)換css樣式的一個(gè)工具。比如浓镜,這里的把你的文件里面16px替換成1rem(根大小默認(rèn)16px的情況)溃列;這樣你就不用自己去算了!

postcss-pxtorem:? postcss的一個(gè)插件膛薛,主要是幫你把px轉(zhuǎn)換成對應(yīng)的rem听隐;

然后:還要用js代碼去動態(tài)算根目錄應(yīng)該有的字體大小,反正就是一段js代碼去動態(tài)獲取屏幕寬度哄啄!

超級麻煩的一種方案推薦:(可以自己用淘寶彈性布局方案lib-flexible實(shí)踐; 或者看flexible.js 移動端自適應(yīng)方案 - 簡書雅任;其實(shí)這js的作用就是幫你根據(jù)屏幕大小——動態(tài)改變根字體大小和data-dpr值!但是rem的值還是要你自己算哦增淹,或者用其他工具4环谩)

三、rem——開始干虑润!

第一步成玫,先用vue-cli快速構(gòu)建出一個(gè)項(xiàng)目,然后,安裝postcss哭当,postcss-pxtorem猪腕,postcss-loader,postcss-import钦勘,postcss-url陋葡;看不懂的同學(xué)看這個(gè)吧(如何在Vue項(xiàng)目中使用vw實(shí)現(xiàn)移動端適配(轉(zhuǎn)) - 簡書

第二步,在項(xiàng)目根目錄下添加.postcssrc.js文件彻采,在里面寫上

module.exports = { plugins: { 'postcss-pxtorem': { rootValue: 32, propList: ['*'], minPixelValue: 2 } }};

就完了腐缤。簡單解釋下,免得你們百度半天肛响,建議自己在npm官網(wǎng)上看postcss-pxtorem的文檔岭粤。rootValue,這里就是根目錄的字體大小是32px特笋,這里為啥設(shè)置成32呢剃浇,因?yàn)橐话阍O(shè)計(jì)稿是750,比iphone6的大一倍猎物,所以設(shè)置成16的兩倍虎囚,就是32px;proplist就是那些屬性需要轉(zhuǎn)換成rem,這里是全部的意思蔫磨;

比如你可選擇設(shè)置淘讥; propList: ['font', 'font-size', 'line-height', 'letter-spacing']

minPixelValue就是最小轉(zhuǎn)換單位,這是最小轉(zhuǎn)換單位是2px的意思堤如;

第三步适揉,動態(tài)設(shè)置根字體大小煤惩!一段簡單的js插入在head里面;

(function() {

? ? function autoRootFontSize() {

? ? ? ? document.documentElement.style.fontSize =? ? ? ? Math.min(screen.width,document.documentElement.getBoundingClientRect().width)? /? 750 * 32 + 'px';

? ? ? ? ? // 取screen.width和document.documentElement.getBoundingClientRect().width的最小值炼邀;除以750魄揉,乘以32;懂的起撒拭宁,就是原本是750大小的32px;如果屏幕大小變成了375px,那么字體就是16px;也就是根字體fontSize大小和屏幕大小成正比變化洛退!是不是很簡單

? ? }

? ? window.addEventListener('resize', autoRootFontSize);

? ? autoRootFontSize();

})();

? ? 這里,我想說的是完全可以用vw去設(shè)置根字體大小杰标,26px/375px=4.267vw;就不用js去算了兵怯!

????????html{font-size:4.267vw};? //因?yàn)檫@個(gè)字體大小完全是隨屏幕正比變化;


四腔剂、vw——開始干媒区!

vw的方案就簡單多了,因?yàn)関w本來就相對屏幕的百分比,所以我們不用再去動態(tài)的改變根字體大小了袜漩,只需要把750上的px大小轉(zhuǎn)換成對應(yīng)的vw值就完了绪爸,這一步交給postcss工具就可以!

所以只需要兩步宙攻!

第一步奠货,先用vue-cli快速構(gòu)建出一個(gè)項(xiàng)目,然后座掘,安裝postcss递惋,postcss-pxtorem,postcss-loader溢陪,postcss-import萍虽,postcss-url;看不懂的同學(xué)看這個(gè)吧(如何在Vue項(xiàng)目中使用vw實(shí)現(xiàn)移動端適配(轉(zhuǎn)) - 簡書

第二步嬉愧,在項(xiàng)目根目錄下添加.postcssrc.js文件贩挣,在里面寫上

module.exports = { "plugins": { "postcss-import": {}, "postcss-url": {}, "postcss-aspect-ratio-mini": {}, "postcss-write-svg": { utf8: false }, "postcss-cssnext": {}, "postcss-px-to-viewport": { viewportWidth: 750, unitPrecision: 3, viewportUnit: 'vw', selectorBlackList: ['.ignore', '.hairlines'], minPixelValue: 1, mediaQuery: false }, "postcss-viewport-units": {}, }}

viewportWidth是你設(shè)計(jì)稿的大小750,然后unitPrecision是vw值保留的小數(shù)點(diǎn)個(gè)數(shù)没酣;

五王财、騷做總結(jié)!

是不是看完腦殼昏戳戳的裕便!那就對了~

首先明白一件事:px就像cm一樣绒净,1px永遠(yuǎn)是1px;1cm永遠(yuǎn)是1cm;

那么我們從目標(biāo)再反推一道邏輯:

我們想要的結(jié)果很簡單:? 一個(gè)元素的寬度(px)? /? 屏幕寬度(px)? =? ? 定值 ? (這個(gè)定值就是設(shè)計(jì)稿上面的值比例定值)偿衰;

——所以要做就是:屏幕變寬挂疆,要讓元素寬度就變寬。

然鵝下翎,我們寫的代碼里面的px是不可能變的(取的750設(shè)計(jì)稿上面的尺寸)缤言;那么postcss編譯出來的rem值也是不變的;

我們是怎么把設(shè)計(jì)稿里面的40px換算成相應(yīng)rem的呢视事;你只要記住根字體大小的值(瀏覽器的默認(rèn)是16px胆萧,現(xiàn)在設(shè)置成的32px)就是1rem;這交給工具同一去算俐东;

得到:元素的寬度(px)? = 元素的寬度(rem)? ??32;? 所以這個(gè)32是你必須要設(shè)置在postcss-pxtorem里面的跌穗;這樣它就可以幫你算;

又因?yàn)椋? 元素的寬度(rem) ?? 根字體大新脖琛(px)? =? 元素的寬度(px)?

元素的寬度(px) 變大蚌吸,? 元素的寬度(rem) 不變,那就只有改變根字體大衅鲎(px) 羹唠,變大奕枢;具體怎么變,上面的js代碼已經(jīng)解釋了肉迫;

——所以我們做的就是:屏幕變寬验辞,讓根字體大小(px) 變寬喊衫,元素寬度就變寬跌造。

750屏幕下是寫的樣式大小是1:1,? 所以

又因?yàn)槲覀兿胍?i>:根字體大小(px)? /? 屏幕寬度(px)? =? 32 / 750? ?

所以: 根字體大凶骞骸(px)? =? 32 / 750? ?? 屏幕寬度(px)?


一個(gè)元素的寬度(px)? /? 屏幕寬度(px)? =? ? 定值

→? 根字體大锌翘啊(px) ??元素的寬度(rem)/? 屏幕寬度(px)

→? ? 32 / 750? ?? 屏幕寬度(px)? ??元素的寬度(rem)/? 屏幕寬度(px)? 等于什么?寝杖?

得到的的是一個(gè)與屏幕大小無關(guān)的定值违施!


化簡:? 元素的寬度(rem)??32? / 750? =? 元素的寬度(px)? /? ? 750? ? ——不就是設(shè)計(jì)稿上面的比例么!I弧磕蒲!


驗(yàn)證以上操作出來的結(jié)果是否符合預(yù)期也很簡單:

比如一個(gè)img的寬箫津,高蜘醋,在iphone6上的尺寸(審查元素的大形蹇濉开缎!px單位):

根字體:16px; postcss算出來的rem值是2.5rem;? ? 2.5*16=40px;? ? 實(shí)際上也是40px;

——得到元素實(shí)際大小 40??40(px),? 屏寬是375;比例是40/375=0.10667;

在iphone5上的尺寸(審查元素的大懈苋恕些侍!px單位):

根字體:13.6533px; postcss算出來的rem值是2.5rem;? ? 2.5*13.6533=34.13px;? ? 實(shí)際上也是34.13px;

——得到元素實(shí)際大小 34.13??34.13(px),? 屏寬是320苛预;比例是34.13/320=0.10665;

完美適配孵稽!



完結(jié)许起!

參考鏈接

如何在Vue項(xiàng)目中使用vw實(shí)現(xiàn)移動端適配_vw, Layout, 布局, Vue, mobile 教程_w3cplus

使用Flexible實(shí)現(xiàn)手淘H5頁面的終端適配_雙11前端技術(shù)連載, Layout, mobile 教程_w3cplus

再聊移動端頁面的適配_Layout, 布局, mobile, CSS 教程_w3cplus

參考鏈接這么健全,為啥我還要寫菩鲜。因?yàn)橐婚_始我浪費(fèi)了大量時(shí)間去研究一些無關(guān)知識园细!

就拿px像素,這個(gè)知識點(diǎn)來說接校,我都差點(diǎn)成為像素設(shè)備研究磚家了珊肃,什么物理像素,設(shè)備像素馅笙,設(shè)備獨(dú)立像素,CSS像素厉亏,設(shè)備像素比(device pixel ratio)......!人格都搞分裂了董习!

當(dāng)然最重要的是,分享的鏈接要付費(fèi)爱只!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皿淋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窝趣,老刑警劉巖疯暑,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哑舒,居然都是意外死亡妇拯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門洗鸵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來越锈,“玉大人,你說我怎么就攤上這事膘滨「势荆” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵火邓,是天一觀的道長丹弱。 經(jīng)常有香客問我,道長铲咨,這世上最難降的妖魔是什么躲胳? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鸣驱,結(jié)果婚禮上泛鸟,老公的妹妹穿的比我還像新娘。我一直安慰自己踊东,他們只是感情好北滥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闸翅,像睡著了一般再芋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坚冀,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天济赎,我揣著相機(jī)與錄音,去河邊找鬼记某。 笑死司训,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的液南。 我是一名探鬼主播壳猜,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滑凉!你這毒婦竟也來了统扳?” 一聲冷哼從身側(cè)響起喘帚,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咒钟,沒想到半個(gè)月后吹由,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朱嘴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年倾鲫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腕够。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡级乍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帚湘,到底是詐尸還是另有隱情玫荣,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布大诸,位于F島的核電站捅厂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏资柔。R本人自食惡果不足惜焙贷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贿堰。 院中可真熱鬧辙芍,春花似錦、人聲如沸羹与。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纵搁。三九已至吃衅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腾誉,已是汗流浹背徘层。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留利职,地道東北人趣效。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像猪贪,于是被迫代替她去往敵國和親英支。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353