1. 程式人生 > >從零開始學習H5應用(1)——V1.0版,簡單頁面滑動切換效果

從零開始學習H5應用(1)——V1.0版,簡單頁面滑動切換效果

可曾看見過那些在微信上轉瘋了的H5神作?好生羨慕啊,那麼從今天開始,我將從零開始學習製作H5應用,看看那麼漂亮的頁面是怎麼樣一步一步形成的。

2016年2月更新:之前很多朋友問我要原始碼,由於工作原因,一直沒來得及上傳,今天已上傳至github,點選下面的地址可檢視下載最終原始碼:

準備

在學習製作H5應用之前,必須具備以下基礎前提:

HTML,CSS,JS基本編寫與製作能力

瞭解了H5中的各種新特性

有一定的邏輯思維能力,可以將複雜任務通過分析簡化為若干原子事件來處理

看得懂漢語,以及教程中出現的前端術語。

任務

這是本系列的第一篇,任務非常簡單,

製作一個具有3張頁面,每次只顯示其中一張頁面,當手指向上滑動裝置螢幕時當前頁面消失下一張頁面出現,並具有一定的過渡效果

分析

雖然任務非常簡單,我們還是要把它拆分為幾部來做,如下:

1、構建頁面:具有三張頁面,第一張顯示,另外兩張隱藏;
2、使用JS監聽手勢向上滑動的事件,並動態改變三張頁面的顯示/隱藏樣式;
3、給頁面顯示和隱藏新增過渡的動畫效果;

實現

第一步

首先,我們在html頁面中構建頁面結構:

index.html

    <div id="pages">

        <div class="page page1"
>
頁面一</div> <div class="page page2">頁面二</div> <div class="page page3">頁面三</div> </div>

這裡,我們為了方便看效果,在每個頁面中加入了相應文字來標示該頁面

然後,使用CSS檔案進行樣式佈局:

style.css

#pages {
  width: 100%;
  heigt: 100%;
}
.page {
  width: 100%;
  height: 100%;
  position: absolute
; top: 0; left: 0; display: none; color: white; }
.page1 { background: blue; display: block; } .page2 { background: red; } .page3 { background: yellow; }

這裡,設定了統一的樣式.page 以便讓三張頁面都能全屏顯示,並且設定絕對定位使他們完全重疊,給他們設定了不同背景色用於標識,並讓第一頁顯示出來,其他兩張隱藏。

給index.html引入樣式:

<title>H5場景應用1.0——實現頁面滑動效果</title>
    <link rel="stylesheet" href="style.css" type="text/css"/>

我們來看看效果:

這裡寫圖片描述

我們使用了Opera Mobile Emulator工具來在PC上模擬手機瀏覽器的顯示和操作。

至此,第一步就很簡單地完成了。

第二步

首先,我們要監聽使用者的手勢,這個向上滑動的事件怎麼來做呢?

這裡,我們推薦使用zepto.js類庫,因為它預設提供了對觸屏的滑動事件的支援。

將zepto.js引入index.html,這裡,為了提升載入速度,我們使用百度靜態資源庫檔案,並且同時引入我們自己用來寫自定義功能的js檔案myfn.js,現在它還是空的。還有一個js檔案touch.js是必須的,它是zepto的一個模組,用來支援觸屏操作,而zepto.js預設是不包含該模組的

index.html

<script src="http://apps.bdimg.com/libs/zepto/1.1.4/zepto.min.js"></script>
<script src="touch.js"></script>
<script src="myfn.js"></script>

現在,在myfn.js裡實現監聽函式和頁面隱藏,顯示函式。

myfn.js

//測試對swipeUp(向上滑動)的監聽是否有效
$(document).swipeUp(function(){
    alert("ok");
});

儲存,看看效果:

這裡寫圖片描述

說明我們引入zepto後對觸屏的向上滑動事件的監聽是成功的,那麼現在我們可以編寫內部頁面隱藏顯示的切換效果了。

在編寫程式碼之前,我們把這一步的邏輯流程再細化一下,看看流程圖:

Created with Raphaël 2.1.0開始 獲取當前頁面序號,隱藏當前頁是否為最後一頁?顯示第一頁結束顯示下一頁yesno

這裡面,我們明確了整個程式的外部流程,然後再來深究一下每一步操作的思路:

獲取當前頁面序號:

很顯然,當前頁面就是當前顯示的頁面,可以有兩種方法來獲取:
第一種是給當前頁面新增class=”show”,然後獲取時直接查詢class=”show”的元素;
第二種是設定一個全域性變數curpage,頁面初次載入時它的值肯定是1,然後每次向上滑動,它的值自增1,就是當前頁面的序號;
很明顯,第二種實現起來比第一種要簡單,而且效率和架構更優。

隱藏當前頁

給當前頁新增class=”hide”

判斷是否為最後一頁

在獲取到當前頁面序號後,就要判斷是否為最後一頁。那麼如何判斷呢?當然是先要知道總共有多少頁,然後看當前頁面序號是否與最大頁數相等,相等,就是最後一頁,不相等,則不是最後一頁。而總頁數就是#page下面的class為.page 的div的個數。

顯示第一頁

這個很簡單,給序號為1的頁面設定class=”show”,將其他所有頁面隱藏

顯示下一頁

獲取到當前頁序號後,這一步也很簡單,就是讓序號加1,然後讓class為.page+序號的頁面增加一個class=”show”就可以了

好了,有了以上分析,我們就可以開始編碼了,最終實現程式碼如下:

myfn.js

var curpage=1;
var totalpage,nextpage;

$(document).swipeUp(function(){

    //隱藏當前頁面

    $(".page"+curpage).removeClass("show");
    $(".page"+curpage).addClass("hide");


    //判斷當前頁是否為最後一頁

        //獲取總頁數
    totalpage = $(".page").length;
    //如果是最後一頁,顯示第一頁,否則顯示下一頁
    if(curpage == totalpage){
        $(".page1").removeClass("hide");
        $(".page1").addClass("show");
        curpage =1;
    }else{
        nextpage = curpage+1;
        $(".page"+nextpage).removeClass("hide");
        $(".page"+nextpage).addClass("show");
        curpage = nextpage;
    }


});

然後在style.css里加入兩個樣式:

style.css


……
.page3 {
  background: yellow;
}
.hide {
  display: none;
}
.show {
  display: block;
}

再來看效果:

這裡寫圖片描述

頁面剛載入是上圖這樣的

這裡寫圖片描述

第一次向上滑動後切換到了頁面二

這裡寫圖片描述

第二次向上滑動後切換到了頁面三

這裡寫圖片描述

第三次向上滑動後頁面又切回頁面一

第三步

接下來就要為我們的隱藏消失效果設定過渡效果了,那麼前面我們學習過關於animation的動畫效果就派上用場了,這裡我們使用animation.css外掛來省去編寫animation動畫的工作。

在index.html中加入以下引用:

    <link rel="stylesheet" href="animations.css" type="text/css"/>

然後將myfn.js做一下小小的改造:

myfn.js

var curpage=1;
var totalpage,nextpage;

$(document).swipeUp(function(){

//判斷當前頁是否為最後一頁

        //獲取總頁數
    totalpage = $(".page").length;
    //如果是最後一頁,顯示第一頁,否則顯示下一頁
    if(curpage == totalpage){
       $(".page1").removeClass("hide");
        $(".page1").addClass("show");
        $(".page1").addClass("pt-page-moveFromBottom");
        $(".page"+curpage).removeClass("show");
        $(".page"+curpage).addClass("hide");
        $(".page"+curpage).addClass("pt-page-moveToTop");
        curpage =1;
    }else{
        nextpage = curpage+1;
        $(".page"+nextpage).removeClass("hide");
        $(".page"+nextpage).addClass("show");
        $(".page"+nextpage).addClass("pt-page-moveFromBottom");
        $(".page"+curpage).removeClass("show");
        $(".page"+curpage).addClass("hide");
        $(".page"+curpage).addClass("pt-page-moveToTop");
        curpage = nextpage;
    }
});

這其中的pt-page-moveFromBottom和pt-page-moveToTop就是animation.css裡幫我們定義的移入移出動畫了。

再開啟手機瀏覽器測試,就可以看到兩個頁面之間的切換效果了。雖然切換效果中間有一瞬間是白場,這個問題我們在下一版進一步完善。

至此,我們用不多的程式碼完成了我們的V1.0版的任務,這一次程式碼不多,但是中間要對整個程式的流程進行分析與設計,這種思路是這一次的重點。這種思路確定後,以後的版本中在這一版本的基礎上進行功能的擴充套件就簡單多了,期待V2.0版哦!