一门新的技术诞生总会引来一番争议,单页Web应用程序也不例外,其最大的优势在于用户体验,对于内容的改动不需要加载整个页面;对服务器压力很小,消耗更少的带宽,与面向服务的架构更好地结合。使用HTML+CSS+JavaScript编写应用程序,能使更多的开发者都加入到程序开发的行列。

单页面应用是指用户通过浏览器加载独立的HTML页面并且无需离开此导航页面,这也是其独特的优势所在。对用户操作来说,一旦加载和执行单个页面应用程序通常会有更多的响应,这就需要返回到后端Web服务器,而单页面应用为用户提供了更接近一个本地移动或桌面应用程序的体验。

单页Web应用程序的优点:

  1. 首先,最大的好处是用户体验,对于内容的改动不需要加载整个页面。这样做好处颇多,因为数据层和UI的分离,可以重新编写一个原生的移动设备应用程序而不用(对原有数据服务部分)大动干戈。
  2. 单页面Web应用层程序最根本的优点是高效。它对服务器压力很小,消耗更少的带宽,能够与面向服务的架构更好地结合。

在艾伦项带领的项目组工作也有一年多了,他实现了一套非常完整的单页应用框架。非常复杂,到今天我也还没有理清里边的所有实现。

下面请允许我展示一下这个应用的结果

看起来和原生应用程序没有什么两样吧。于是呢,我就做了一个简单的模型,和往常一样,只是用来演示原理。

下面发一下我的模型图:

虽然样子是丑陋了一点,但是用来学习刚刚好,下面看一下具体的javascript代码:

/*
* Swipe 2.0
* @author bjtqti
* @description 基于javascript的单页应用
* Copyright 2014, MIT License
*
*/ function Swipe(container, options) { "use strict"; // quit if no root element
if (!container) return;
options = options || {};
this.container = container;
//页面数据
this.pages = options.pages||[];
this.pointer = {};
//设备屏宽
this.screenWidth = 640;
this.init();
} Swipe.prototype = { //初始化
init : function(){
var maxLen = this.pages.length;
var index = Number(localStorage.getItem('index'))||0;
var next,prev;
if(!maxLen) return;
//创建页面基础元素
this.createLeftButton();
this.createSwipeWrap();
this.createRightButton();
//缓存页码索引信息
this.curIndex = index;
this.maxLen = maxLen;
this.pointer.cur = this.createPage(index); if(maxLen ==1) return; switch(index){
case 0:
next = this.createPage(index+1);
break;
case maxLen -1:
prev = this.createPage(index-1);
break;
default:
prev = this.createPage(index-1);
next = this.createPage(index+1);
}
this.pointer.next = next;
this.pointer.prev = prev;
next && this.move(next,this.screenWidth);
prev && this.move(prev,-this.screenWidth);
}, //创建翻页容器
createSwipeWrap : function(){
var ele = document.createElement('ul');
ele.className = "xut-container";
this.container.appendChild(ele);
this.box = ele;
}, //创建左翻页按钮
createLeftButton : function(){
var that = this;
this.createBtn({
name : "xut-left",
text : "<",
fn : function(){
that.prev();
}
})
}, //创建右翻页按钮
createRightButton : function(){
var that = this;
this.createBtn({
name : "xut-right",
text : ">",
fn : function(){
that.next();
}
})
}, //创建按钮
createBtn : function(options){
var ele = document.createElement('div');
ele.className = options.name;
ele.innerHTML = options.text;
this.container.appendChild(ele);
ele.addEventListener('click',options.fn,false);
return ele;
}, //创建页面
createPage : function(index){
var li = document.createElement('li');
li.setAttribute('class','xut-flip');
li.innerHTML = index;
//这里可以进行自由扩展,数据从this.pages添加
this.box.appendChild(li);
return li;
}, //上一页
prev : function(){
if(this.curIndex > 0){
var prev = this.pointer.prev;
var cur = this.pointer.cur;
this.curIndex--;
//当前页移到右边
this.slide(cur,this.screenWidth);
//上一页移到中间
this.slide(prev,0);
//清除下下一页
this.destory(this.pointer.next);
//更新标记
this.pointer.next = cur;
this.pointer.cur = prev;
//预创建上一页
if(this.curIndex -1 > -1){
this.pointer.prev = this.createPage(this.curIndex-1);
this.move(this.pointer.prev,-this.screenWidth);
}else{
this.pointer.prev = null;
}
localStorage.setItem('index',this.curIndex)
}
}, //下一页
next : function(){
if(this.curIndex < this.maxLen-1){
var next = this.pointer.next;
var cur = this.pointer.cur;
this.curIndex++;
//当前页移到左边
this.slide(cur,-this.screenWidth);
//下一页移到中间
this.slide(next,0);
//清除上上一页
this.destory(this.pointer.prev);
//更新标记
this.pointer.prev = cur;
this.pointer.cur = next; //预创建下一页
if(this.curIndex+1 < this.maxLen){
this.pointer.next = this.createPage(this.curIndex+1);
this.move(this.pointer.next,this.screenWidth);
}else{
this.pointer.next = null;
}
localStorage.setItem('index',this.curIndex)
}
}, //滑动
slide : function(ele,distance){
var time = 300;
ele.style['webkitTransitionDuration'] = time+'ms';
this.move(ele,distance);
}, //移位
move : function(ele,distance){
ele.style['-webkit-transform'] = 'translate3d('+distance+'px, 0, 0)';
}, //销毁
destory : function(ele){
if(!ele) return;
this.box.removeChild(ele);
}
}

这段代码没有做滑动翻页的模拟,为的尽量简化。如果大家有兴趣,可以下载下来演示一下。

https://github.com/bjtqti/xxt/tree/master/spa

移动前端开发-单页应用(spa)模型的更多相关文章

  1. 从单页应用(SPA)到服务器渲染(SSR)

    从单页应用(SPA)到服务器渲染(SSR) 情景回顾 在学习Vue开发一个电商网站的管理后台时,使用到了一个组件 vue-quill-editor 主要是一个快捷的一个富文本编辑器 在使用这个组件的组 ...

  2. 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 网上有好几种单页应用转seo的方案,有服务端渲染ssr.有预渲染prerender.google抓AJAX.静态化...这些方案都各有优劣,开发者可以根据不同的 ...

  3. 《移动Web前端高效开发实战》笔记4--打造单页应用SPA

    路由是一个单页应用的核心,大部分前端框架都实现了一个复杂的路由库,包括动态路由,路由钩子,组件生命周期甚至服务器端渲染等复杂的功能.但是对于前端开发者而言,路由组件的核心是URL路径到函数的映射,了解 ...

  4. 单页应用SPA开发最佳实践

    最近用vue+vue-router做了个单页应用的项目,页面大概有15个左右.积累了一些开发经验在此做一些记录.本文主要从可维护性方面来考虑SPA的开发实践 全站的颜色定义放在一个less或者scss ...

  5. 单页应用SPA的路由

    关于单页应用 单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用 ...

  6. 基于jQuery/zepto的单页应用(SPA)搭建方案

    这里介绍一个基于jquery或zepto的单页面应用方案,遵循尽可能简单的原则,使大家一目了然,只需配置一个路由,之后完全按照jq日常写法即可完成.可做学习使用,也可修改后用于一些业务逻辑简单的spa ...

  7. 从零开始学习前端开发 — 6、CSS布局模型

    一.css布局模型 1.流动模型(Flow) 元素在不设置css样式时的布局模型,是块元素就独占一行,是内联元素就在一行逐个进行显示 2.浮动模型(Float) 使用float属性来进行网页布局,给元 ...

  8. 从零开始学习前端开发 — 3、CSS盒模型

    ★  css盒模型是css的基石,每个html标签都可以看作是一个盒模型. css盒模型是由内容(content),补白或填充(padding),边框(border),外边距(margin)四部分组成 ...

  9. 前端开发HTML&css入门——盒子模型以及部分CSS样式

    CSS处理网页时,它认为每个元素都包含在一个不可见的盒子里.• 为什么要想象成盒子呢?因为如果把所有的元素都想象成盒子,那么我们对网页的布局就相当于是摆放盒子.• 我们只需要将相应的盒子摆放到网页中相 ...

随机推荐

  1. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...

  2. mysql安装流程

    一.配置MySQL数据库 1.解压绿色版mysql,如下图 二.安装服务 1.运行cmd(管理员版本,否则没有权限),如下图 2.运行命令mysqld –install安装服务,如下图: 如果不需要m ...

  3. mina通信 demo

    1,要用到4个jar 2,服务端 package mina.server; import java.io.IOException; import java.net.InetSocketAddress; ...

  4. Usaco*Monthly Expense

    Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100 ...

  5. ntfs-3g

    CentOS默认源里没有ntfs3g,想要添加ntfs支持,无非是自己下载编译安装或者加源yum安装. 昨天重新安装了一个CentOS7,用的是添加aliyun的epel源来yum安装的方式,简单易行 ...

  6. PHP基础知识之常量

    定义: define("FOO",     "something");

  7. 关于Delphi错误:Cannot make a visible window modal

    Delphi的fsMDIChild类型的窗体是不能使用ShowModal的,否则会弹出"Cannot make a visible window modal"异常, 但是把fsMD ...

  8. TCP/IP, WebSocket 和 MQTT

    按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP和MQTT是应用层的协议.在这三者之间, TCP是HTTP和MQTT底层的协议.大家对HTTP很熟悉,这里简要介绍下MQTT.M ...

  9. 安卓动态调试七种武器之离别钩 – Hooking(上)

    安卓动态调试七种武器之离别钩 – Hooking(上) 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的 ...

  10. AngularJS基础入门初探

    一.AngularJS简介 1.1 什么是AngularJS (1)一款非常优秀的前端JS框架,可以方便实现MVC/MVVM模式 (2)由Misko Hevery 等人创建,2009年被Google所 ...