wap頁面怎么做?
這個問題困擾了我好久,在PC上我們慣用的px
單位在手機上根本不適用,即使我們寫了<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui"/>
防止網頁自動縮放也無濟於事,因為各手機分辨率大小不同。
用百分比布局。寬度自適應做到了但是高度呢,高度也用百分比嗎?難道把元素的高度寫死嗎。這種做法就是jquery mobile
頁面的做法了,大屏手機顯示效果不好看。
用Bootstrap
做柵格化。這種做法有個很大的弊病,小屏隱藏多余的元素來展示頁面,而實際上那些元素你都加載進來了,浪費資源。
前面兩種做法也很難完美還原設計圖的尺寸。那有什么好的辦法呢?
靈活的em與靈活可控的rem
em是相對單位,相對於父級的字號。這里的父級其實指的是祖先級,一直往上哪里定義了字號就相對它,直到根節點html
。
假設它是相對於根節點的,根節點html
的字號一般是16px
,那么1em=16px
、12px=0.75em
,假如在到根節點之前的節點已經有設置過字號了,比如說它設置了2em,那么1em=2em=32px
、0.75em=24px
。
這時候我們就發現坑爹了,假如我們是元素嵌套的,父級上設置了字號,這個單位換算的規則都變了!那怎么辦?
rem也是相對單位,但是它是相對根節點的。這個就好辦了,永遠相對同一個字號,規則就一樣了。假設根節點設置了font-size=16px
那么1em=16px
、12px=0.75em
;假設根節點設置了font-size=32px
那么1em=32px
、0.75em=24px
。不管在哪個地方單位換算的規則都是不會變的。
如何跟設計圖對接
設計圖上的單位是px,我們如何轉換成em呢,難道用計算器嗎?
這里有個單位換算小工具,它是換算em的,但是你也可以用它來換算rem,只要把基礎像素設置成根節點字號就行了。但是基礎像素應該設置成多少呢?
我看了小米的wap頁面,他們做了一個媒體查詢表,根據不同分辨率設置根目錄的字號。這樣就可以實現自適應了!它是直接寫在頁面上,模擬手機看源碼吧view-source:http://m.mi.com/v2.html
。下面是格式化后的部分代碼:
@media only screen and (max-width: 300px) {
html {
font-size: 8.33333px
}
.viewport {
max-width: 300px
}
}
@media only screen and (max-width: 310px) and (min-width: 300px) {
html {
font-size: 8.33333px
}
.viewport {
max-width: 310px
}
}
@media only screen and (max-width: 320px) and (min-width: 310px) {
html {
font-size: 8.61111px
}
.viewport {
max-width: 320px
}
}
@media only screen and (max-width: 350px) and (min-width: 320px) {
html {
font-size: 8.88889px
}
.viewport {
max-width: 350px
}
}
@media only screen and (max-width: 360px) and (min-width: 350px) {
html {
font-size: 9.72222px
}
.viewport {
max-width: 360px
}
}
……
棒棒噠有木有!這時候我們根據這個表來設置基礎像素,比如設計圖的寬度是640px,我們看它這個表,可以看到html對應的font-size
值是17.77778px
,那么基礎像素就是這個值,然后我們根據設計圖量出來的px
長度轉換成em
、rem
單位了!
有沒有更智能的方式?
為什么每次都要通過小工具去換算單位呢,有沒有辦法讓單位自動換算的?
直接用css當然是行不通的,雖然它有calc()
這個屬性,但是兼容性不強。我們配合CSS預編譯
來做呢,less、sass、stylus,不是可以讓css有運算能力嗎。
之后我發現了百度EFE團隊開發的基於less的est框架里面就包含了這功能。
推薦下自己的
第一次用了est,就發現了bug,@margin-rem()
方法用不了,然后我打開它的less源文件想去修改一下的,發現它的實現方式一點都不優雅!主要因為less語言能力太弱了。改好之后又遇到幾個其它方法的坑,遂打算自己寫一個,反正也不難。
我最先嘗試使用sass來寫的。它是基於ruby環境的,這個我就不計較了,反正安裝方式跟node一樣簡單,安裝子。后來發現它竟然不支持正則,還能不能好好玩耍了?
最后就用了先進的stylus。它是基於node環境,適合我們前端的開發環境,不錯。
然后我就模仿了est開發了自己的qst,自我感覺良好,已經在兩個項目中實踐了。
相關鏈接
- 小米wap網站:http://m.mi.com
- 單位換算小工具:http://pxtoem.com/
- qst樣式工具庫:https://github.com/xjchenhao/qst