在上一篇《原理結(jié)構(gòu)篇》中,主要針對(duì)移動(dòng)端網(wǎng)頁(yè)進(jìn)行了分類(lèi)描述,并介紹了H5編輯器的需求、原理以及框架結(jié)構(gòu),本文將延續(xù)開(kāi)發(fā)實(shí)戰(zhàn)這一主題,針對(duì)策略和開(kāi)發(fā)技巧做進(jìn)一步的介紹。
在上一篇文章中,簡(jiǎn)單對(duì)兼容方式做了區(qū)分,即固定尺寸兼容及百分比兼容,下面我具體介紹下為什么沒(méi)有使用這兩種方式以及目前所用的適應(yīng)策略。
這種做法,一般是通過(guò)js自動(dòng)生成viewport及scale數(shù)值,我們來(lái)看一段代碼:
var ua = navigator.userAgent;var phoneScale = parseInt(window.screen.width) / 640;if (/Android (\d+\.\d+)/.test(ua)) { var version = parseFloat(RegExp.$1); var qqv = ua.match(/MQQBrowser\/(\d+)/) ? ua.match(/MQQBrowser\/(\d+)/)[1] : 0; if (version > 2.3 && qqv < 6) { document.write('<meta name="viewport" content="width=640, minimum-scale = ' + phoneScale + ", maximum-scale = " + phoneScale + ', target-densitydpi=device-dpi,user-scalable=no">') } else { document.write('<meta name="viewport" content="width=640, target-densitydpi=device-dpi,user-scalable=no">') }} else { document.write('<meta name="viewport" content="width=640, user-scalable=no, target-densitydpi=device-dpi">')}
首先,我們將設(shè)計(jì)稿尺寸定為640。 其次,iphone以及安卓2.3版本以下都可以通過(guò)直接指定viewport的width來(lái)實(shí)現(xiàn)固定尺寸兼容。 再次,針對(duì)安卓2.3以上的非qq瀏覽器及安卓2.3以上的qq瀏覽器v6以下,然后經(jīng)過(guò)計(jì)算得出縮放比例后,寫(xiě)入scale。
這種做法非常適合微信傳播的短平快的項(xiàng)目,開(kāi)發(fā)速度快,兼容性好是他的主要特點(diǎn)。 缺點(diǎn)也比較明顯,在極少數(shù)老型號(hào)的手機(jī)系統(tǒng)里,可能出偶發(fā)放大再縮小至適應(yīng)尺寸的問(wèn)題,而在手機(jī)橫屏?xí)r,此方式會(huì)偶發(fā)導(dǎo)致頁(yè)面放大后,重新回到豎屏無(wú)法回到原適應(yīng)尺寸。代碼中針對(duì)qq瀏覽器做的兼容,也是為了避免在qq瀏覽器中出現(xiàn)類(lèi)似問(wèn)題。
這種方式,是使用百分比代替原px的做法,一般包括以下步驟: 首先,設(shè)置viewport如以下代碼:
<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
其次,將頁(yè)面中的css尺寸都改為百分比單位:
.section .sec_bg{width:100%;height:100%;position:absolute;top:0;left:0;}.section .sec_bg_r{width:100%;height:100%;}.section .sec_bg_l{width:44.72%;height:100%;position:absolute;left:0;top:0;}.section .sec_slogn{width:62.23%;position:absolute;top:1.65%;left:0;}.section .sec_question{width:66.02%;margin:0 0 0 22.887%;position:relative;}.section .sec_question_num{width:100%;height:100%;}
這種做法兼容性好,橫豎屏兼容完美,非常適合hybird應(yīng)用,但開(kāi)發(fā)速度慢是它的主要缺點(diǎn),同時(shí)圖片做為背景的時(shí)候,高度無(wú)法進(jìn)行百分比計(jì)算也是一個(gè)比較麻煩的問(wèn)題。
這種做法是rem代替掉px,在兼容性上和百分比的形式是一樣的,計(jì)算起來(lái)也是一樣的麻煩,不過(guò)目前有些現(xiàn)成的框架可以使用,同時(shí)也有插件支持自動(dòng)轉(zhuǎn)換單位,使用起來(lái)還是挺方便的。在這里就不詳細(xì)描述rem的計(jì)算方式了,推薦下flexible框架,有興趣的童鞋可以去看看。
考慮到固定尺寸做法的兼容性不是很好,而且用途也局限在微信里,所以本項(xiàng)目中沒(méi)有采用這種形式。而百分比兼容方式不適用于有非全屏背景圖的項(xiàng)目,所以這種形式也只能對(duì)它說(shuō)哈哈了。
本項(xiàng)目采用的方式,如下圖:
這里所指的打包策略,并不是指前端或后端的文件打包,而是指靜態(tài)頁(yè)面生成后,整個(gè)項(xiàng)目自動(dòng)生成壓縮包,便于部署及發(fā)布。
本項(xiàng)目中,采用的方式是在保存H5后,在website_html目錄下,會(huì)自動(dòng)生成資源包,而生成的規(guī)則如下:
該包需要放置在支持php的目錄下,通過(guò)域名直接訪問(wèn),目前已經(jīng)默認(rèn)支持微信公眾號(hào)的自定義分享,分享的標(biāo)題、描述、圖片即為h5的標(biāo)題、描述、縮略圖。該資源包同時(shí)也兼顧項(xiàng)目列表中的預(yù)覽功能,也就是說(shuō)在項(xiàng)目列表中,點(diǎn)擊預(yù)覽時(shí),看到的預(yù)覽效果,即是用iframe嵌套的本資源包地址。
這里沒(méi)考慮多項(xiàng)目資源共享的問(wèn)題,也是為了滿(mǎn)足各個(gè)不同大部門(mén)需要自行部署項(xiàng)目的需求,具體實(shí)現(xiàn)方式是否需要進(jìn)行集中式管理,這個(gè)作為后期問(wèn)題再行討論。
優(yōu)化策略中,我們不討論靜態(tài)資源壓縮方面的優(yōu)化方式,而是說(shuō)說(shuō)本項(xiàng)目中,關(guān)于性能優(yōu)化、交互優(yōu)化所采用的方式方法。
由于H5的構(gòu)成元素以及樣式、動(dòng)畫(huà)等都是以JSON形式存儲(chǔ)在數(shù)據(jù)庫(kù),解析成dom元素需要一定的時(shí)間,為了避免圖片抖動(dòng),我們目前采用的方案如下:
在畫(huà)布上創(chuàng)建各種元素時(shí),會(huì)使用到一套初始化的配置,例如文本的內(nèi)容、圖片及svg的尺寸、背景顏色等等。為了便于管理,所用的初始化配置以及編輯模板均采用獨(dú)立的js文件進(jìn)行管理,與Java的xml配置項(xiàng)類(lèi)似。
核心json如何組織,是一個(gè)非常重要的話題,這里我將它的格式單獨(dú)作為一個(gè)策略,著重說(shuō)明。 格式如下:
{ "total": 4, "music": "/music/3.mp3", "value": { "page1": [ { "type": "text", "html": "MEIZU", "color": "#000", "font-size": "48px", "line-height": "1", "opacity": "1", "rotate": "0", "text-align": "center", "width": "400px", "left": "280px", "top": "50px", "animation-name": "fadeIn", "animation-duration": "0.6s", "animation-delay": "0s", "z-index": 1, "num":1 }, { "type": "bg", "opacity": "1", "background-color": "rgb(43, 144, 237)", "img-src": "/images/bg.jpg", "img-width": "800px", "img-margin-top": "-20px", "img-margin-left": "-55px" } ], ... } }
我將這種按頁(yè)及元素拆分,把CSS屬性、類(lèi)型甚至包括序號(hào)等均放置在同一段json內(nèi)的格式稱(chēng)為對(duì)等json格式。這種格式的優(yōu)點(diǎn)非常明顯,解析起來(lái)可以直接或略微調(diào)整的key作為css名,value即作為css的值,相對(duì)其他格式來(lái)說(shuō),使用起來(lái)簡(jiǎn)易很多。
前面我提到過(guò),每個(gè)元素創(chuàng)建時(shí),均有默認(rèn)配置項(xiàng)可供使用,而對(duì)于json中已經(jīng)有的元素,會(huì)將它的json與配置項(xiàng)合并后,進(jìn)行解析,這樣可以對(duì)json的條目有一定的優(yōu)化,減少json體積。
對(duì)于編輯器來(lái)說(shuō),如何把數(shù)據(jù)庫(kù)里存儲(chǔ)的數(shù)據(jù)信息轉(zhuǎn)換成DOM,這個(gè)轉(zhuǎn)換機(jī)制無(wú)疑是其核心內(nèi)容。對(duì)于這塊內(nèi)容,優(yōu)化有以下兩個(gè)方面:
俗話說(shuō)的好,一個(gè)功能一個(gè)坑,我們開(kāi)發(fā)軟件的過(guò)程,就是不斷挖坑和不斷填坑,這里我將幾個(gè)較為典型的列舉下,希望其他童鞋能夠少踩一點(diǎn)吧。
策略技巧篇寫(xiě)到這里就結(jié)束了,在接下去的時(shí)間里,可能還會(huì)不定時(shí)對(duì)經(jīng)驗(yàn)技巧做一些更新,對(duì)本編輯器有興趣的童鞋,歡迎留言評(píng)論。
聯(lián)系客服