基于html5的移動web頁面搭建技術總結
網頁的head里加入這條元標簽,在iPhone的瀏覽器中頁面將以原始大小顯示,并不允許縮放。
width?-?viewport的寬度height?-?viewport的高度
initial-scale?-初始的縮放比例
minimum-scale?-允許用戶縮放到的最小比例
maximum-scale?-允許用戶縮放到的最大比例
user-scalable?-用戶是否可以手動縮放
CSS3的媒體查詢media queries語法:@media:{ sRules }取值::指定設備名稱。
通過媒體查詢可以為不同大小和尺寸的媒體定義不同的css,適合相應的設備顯示。
以下代碼實現了不同針對不同分辨率調整相應的文本,內容,元素的調整:
@media screen and (min-width:240px) {
html,body,button,input,select,textarea {
font-size: 9px
}
}
@media screen and (min-width:320px) {
html,body,button,input,select,textarea {
font-size: 14px;}
}
@media screen and (min-width:380px) {
html,body,button,input,select,textarea {
font-size: 15px
}
}
@media screen and (min-width:420px) {
html,body,button,input,select,textarea {
font-size: 16px
}
}
@media screen and (min-width:450px) {
html,body,button,input,select,textarea {
font-size: 18px
}
}
@media screen and (min-width:480px) {
html,body,button,input,select,textarea {
font-size: 19px
}
}
@media screen and (min-width:540px) {
html,body,button,input,select,textarea {
font-size: 20.25px
}
}
@media screen and (min-width:600px) {
html,body,button,input,select,textarea {
font-size: 22px
}
}
@media screen and (min-width:640px) {
html,body,button,input,select,textarea {
font-size: 24px
}
}
@media screen and (min-width:720px) {
html,body,button,input,select,textarea {
font-size: 28px
}
}
@media screen and (min-width:800px) {
html,body,button,input,select,textarea {
font-size:30px
}
}
@media screen and (min-width:880px) {
html,body,button,input,select,textarea {
font-size: 34px
}
}
@media screen and (min-width:960px) {
html,body,button,input,select,textarea {
font-size: 38px
}
}
盡量避免px布局,采用rem布局
PX特點
1. IE無法調整那些使用px作為單位的字體大小;
2.國外的大部分網站能夠調整的原因在于其使用了em或rem作為字體單位;
3. Firefox能夠調整px和em,rem,但是96%以上的中國網民使用IE瀏覽器(或內核)。
px像素(Pixel)。相對長度單位。像素px是相對于顯示器屏幕分辨率而言的。(引自CSS2.0手冊)
em是相對長度單位。相對于當前對象內文本的字體尺寸。如當前對行內文本的字體尺寸未被人為設置,則相對于瀏覽器的默認字體尺寸。(引自CSS2.0手冊)
任意瀏覽器的默認字體高都是16px。所有未經調整的瀏覽器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。為了簡化font-size的換算,需要在css中的body選擇器中聲明Font-size=62.5%,這就使em值變為16px*62.5%=10px,這樣12px=1.2em, 10px=1em,也就是說只需要將你的原來的px數值除以10,然后換上em作為單位就行了。
EM特點
1. em的值并不是固定的;
2. em會繼承父級元素的字體大小。
所以我們在寫CSS的時候,需要注意兩點:
1. body選擇器中聲明Font-size=62.5%;
2.將你的原來的px數值除以10,然后換上em作為單位;
3.重新計算那些被放大的字體的em數值。避免字體大小的重復聲明。
也就是避免1.2 * 1.2= 1.44的現象。比如說你在#content中聲明了字體大小為1.2em,那么在聲明p的字體大小時就只能是1em,而不是1.2em,因為此em非彼em,它因繼承#content的字體高而變為了1em=12px。
rem特點
rem是CSS3新增的一個相對單位(root em,根em),這個單位引起了廣泛關注。這個單位與em有什么區別呢?區別在于使用rem為元素設定字體大小時,仍然是相對大小,但相對的只是HTML根元素。這個單位可謂集相對大小和絕對大小的優點于一身,通過它既可以做到只修改根元素就成比例地調整所有字體大小,又可以避免字體大小逐層復合的連鎖反應。目前,除了IE8及更早版本外,所有瀏覽器均已支持rem。對于不支持它的瀏覽器,應對方法也很簡單,就是多寫一個絕對單位的聲明。這些瀏覽器會忽略用rem設定的字體大小。
視頻
HTML5
元素同樣擁有方法、屬性和事件。其中的方法用于播放、暫停以及加載等。其中的屬性(比如時長、音量等)可以被讀取或設置。其中的DOM事件能夠通知您,比方說,元素開始播放、已暫停,已停止,等等。
具體使用demo如下:
播放/暫停
大
中
小
Your browser does not support HTML5 video.
varmyVideo=document.getElementById("video1");
functionplayPause()
{
if(myVideo.paused)
myVideo.play();
else
myVideo.pause();
}
functionmakeBig()
{
myVideo.width=560;
}
functionmakeSmall()
{
myVideo.width=320;
}
functionmakeNormal()
{
myVideo.width=420;
}
注意:html5對于mp4文件支持,只能夠為h264編碼格式
音頻
HTML5規定了一種通過audio元素來包含音頻的標準方法。
audio元素能夠播放聲音文件或者音頻流。
具體使用demo如下:
Your browser does not support the audio element.
注意:某些Android手機對于聲音文件碼率要求較高,所以建議聲音文件盡量采用190kbps以上碼率
1.3輕量級的js庫Zepto.js+原生js代碼提高web頁面性能
Zepto.js的特點:
1.他夠小,只有21k左右,功能俱全。
2.增加了移動設備的觸摸等事件,不需要再次引入其他手機框架如jquery
mobile。
3.雖然不兼容ie但是提供了一個兼容方法:
document.write(‘
src=’+ (‘__proto__’in {} ?‘zepto’:‘jquery’) +‘.js><\/script>’) 。
概述
1. PC優化手段在Mobile側同樣適用
2.在Mobile側我們提出三秒種渲染完成首屏指標
3.基于第二點,首屏加載3秒完成或使用Loading
4.基于聯通3G網絡平均338KB/s(2.71Mb/s),所以首屏資源不應超過1014KB
5. Mobile側因手機配置原因,除加載外渲染速度也是優化重點
6.基于第五點,要合理處理代碼減少渲染損耗
7.基于第二、第五點,所有影響首屏加載和渲染的代碼應在處理邏輯中后置
8.加載完成后用戶交互使用時也需注意性能
優化指南
[加載優化]
加載過程是最為耗時的過程,可能會占到總耗時的80%時間,因此是優化的重點
·減少HTTP請求
因為手機瀏覽器同時響應請求為4個請求(Android支持4個,iOS 5后可支持6個),所以要盡量減少頁面的請求數,首次加載同時請求數不能超過4個
a)合并CSS、JavaScript
b)合并小圖片,使用雪碧圖
·緩存
使用緩存可以減少向服務器的請求數,節省加載時間,所以所有靜態資源都要在服務器端設置緩存,并且盡量使用長Cache(長Cache資源的更新可使用時間戳)
a)緩存一切可緩存的資源
b)使用長Cache(使用時間戳更新Cache)
c)使用外聯式引用CSS、JavaScript
·壓縮HTML、CSS、JavaScript
減少資源大小可以加快網頁顯示速度,所以要對HTML、CSS、JavaScript等進行代碼壓縮,并在服務器端設置GZip
a)壓縮(例如,多余的空格、換行符和縮進)
b)啟用GZip
·無阻塞
寫在HTML頭部的JavaScript(無異步),和寫在HTML標簽中的Style會阻塞頁面的渲染,因此CSS放在頁面頭部并使用Link方式引入,避免在HTML標簽中寫Style,JavaScript放在頁面尾
部或使用異步方式加載
·使用首屏加載
首屏的快速顯示,可以大大提升用戶對頁面速度的感知,因此應盡量針對首屏的快速顯示做優化
·按需加載
將不影響首屏的資源和當前屏幕資源不用的資源放到用戶需要時才加載,可以大大提升重要資源的顯示速度和降低總體流量
PS:按需加載會導致大量重繪,影響渲染性能
a) LazyLoad
b)滾屏加載
c)通過Media Query加載
·預加載
大型重資源頁面(如游戲)可使用增加Loading的方法,資源加載完成后再顯示頁面。但Loading時間過長,會造成用戶流失
對用戶行為分析,可以在當前頁加載下一頁資源,提升速度
a)可感知Loading(如進入空間游戲的Loading)
b)不可感知的Loading(如提前加載下一頁)
·壓縮圖片
圖片是最占流量的資源,因此盡量避免使用他,使用時選擇最合適的格式(實現需求的前提下,以大小判斷),合適的大小,然后使用智圖壓縮,同時在代碼中用Srcset來按需顯示
PS:過度壓縮圖片大小影響圖片顯示效果
a)使用智圖(http://zhitu.tencent.com/)
b)使用其它方式代替圖片(1.使用CSS3?2.使用SVG?3.使用IconFont)
c)使用Srcset
d)選擇合適的圖片(1. webP優于JPG?2. PNG8優于GIF)
e)選擇合適的大小(1.首次加載不大于1014KB?2.不寬于640(基于手機屏幕一般寬度))
·減少Cookie
Cookie會影響加載速度,所以靜態資源域名不使用Cookie
·避免重定向
重定向會影響加載速度,所以在服務器正確設置避免重定向
·異步加載第三方資源
第三方資源不可控會影響頁面的加載和顯示,因此要異步加載第三方資源
[腳本執行優化]
腳本處理不當會阻塞頁面加載、渲染,因此在使用時需當注意
· CSS寫在頭部,JavaScript寫在尾部或異步
·避免圖片和iFrame等的空Src
空Src會重新加載當前頁面,影響速度和效率
·盡量避免重設圖片大小
重設圖片大小是指在頁面、CSS、JavaScript等中多次重置圖片大小,多次重設圖片大小會引發圖片的多次重繪,影響性能
·圖片盡量避免使用DataURL
DataURL圖片沒有使用圖片的壓縮算法文件會變大,并且要解碼后再渲染,加載慢耗時長
[CSS優化]
·盡量避免寫在HTML標簽中寫Style屬性
·避免CSS表達式
CSS表達式的執行需跳出CSS樹的渲染,因此請避免CSS表達式
·移除空的CSS規則
空的CSS規則增加了CSS文件的大小,且影響CSS樹的執行,所以需移除空的CSS規則
·正確使用Display的屬性
Display屬性會影響頁面的渲染,因此請合理使用
a) display:inline后不應該再使用width、height、margin、padding以及float
b) display:inline-block后不應該再使用float
c) display:block后不應該再使用vertical-align
d) display:table-*后不應該再使用margin或者float
·不濫用Float
Float在渲染時計算量比較大,盡量減少使用
·不濫用Web字體
Web字體需要下載,解析,重繪當前頁面,盡量減少使用
·不聲明過多的Font-size
過多的Font-size引發CSS樹的效率
·值為0時不需要任何單位
為了瀏覽器的兼容性和性能,值為0時不要帶單位
·標準化各種瀏覽器前綴
a)無前綴應放在最后
b) CSS動畫只用(-webkit-無前綴)兩種即可
c)其它前綴為-webkit- -moz- -ms-無前綴四種,(-o-Opera瀏覽器改用blink內核,所以淘汰)
·避免讓選擇符看起來像正則表達式
高級選擇器執行耗時長且不易讀懂,避免使用
[JavaScript執行優化]
·減少重繪和回流
a)避免不必要的Dom操作
b)盡量改變Class而不是Style,使用classList代替className
c)避免使用document.write
d)減少drawImage
·緩存Dom選擇與計算
每次Dom選擇都要計算,緩存他
·緩存列表.length
每次.length都要計算,用一個變量保存這個值
·盡量使用事件代理,避免批量綁定事件
·盡量使用ID選擇器
ID選擇器是最快的
· TOUCH事件優化
使用touchstart、touchend代替click,因快影響速度快。但應注意Touch響應過快,易引發誤操作
[渲染優化]
·HTML使用Viewport
Viewport可以加速頁面的渲染,請使用以下代碼
content=”width=device-width, initial-scale=1″>
·減少Dom節點
Dom節點太多影響頁面的渲染,應盡量減少Dom節點
·動畫優化
a)盡量使用CSS3動畫
b)合理使用requestAnimationFrame動畫代替setTimeout
c)適當使用Canvas動畫5個元素以內使用css動畫,5個以上使用Canvas動畫(iOS8可使用webGL)
·高頻事件優化
Touchmove、Scroll事件可導致多次渲染
a)使用requestAnimationFrame監聽幀變化,使得在正確的時間進行渲染
b)增加響應變化的時間間隔,減少重繪次數
· GPU加速
CSS中以下屬性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)來觸發GPU渲染,請合理使用
PS:過渡使用會引發手機過耗電增加
1.5touch事件,touchstart, touchend, touchmove
iOS上的Safari也支持click和mouseover等傳統的交互事件,只是不推薦在iOS的瀏覽器應用上使用click和mouseover,因為這兩個事件是為了支持鼠標點擊而設計出來的。Click事件在iOS上會有半秒左右的延遲,原因是iOS要highlight接收到click的element。而mouseover/out等事件則會被手指的點擊觸發。所以,在iOS上,應當拋棄傳統的交互事件模型而接受一個新的事件模型。Touch事件和更高級的Gesture事件,能讓你的網頁交互起來像native應用一樣。
三種在規范中列出并獲得跨移動設備廣泛實現的基本觸摸事件:
1.touchstart:手指放在一個DOM元素上。
2.touchmove:手指拖曳一個DOM元素。
3.touchend:手指從一個DOM元素上移開。
每個觸摸事件都包括了三個觸摸列表:
1. touches:當前位于屏幕上的所有手指的一個列表。
2. targetTouches:位于當前DOM元素上的手指的一個列表。
3. changedTouches:涉及當前事件的手指的一個列表。
例如,在一個touchend事件中,這就會是移開的手指。
這些列表由包含了觸摸信息的對象組成:
1. identifier:一個數值,唯一標識觸摸會話(touch
session)中的當前手指。
2. target:DOM元素,是動作所針對的目標。
3.客戶/頁面/屏幕坐標:動作在屏幕上發生的位置。
4.半徑坐標和rotationAngle:畫出大約相當于手指形狀的橢圓形。
在開始描述touch事件之前,需要先描述一下多觸式系統中特有的touch對象(android和iOS乃至nokia最新的meego系統都模擬了類似的對象,這里只針對iOS,因為我只有iPad可用于測試。。)。這個對象封裝一次屏幕觸摸,一般來自于手指。它在touch事件觸發的時候產生,可以通過touch event handler的event對象取到(一般是通過event.changedTouches屬性)。這個對象包括一些重要的屬性:
client / clientY:觸摸點相對于瀏覽器窗口viewport的位置
pageX / pageY:觸摸點相對于頁面的位置
screenX /screenY:觸摸點相對于屏幕的位置
identifier:touch對象的unique ID
我們從一個單根手指觸摸的實例開始進入多觸式網頁的世界。當一根手指放下的時候,屏幕上出現一個方塊,手指移動方塊也隨著移動,手指提起方塊消失。首先,讓我們定義一下方塊的css:
*{margin:0;padding:0}
html,body{height:100%}
.spirit{position:absolute;width:50px;height:50px;background-color:red;}
#canvas{position:relative;width:100%;height:200px;background-color:#ccc}
然后,在body下定義一個接收事件的容器:
定義touchstart的事件處理函數,并綁定事件:
var canvas =document.getElementById("canvas"),
spirit,
startX,
startY;
functiontouchStart(event) {
//阻止網頁默認動作(即網頁滾動)
event.preventDefault();
if(spirit || !event.touches.length) return;
var touch = event.touches[0];
startX = touch.pageX;
startY = touch.pageY;
spirit= document.createElement("div");
canvas.appendChild(spirit);
spirit.className = "spirit";
spirit.style.left = startX + "px";
spirit.style.top = startY + "px";
}
canvas.addEventListener("touchstart",touchStart, false);
首先,我們將方塊spirit作為一個全局對象,因為我們現在要測試單根手指所以屏幕上最好只有一個物體在移動(等會有多觸實例)。在touchStart這個事件處理函數中,我們也首先判斷了是否已經產生了spirit,也就是是否已經有一個手指放到屏幕上,如果是,直接返回。
和傳統的event listener一樣,多觸式系統也會產生一個event對象,只不過這個對象要多出一些屬性,比如這里的event.touches,這個數組對象獲得屏幕上所有的touch。注意這里的event.preventDefault(),在傳統的事件處理函數中,這個方法阻止事件的默認動作,觸摸事件的默認動作是滾屏,我們不想屏幕動來動去的,所以先調用一下這個函數。我們取第一個touch,將其pageX/Y作為spirit創建時的初始位置。接下來,我們創建一個div,并且設置className,left,top三個屬性。最后,我們把spirit對象appendChild到容器中。這樣,當第一根手指放下的時候,一個紅色的,50px見方的方塊就放到屏幕上了。
然后,我們要開始處理手指在屏幕上移動的事件:
functiontouchMove(event) {
event.preventDefault();
if(!spirit || !event.touches.length) return;
var touch = event.touches[0],
x = touch.pageX - startX,
y = touch.pageY - startY;
//這里是為了手指一定是橫向滾動的,原理是計算X位置的偏移要比Y的偏移大
if(Math.abs(x) > Math.abs(y)) {
spirit.style.left = touch.pageX + "px";
spirit.style.top = touch.pageY + "px";
}
}
canvas.addEventListener("touchmove", touchMove, false);
在touch move listener中,我們使用webkit特有的css屬性:webkitTransform來移動方塊,這個屬性具體怎么用請google之。建議構造面向iOS設備的網頁的時候盡量使用webkit自己的特性,不但炫,更可以直接利用硬件來提高性能。
最后,我們處理touchend事件。手指提起的時候方塊從屏幕上移除。
functiontouchEnd(event) {
if(!spirit) return;
canvas.removeChild(spirit);
spirit = null;
}
canvas.addEventListener("touchend",touchEnd, false);
2.4添加dom內容
11111111
222222
33333
4444444
55555555
2.5創建pageframe類并初始化
var myframe = new pageframe({
scene:'scene',
page:'page',
type :6,
loop :1,
auto :0,
callback : function(obj)
{
//alert(i);
//obj.css('background-color','red');
}
});
參數對著表
參數名稱
取值
Scene
容器div class
Page
頁面div class
Type
切換特效類型:0-普通橫滑,1-頁面橫滑,2-翻轉橫滑,3-翻頁橫滑,4-飛頁橫滑
5-普通豎滑,6-頁面豎滑,7-翻轉豎滑,8-翻頁豎滑,9-飛頁豎滑
Loop
是否支持循環切換:0-不支持1-支持
Callback
頁面切換完成后回調函數