移动前端开发-单页应用(spa)模型
一门新的技术诞生总会引来一番争议,单页Web应用程序也不例外,其最大的优势在于用户体验,对于内容的改动不需要加载整个页面;对服务器压力很小,消耗更少的带宽,与面向服务的架构更好地结合。使用HTML+CSS+JavaScript编写应用程序,能使更多的开发者都加入到程序开发的行列。
单页面应用是指用户通过浏览器加载独立的HTML页面并且无需离开此导航页面,这也是其独特的优势所在。对用户操作来说,一旦加载和执行单个页面应用程序通常会有更多的响应,这就需要返回到后端Web服务器,而单页面应用为用户提供了更接近一个本地移动或桌面应用程序的体验。
单页Web应用程序的优点:
- 首先,最大的好处是用户体验,对于内容的改动不需要加载整个页面。这样做好处颇多,因为数据层和UI的分离,可以重新编写一个原生的移动设备应用程序而不用(对原有数据服务部分)大动干戈。
- 单页面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)模型的更多相关文章
- 从单页应用(SPA)到服务器渲染(SSR)
从单页应用(SPA)到服务器渲染(SSR) 情景回顾 在学习Vue开发一个电商网站的管理后台时,使用到了一个组件 vue-quill-editor 主要是一个快捷的一个富文本编辑器 在使用这个组件的组 ...
- 单页应用SPA做SEO的一种清奇的方案
单页应用SPA做SEO的一种清奇的方案 网上有好几种单页应用转seo的方案,有服务端渲染ssr.有预渲染prerender.google抓AJAX.静态化...这些方案都各有优劣,开发者可以根据不同的 ...
- 《移动Web前端高效开发实战》笔记4--打造单页应用SPA
路由是一个单页应用的核心,大部分前端框架都实现了一个复杂的路由库,包括动态路由,路由钩子,组件生命周期甚至服务器端渲染等复杂的功能.但是对于前端开发者而言,路由组件的核心是URL路径到函数的映射,了解 ...
- 单页应用SPA开发最佳实践
最近用vue+vue-router做了个单页应用的项目,页面大概有15个左右.积累了一些开发经验在此做一些记录.本文主要从可维护性方面来考虑SPA的开发实践 全站的颜色定义放在一个less或者scss ...
- 单页应用SPA的路由
关于单页应用 单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用 ...
- 基于jQuery/zepto的单页应用(SPA)搭建方案
这里介绍一个基于jquery或zepto的单页面应用方案,遵循尽可能简单的原则,使大家一目了然,只需配置一个路由,之后完全按照jq日常写法即可完成.可做学习使用,也可修改后用于一些业务逻辑简单的spa ...
- 从零开始学习前端开发 — 6、CSS布局模型
一.css布局模型 1.流动模型(Flow) 元素在不设置css样式时的布局模型,是块元素就独占一行,是内联元素就在一行逐个进行显示 2.浮动模型(Float) 使用float属性来进行网页布局,给元 ...
- 从零开始学习前端开发 — 3、CSS盒模型
★ css盒模型是css的基石,每个html标签都可以看作是一个盒模型. css盒模型是由内容(content),补白或填充(padding),边框(border),外边距(margin)四部分组成 ...
- 前端开发HTML&css入门——盒子模型以及部分CSS样式
CSS处理网页时,它认为每个元素都包含在一个不可见的盒子里.• 为什么要想象成盒子呢?因为如果把所有的元素都想象成盒子,那么我们对网页的布局就相当于是摆放盒子.• 我们只需要将相应的盒子摆放到网页中相 ...
随机推荐
- jqueryAjax在客户端发送请求的方式
get请求方式: $.get函数,发起一个get请求, //第一个参数是请求的url地址, //第二个参数是请求参数,可以是一个urlencode过的字符串,也可以是//一个对象,如果是对象jquer ...
- iOS. PercentEscape是错用的URLEncode,看看AFN和Facebook吧
别再使用stringByAddingPercentEscapesUsingEncoding 当遇到发送网络请求的参数中有汉字的情况,很多人一股脑地使用stringByAddingPercentEsca ...
- sqlplus运行sql文件
当sql文件的数据比较多的时候,pl/sql运行比较慢,可以通过oracle的sqlplus进行导入: sqlplus user/password@tnsname@sqlfile.sql; 注意如果文 ...
- 运行错误:error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or
链接时可以通过-L和-l来指定自己的库,因此链接可以通过,但是运行时,系统仍无法找到指定的库,需要简单配置一下. 解决方法: 可以直接在将自己的库所在路径添加到/etc/ld.so.conf文件中.但 ...
- dp入门--poj 1163数塔
...
- JSON详解
首先要知道JSON是一种轻量级的数据格式,不是一种编程语言,因此其他语言也可以使用. 一.JSON语法 JSON语法可以表现为下面三种值: 1.简单值:字符串.数值.布尔值和null,如"h ...
- >hibernate-session中的方法
1.操作实体对象的方法 save() 保存 update() 更新 saveOrUpdate() 保存或更新 delete() 删除 2.操作缓存的方法 clear() 清除所有缓存 evit() ...
- WPF整理-二进制资源和内容
WPF中的Binary Resource(二进制资源)是相对于前面所说的Logical resource(逻辑资源)而说的,一般指Image.XML文件等. 注意:这里说的是Resource" ...
- C# winfrom HttpWebRequest 请求获取html网页信息和提交信息
string result =GetRequest("http://localhost:32163/DuoBao/ajax.aspx", "time=5"); ...
- Visual Studio LightSwitch
LightSwitch是一个基于模板的自动化开发Silverlight和HTML5应用程序的工具,不同于一般的基于数据字典,配置生成的应用程序的工具,因为LightSwtich提供的所有模板都是可以扩 ...