最近做了個移動頁面的外包,寫下來,頁面布局感覺是比PC頁面簡單一點。
不像PC頁面內容那么多,而且PC端的瀏覽器比較多,這邊的話,我就考慮的比較少。
最后在頁面寫完后自己整理了兩個小插件分別是彈出框zDialog和表單驗證zValidate。
一、640設計稿
1)現在比較流行的做法是按照iPhone 5的尺寸來設計
倍率2,邏輯像素320x568。看到的設計稿的寬度就是640的了,當你在編寫頁面的時候,就要縮小一倍。
邊距寬度等縮小一倍比較精確,但是如果是字體縮小一倍的話,放到手機上面看就不太合適啦,比如16px的,縮小一倍就是8px,有點小了。
自己剛開始寫的時候,不明白這640的意義,就自己在那邊隨便改邊距等,當和設計稿差不多的時候,就好了。
這樣寫出來的跟設計稿是有出入的,等於是否定了設計師的成果。
2)自定義icon字體
移動端,引入的文件最好是小一點,這樣在用2G載入的時候,速度也能快點。
原先我用的字體庫是Font-Awesome,做PC后台的時候,用這個不錯,什么類型的都有了,但是前端頁面最好還是只要需要的。
這次使用了阿里的Iconfont,在這里面可以自己制作字體,並且還有Unicode方式,讓IE6這種低端瀏覽器也來享受自定義字體。

二、穿透層與流布局
1)flex布局
上圖中最后一列有個空白處,而點擊這個空白處就需要能穿透點擊到下面那個列表。
這次地方就需要CSS,pointer-events:none。
其實用到這個屬性也是逼不得已,上面的布局在有頂寬的時候,是很簡單的,float浮動+寬高度定死,寬度只要計算一下就能出來。
但是手機頁面的話,屏幕寬度都是不定的,那么要計算這個寬度的話就太難了,而且還有margin,左右都有,中間也有。
沒辦法就用了個flex布局,這個可以讓瀏覽器自動計算寬度,而且還是讓寬度自動相等。
接着就出現了上面要穿透的問題了。
flex流布局有很多屬性,而我這次在項目中也僅僅是為了方便計算寬度。
/*flexbox布局*/ .flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;} .flex-wrap{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;} .flex-v{-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;} .flex-1{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;} .flex-2{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;} .flex-3{-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;}
2)column屬性
這個是多列布局屬性,上面的城市塊布局,本來是想用這個的,但發現很不合適。
dl { -webkit-column-count:4; -webkit-column-gap: 1px; column-count:4; column-gap: 1px; }
<dl> <dd> <img src="images/city/nanjing.png"/> <p>南京</p> </dd> <dd> <img src="images/city/hefei.png"/> <p>合肥</p> </dd> <dd> <img src="images/city/shanghai.png"/> <p>上海</p> </dd> </dl>
跟我想象中的使用方法不一樣,里面如果是一個標簽的話,比如只要顯示個img標簽,展現的就是流布局
<dl> <img src="images/city/shanghai.png"/> <img src="images/city/shanghai.png"/> </dl>
三、選擇符
寫PC端的時候,用選擇符會很謹慎,萬惡的低版本IE好多選擇符都不支持,而到了移動端,情況就不同啦,好多都能支持。
所以這次我大量使用了選擇符。
偽類選擇符:first-child、:last-child、:last-of-type等用的好多,原先很多列表的最后一個的樣式與其他地方不一樣,要么額外加一個樣式要么用JS控制,現在只要用選擇符就能搞定,代碼的簡潔性也增強了。
1)用偽類美化單選框或多選框


用::before來將原控件蓋住,用圖片替代,在:checked選中后修改圖片,本來這些都是需要配合JS腳本的,現在只用CSS即可。
只是第一次點擊某個多選框的時候,會先隱藏,然后再出現選中圖片,造成一個閃爍。
input[type="checkbox"] { position: absolute; vertical-align: top; margin-top: 4px; margin-left: -20px; visibility:hidden; } input[type="checkbox"]::before { content: ''; background:url('../images/checkbox.png') no-repeat center center; position: absolute; top:-3px;left:-2px; width:18px;height:19px; visibility:visible; } input[type="checkbox"]:checked::before { content: ''; background:url('../images/checkbox_checked.png') no-repeat center center; position: absolute; top:-3px;left:-2px; width:19px;height:19px; visibility:visible; }
2)flex布局與::after配合出現的問題
這個地方為了寬度相等,間距一樣,我使用了flex布局,用flex布局還會自動會將高度也對齊
選中的地方會有個小勾,並且有三角形背景,分別用了::before和::after設置,上面的圖片中就是兩個高度不一樣的內容塊
在IOS中,一切正常,很OK,但是在Android系統中就有點苦了。這好端端的三角形變形啦。
后面發現小勾是根據內容塊中原先的高度相對定位的,后面自動拉高后就不會觸發那段CSS了,最終只能用JS修改內容塊的高度,然后在觸發::after中的樣式
ul li.active{ border:1px solid #dc481b; overflow:hidden; } ul li.active::before{ content: "\e605"; position:absolute; right:2px; bottom:2px; z-index:2; color:#FFF; } ul li.active::after{ content:"#"; background:#dc481b; color:#dc481b; width:50px; height:50px; position:absolute; right:-25px; bottom:-25px; -webkit-transform:rotate(45deg); transform:rotate(45deg); }
四、h1~h6
這幾個我在寫CSS的時候用的非常多,但是由於沿用的是PC中的reset,顯示在移動端,字體會特別的大
而且在reset的時候,會設置margin-top和margin-bottom,可是好多場景下,都不會用到或者被父級元素用到了
索性我就去除了外邊距,然后重新reset了這幾個標簽中字體大小
h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6 {font-family: inherit;font-weight: 500;line-height: 1.1;color: inherit;} h1 small,h2 small,h3 small,h4 small,h5 small,h6 small, .h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small, h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small, .h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small { font-weight: normal;line-height: 1;color: #777; } h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small, h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small { font-size: 65%; } h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small, h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small { font-size: 75%; } h1,.h1 {font-size: 22px;}h2,.h2 {font-size: 20px;}h3,.h3 {font-size: 18px;} h4,.h4 {font-size: 16px;}h5,.h5 {font-size: 14px;}h6,.h6 {font-size: 12px;}
五、微信瀏覽器中記住密碼
在一次登錄微信頁面后,客戶希望能不用再次輸入帳號密碼,直接進入登錄狀態。
簡單點么,就用cookie保存賬戶信息好了,但是要求在退出微信后,還能登錄,這個時候用cookie就不行了。
后面只得獲取公眾號的openid,然后將openid和賬戶綁定,當讀取到openid的時候,讀取到賬戶信息,從而模擬登錄。
由於只需要獲取openid,所以可以避免彈出授權頁面。點擊查看網頁授權獲取用戶基本信息。
后面還做了個微信關注后將推送歡迎信息。
六、腳本
頁面肯定會有驗證的邏輯,還有彈出框的展示,在寫頁面的時候,寫的比較倉促。
在將頁面寫好后,特地自己整理了兩個小插件,方便以后自己開發的時候使用,並且代碼很少都只有200多行。插件分別是zDialog和zValidate。
1)zepto
整個腳本使用了zepto類庫,語法與jQuery相似,但是又有些不同,有些jQuery可以使用的方式,在這里不能使用。
可以不用載入完整的zepto,根據需要再載入不同的模塊。如下面的圖片:

2)用iSlider來做圖片切換
有中文文檔說明,還能自定義添加組件,這個文檔很詳細,看了就會。點擊查看iSlider。
3)用Lightbox2點擊查看大圖展示
老字號的一個插件,作者重新寫了個第二版本的,我稍微修改了下,讓這個插件能夠支持手指的左右滑動事件,這樣更接地氣。點擊查看Lightbox2。
4)用lazyload來延遲圖片加載
圖片可以不用一下子全部加載進來,可以在滾動的時候顯示。點擊查看lazyload。
5)用dropload做下來刷新特效,用mustache模版插件來填充內容
自己公司有個項目需要用到下拉刷新,當時的同事使用了iScroll插件,這個插件很大,而且連帶了很多副作用,這次我想找個簡單點的,代碼能少一點,好讓我知道原理的,就找到了這個插件,目前用的很流暢。點擊查看dropload。
配合mustache,將內容展現在頁面上。
6)用lrz4來上傳圖片
上傳圖片是經常使用的一個功能,我在搜索的時候看到了這個插件,也用了一下,挺方便的,運用JS技術,讀取到圖片的base64內容,再將內容傳送到服務器接收,並生成圖片。
文檔也是蠻全的,點擊查看lrz4。在使用的時候自己也做了些封裝,使之更容易使用。
7)用fastclick解決zepto的tap點透問題
我在網上看點透看到是在一張頁面中的,可我這個地方顯示的點透卻是在兩張頁面中。
當時在微信瀏覽器中會出現這種點透情況,可是在UC瀏覽器中卻不會出現。
而且在微信瀏覽器中第一次進入的時候不出現,點擊瀏覽器中的返回按鈕,再次進入才會出現。
如下面的操作,紅色框框中的地方,進入到下一個頁面,就會自動點擊到那個位置的地方,那個地方正好有彈出層事件。
點頭的原理我這里不介紹了,在搜索引擎中輸入“tap 點透”,會出現一大串的。
最后我用fastclick,將300ms延遲去除,將綁定的tap事件改成click事件,就沒有出現這種情況了,難道說微信瀏覽器在將兩個頁面放在一起了嗎?才導致這個問題.....
參考資料:
http://www.ui.cn/detail/48317.html 移動端尺寸基礎知識
http://www.qianduan.net/css3-pointer-event-description/ CSS3 pointer-events介紹
http://qianduanblog.com/post/css-learning-19-css3-flex-responsive-design-class.html css3 flex流動自適應響應式布局樣式類
http://zh.learnlayout.com/column.html column
http://youyogmail-001-site1.site4future.com/archives/zepto-tap-click-through-research.html zepto tap “點透”研究
http://www.cnblogs.com/mmmjiang13/p/4141557.html 微信內置瀏覽器WebApp開發
