经过前面四个版本号的迭代。我们已经制作了一个从视觉和听觉上都非常舒服的H5微场景应用,没有看过的请戳以下:

V1.0——简单页面滑动切换

V2.0——多页切换。透明过渡及交互指示

V3.0——增加loading,music及自己主动切换

V4.0——增加文字并给文字加特效

可是,还没有完,这一次,我们将做一些十分重要的收尾工作,才干真正完毕我们的第一个H5应用。所以。let’s do it!

任务

1、增加懊悔机制——页面上滑切换功能;

2、整理文件夹

3、压缩样式与脚本文件

4、模板化

分析

1、世上没有懊悔药。可是应用须要更好的用户体验,就要考虑到用户的懊悔,为用户提供一种懊悔机制,比方我们日常软件上有删除,就有撤销删除。一样地,我们的应用假设仅仅有切换到下一页而没有切换到上一页的功能的话,对于用户来说,是没有安全感的。由于不可控,由于无法懊悔。诚然。用户能够进行第二轮切换切换到上一页。可是这样的操作成本本身太高不可取,所以我们一定要为用户增加懊悔机制,在我们的应用里。表现为页面的向上切换。

2、一个良好的文件夹结构对于一个应用来说是必要的,它对于程序的可维护性,可扩展性十分重要,所以在项目正式上线公布前。我们要整理好文件文件夹。甚至,能够提前到项目開始阶段。就要计划好项目的文件夹结构。

3、对于用户体验来说,页面的第一次载入速度永远是最重要的,假设用户等待了十几秒你的页面还没载入完毕。那么里面无论有多好的内容。多好看的样式。用户也不再感兴趣,所以,为了提高载入速度,我们有必要对样式文件和脚本问价进行压缩。

4、实际工作中,我们要做的非常多项目可能都是使用相同的格式和功能,仅仅是内容不一样罢了,这时候。你绝逼不会每个项目都将前一个项目复制一份。然后钻到页面中改内容和样式,假设仅仅有几份你还能忍受。可假设有一千份。你会累死!

所以,将我们的项目模板化。以后全部的相似项目全都通过模板生成,是一个不错的选择。

实现

第一步:懊悔机制

我们已经有了一个页面切换函数,并且我们不想将这个函数复制一遍然后将里面的序号递增改为序号递减。所以,我们怎么做。对。给页面函数加一个參数。在函数体里根据參数值来决定它切换的方向。代码例如以下:

myfn.js

/**
* Created by hjb2722404 on 2015/6/4.
*/ $(function(){
var curpage=1;
var totalpage,nextpage,prepage,lastpage,nexttotalpage,pretotalpage; //获取总页数,以及总页数的+1/-1后的序号。供后面for循环使用 totalpage = $(".page").length;
nexttotalpage = totalpage + 1;
pretotalpage = totalpage - 1; window.onload = function(){
$(".loader").css("z-index","1");
$(".upicon").css("z-index","1000");
initAudio("audio");
} var audio;
function initAudio(id){
audio = document.getElementById(id);
} document.addEventListener('touchmove',function(event){
event.preventDefault(); },false); $(".page").swipeUp(function(){
swichpage("up");
}) $(".page").swipeDown(function(){
swichpage("down");
}) //控制音乐播放停止和音乐ico图标变换
$("#audioPlay").on('click',function(){
if(audio.paused){
audio.play();
this.style.backgroundImage="url(images/music_play.png)";
}else{
audio.pause();
this.style.backgroundImage="url(images/music_pause.png)";
}
}); function rnd(start, end){
return Math.floor(Math.random() * (end - start) + start);
} var inClassArray = ['pt-page-flipInLeft','pt-page-rotatePullLeft','pt-page-rotateCubeTopIn'];
var temLength = inClassArray.length; function swichpage(toward) { //推断当前页是否为最后一页
//假设是最后一页,显示第一页,并移除全部page上的全部css效果类。否则显示下一页。并移除上一页的切换动画效果
if (curpage == totalpage && nextpage != pretotalpage ) {
for (var i = 1; i < nexttotalpage; i++) {
$(".page" + i).removeClass("hide");
$(".page" + i).removeClass("show");
$(".page" + i).removeClass("pt-page-moveFromBottomFade");
}
$(".page1").addClass("show");
$(".page1").addClass("pt-page-moveFromBottomFade");
curpage = 1;
} else {
if(toward=="up"){
console.log("up");
nextpage = curpage + 1;
lastpage = curpage - 1;
var inClass ="pt-page-moveFromBottomFade";
var outClass="pt-page-moveToTopFade";
}else if(toward=="down"){
if(curpage == 1){
return false;
}
console.log("down");
nextpage = curpage - 1;
lastpage = curpage + 1;
var outClass ="pt-page-moveToBottomFade";
var inClass="pt-page-moveFromTopFade";
}
$(".page" + curpage).removeClass(inClass);
$(".page" + curpage).addClass(outClass);
$(".page" + curpage).removeClass("show");
$(".page" + curpage).addClass("hide");
$(".page" + nextpage).removeClass("hide");
$(".page" + nextpage).addClass("show");
$(".page" + nextpage).addClass(inClass);
var randomNum = rnd(0,temLength);
setTimeout(function(){
$(".textbox"+nextpage).css('display','block');
$(".textbox"+nextpage).addClass(inClassArray[randomNum]);
},1000);
$(".page" + lastpage).removeClass(outClass);
curpage = nextpage;
}
} setInterval(function(){
swichpage("up");
},8000); })

第二步:整理文件夹

整理后的文件夹结构例如以下:

别忘了改动各个文件里的引用

比如:index.html

<link rel="stylesheet" href="css/animate.css" type="text/css"/>
<link rel="stylesheet" href="css/animations.css" type="text/css"/>
<link rel="stylesheet" href="css/loading.css" type="text/css"/>
<link rel="stylesheet" href="css/style.css" type="text/css"/>
</head>
……
<script src="http://apps.bdimg.com/libs/zepto/1.1.4/zepto.min.js"></script>
<script src="js/touch.js"></script>
<script src="js/myfn.js"></script>
</body>

第三步:压缩。

这里,我们要压缩的是CSS文件和JS文件,必要时候也能够利用工具将几个JS文件或CSS文件合并为一个文件。我们这里仅仅演示一下压缩我们的主样式表style.css和主脚本文件myfn.js文件

首先来看看压缩前的style.css:

#pages {
width: 100%;
heigt: 100%;
}
.page {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
color: white;
z-index: 1;
} .page1 {
background: blue;
display: block;
z-index: 100;
} .hide {
z-index: 99;
}
.show {
z-index: 100;
}
.upicon {
width: 60px;
height: 60px;
position: absolute;
left: 50%;
bottom: 20px;
margin-left: -30px;
z-index: 1000;
}
.upicon img {
width: 60px;
}
#audioPlay {
width: 38px;
height: 38px;
background-image: url("../images/music_play.png");
background-repeat: no-repeat;
background-size: 100% 100%;
position: absolute;
top: 5%;
right: 5%;
z-index: 9999999;
}

然后是压缩后的style.min.css,我用的是在线压缩工具:

看看压缩前后的文件大小对照:

再来看看myfn.js的压缩,压缩前:

myfn.js


/**
* Created by hjb2722404 on 2015/6/4.
*/ $(function() {
var curpage = 1;
var totalpage, nextpage, prepage, lastpage, nexttotalpage, pretotalpage; //获取总页数,以及总页数的+1/-1后的序号。供后面for循环使用 totalpage = $(".page").length;
nexttotalpage = totalpage + 1;
pretotalpage = totalpage - 1; window.onload = function() {
$(".loader").css("z-index", "1");
$(".upicon").css("z-index", "1000");
initAudio("audio");
} var audio; function initAudio(id) {
audio = document.getElementById(id);
} document.addEventListener('touchmove', function(event) {
event.preventDefault();
}, false); $(".page").swipeUp(function() {
swichpage("up");
}) $(".page").swipeDown(function() {
swichpage("down");
}) //控制音乐播放停止和音乐ico图标变换
$("#audioPlay").on('click', function() {
if (audio.paused) {
audio.play();
this.style.backgroundImage = "url(images/music_play.png)";
} else {
audio.pause();
this.style.backgroundImage = "url(images/music_pause.png)";
}
}); function rnd(start, end) {
return Math.floor(Math.random() * (end - start) + start);
} var inClassArray = ['pt-page-flipInLeft', 'pt-page-rotatePullLeft', 'pt-page-rotateCubeTopIn'];
var temLength = inClassArray.length; function swichpage(toward) { //推断当前页是否为最后一页
//假设是最后一页。显示第一页,并移除全部page上的全部css效果类。否则显示下一页。并移除上一页的切换动画效果
if (curpage == totalpage && nextpage != pretotalpage) {
for (var i = 1; i < nexttotalpage; i++) {
$(".page" + i).removeClass("hide");
$(".page" + i).removeClass("show");
$(".page" + i).removeClass("pt-page-moveFromBottomFade");
}
$(".page1").addClass("show");
$(".page1").addClass("pt-page-moveFromBottomFade");
curpage = 1;
} else {
if (toward == "up") {
console.log("up");
nextpage = curpage + 1;
lastpage = curpage - 1;
var inClass = "pt-page-moveFromBottomFade";
var outClass = "pt-page-moveToTopFade";
} else if (toward == "down") {
if (curpage == 1) {
return false;
}
console.log("down");
nextpage = curpage - 1;
lastpage = curpage + 1;
var outClass = "pt-page-moveToBottomFade";
var inClass = "pt-page-moveFromTopFade";
}
$(".page" + curpage).removeClass(inClass);
$(".page" + curpage).addClass(outClass);
$(".page" + curpage).removeClass("show");
$(".page" + curpage).addClass("hide");
$(".page" + nextpage).removeClass("hide");
$(".page" + nextpage).addClass("show");
$(".page" + nextpage).addClass(inClass);
var randomNum = rnd(0, temLength);
setTimeout(function() {
$(".textbox" + nextpage).css('display', 'block');
$(".textbox" + nextpage).addClass(inClassArray[randomNum]);
}, 1000);
$(".page" + lastpage).removeClass(outClass);
curpage = nextpage;
}
} setInterval(function() {
swichpage("up");
}, 8000); })

压缩后的myfn.min.js:

myfn.min.js

看看压缩前后大小对照:

压缩后大小仅仅是压缩前一半大小。

别忘了在index.html中把引用改了。

index.html

……
<link rel="stylesheet" href="css/style.min.css" type="text/css"/>
…… <script src="js/myfn.min.js"></script>

第四步,模板化

模板化的思路是将Index.html页面中全部的变量(比方图片路径。内部样式的值等等)用变量符号取代。将来由后端程序解析替换为数据库中的数据。动态生成终于静态页面。

模板化的还有一个优点是。由于模板化支持循环输出,所以我们不必再在页面中将格式相同的元素复制N份。

这里我们约定全部由模板解析的变量格式为 {{$变量名}}。for循环的写法为{{for n=N $array}}...{{for end}}。if推断的写法为:{{if condition}}...{{if end}}根据这个原则,我们将index.html模板化为index.htm,模板化之后的代码例如以下:

index.htm

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="renderer" content="webkit">
<title>{{$title}}</title>
<link rel="stylesheet" href="css/animate.css" type="text/css"/>
<link rel="stylesheet" href="css/animations.css" type="text/css"/>
<link rel="stylesheet" href="css/loading.css" type="text/css"/>
<link rel="stylesheet" href="css/style.min.css" type="text/css"/> <style>
{{for n=9 $arrayPage}}
.page{{n}}{background-image: url({{$array[n][imgurl]}}); background-repeat: {$array[n][bgrepeat]}; background-size: {{$array[n][bgsize]}};}
{{for end}}
.textbox {display:none;}
{{for n=9 $arrayTextbox}}
.textbox{{n}}{width:{{$arrayTextbox[n][width]}}; height: {{$arrayTextbox[n][height]}}; position: {{$arrayTextbox[n][position]}}; top:{{$arrayTextbox[n][top]}};
left: {{$arrayTextbox[n][left]}};right:{{$arrayTextbox[n][right]}}; margin-left: {{$arrayTextbox[n][maginleft]}}; margin-top: {{$arrayTextbox[n][marginright]}};
color:{{$arrayTextbox[n][color]}};-webkit-writing-mode:{{$arrayTextbox[n][horizontal-tb]}};writing-mode:{{$arrayTextbox[n][wrimod]}};writing-mode:{{$arrayTextbox[n][horizontal-tb]}};}
{{for end}}
</style> </head>
<body>
<div class='loader loader--spinningDisc'></div> <audio src="{{$mp3url}}" autoplay="autoplay" id="audio" hidden="hidden" loop="loop"></audio>
<div id="audioPlay"></div>
<div id="pages">
{{for n=9 $arrayPageCon}}
<div class="page page{{n}}">
<div class="textbox{{n}} {{if n=1}} pt-page-rotateCubeTopIn {{if end}}">
{{$arrayPageCon[n][textCon]}}
</div>
</div>
{{for end}}
</div> <div class="upicon animated infinite bounce "><img src="data:images/upicon.png" alt=""/></div> <script src="http://apps.bdimg.com/libs/zepto/1.1.4/zepto.min.js"></script>
<script src="js/touch.js"></script>
<script src="js/myfn.min.js"></script>
</body>
</html>

这样,后端程序仅仅须要从数据库取到对应的变量值和几个二维数组。就能够将模板中的变量全部替换,并生成新的静态页面了。

到此为止,我们的第一个H5应用就全部制作完毕并完毕了模板化。然后就能够去掉不要的文件(style.css。myfn.js,less文件等),打包上传至server了。

还要注意的一点是。假设你是要将此应用在微信里分享,还要在index.html的头部写好相关分享信息,并制作一张分享用的图片,这个下次会单独讲。与本文并无必定关联。就先不讲了。

从零開始学习制作H5应用——V5.0:懊悔机制,整理文件夹,压缩,模板化的更多相关文章

  1. 从零開始学习OpenCL开发(一)架构

    多谢大家关注 转载本文请注明:http://blog.csdn.net/leonwei/article/details/8880012 本文将作为我<从零開始做OpenCL开发>系列文章的 ...

  2. 从零開始制作H5应用(4)——V4.0,增加文字并给文字加特效

    之前,我们分三次完毕了我们第一个H5应用的三个迭代版本号: V1.0--简单页面滑动切换 V2.0--多页切换,透明过渡及交互指示 V3.0--加入loading,music及自己主动切换 这已经是一 ...

  3. 刚開始学习的人制作VMOS场效应管小功放

    VMOS场效应管既有电子管的长处又有晶体管的长处,用它制作的功率放大器声音醇厚.甜美,动态范围大.频率响应好.因此近年来在音响设备中得到了广泛应用. 大功率的场效应管功率放大器.电.路比較复杂.制作和 ...

  4. 《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹

    <PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版 ...

  5. 对于刚開始学习的人Xcode最经常使用的快捷键

    对于刚開始学习的人而言,好多人都是直接使用鼠标进行操作.差点儿非常少使用快捷键,从而再练习编程时比别人慢那么一点,今天就把刚開始学习的人最经常使用的几个快捷键给大家总结下,当然欢迎大家补充. (1)c ...

  6. 从零開始学Swift之Hello World进化版

    上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, s ...

  7. 关东升的《从零開始学Swift》即将出版

    大家好: 苹果2015WWDC大会公布了Swift2.0,它较之前的版本号Swift1.x有非常大的变化.所以我即将出版<从零開始学Swift><从零開始学Swift>将在&l ...

  8. 作为刚開始学习的人应该怎样来学习FPGA

    FPGA作为一种高新的技术.已经逐渐普及到了各行各业.不管是消费类.通信类.电子行业都无处不在它的身影,从1985年第一颗FPGA诞生至 今,FPGA已经历了将近20多个年头,从当初的几百个门电路到如 ...

  9. Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob

    Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob 在正式的项目开发中,单client不能满足我们的需求,须要实现client与服务端的连接. 而在编写Android服务端代码 ...

随机推荐

  1. unity3d游戏开发猜想——当程序猿老去

    程序猿将代码注入生命去打造互联网的浪潮之巅.当有一天他们老了.会走向那里,会做些什么? 4.4.0" alt="" style="border:0px; ver ...

  2. fzu 2035 Axial symmetry(枚举+几何)

    题目链接:fzu 2035 Axial symmetry 题目大意:给出n个点,表示n边形的n个顶点,判断该n边形是否为轴对称图形.(给出点按照图形的顺时针或逆时针给出. 解题思路:将相邻两个点的中点 ...

  3. C# 数据访问编码需要遵循的几个规范

    一,链接打开之后必须关闭,否则会占用系统空间 SqlConnection conn=new SqlConnection(CONNECTIONSTRING); conn.open(); conn.clo ...

  4. Selenium WebDriver ie,chrome 驱动

    在驱动ie,chrome 的时候需要下载驱动 从网上下载IEDriverServer,Chromedriver 然后需要配置下就可以驱动ie,chrome 浏览器了 selenium 驱动ie 和 c ...

  5. java中怎么判断一个字符串中包含某个字符或字符串

    public static void main(String[] args) { String str="ABC_001"; ){ System.out.println(" ...

  6. jvm常用参数设置 good

    1.堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx= ...

  7. 博弈论之Nim

    博弈论(一):Nim游戏 重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算. Nim游戏是博 ...

  8. hdu 4714 Tree2cycle dp

    用树形dp做的,dp[t][i]表示t及其孩子入度都已经小于等于2并且t这个节点的入度等于i的最优解. 那么转移什么的自己想想就能明白了. 关键在于这个题目会暴栈,所以我用了一次bfs搜索出节点的顺序 ...

  9. VMware vSphere服务器虚拟化实验六 vCenter Server 添加储存

                                                                          VMware vSphere服务器虚拟化实验六 vCente ...

  10. JSP中两种include的区别

    首先说明这两种都是什么: <%@ include file=”relativeURI”%> 可以叫作静态include(静态包含),是jsp指令中的一种,(JSP指令控制JSP编译器如何去 ...