移动前端开发-单页应用(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处理网页时,它认为每个元素都包含在一个不可见的盒子里.• 为什么要想象成盒子呢?因为如果把所有的元素都想象成盒子,那么我们对网页的布局就相当于是摆放盒子.• 我们只需要将相应的盒子摆放到网页中相 ...
随机推荐
- 基于注解的Spring AOP入门、增强Advice实例
这篇文章简单通过一个例子,介绍几种增强的基本配置,以方便spring框架初学者对aop的代码结构有个清楚的了解认识.首先,spring支持aop编程,支持aspectJ的语法格式来表示切入点,切面,增 ...
- Code of Conduct
v
- sublime 编辑器配置和构建检查
sublime3插件 安装node包 jscs npm install jscs -g jshint npm install jshint -g csscomb npm install csscomb ...
- centos下为大硬盘分区(大于2T)
问题:centos/redhat下使用分区工具fdisk创建大于2TB的分区,无法创建 关键字:MBR.GPT.CHS.LBA MBR:主引导记录 GPT:GUID 分区表 CHS:磁柱 磁头 扇区 ...
- angurlarjs学习笔记
AngularJS 根作用域($rootScope) 所有的应用都有一个 $rootScope,它可以作用在 ng-app 指令包含的所有 HTML 元素中 $rootScope 可作用于整个应用中. ...
- 省市县三级联动(jqurey+json)
1.效果图 2.联动js /** * jquery.choosearea.js - 地区联动封装 */ ; (function ($) { var choosearea = function (opt ...
- 关于全排列 next_permutation() 函数的用法
这是一个c++函数,包含在头文件<algorithm>里面,下面是基本格式. 1 int a[]; 2 do{ 3 4 }while(next_permutation(a,a+n)); 下 ...
- Extjs扩展:封装Plupload
关于Plupload Plupload是一个web文件上传组件,支持通过HTML5.Silverlight.Flash或者普通的form来上传文件,提供了过滤文件类型.设置上传文件大小.上传进度.针对 ...
- Web应用程序的自动化测试库-FluentAutomation
FluentAutomation是流畅的自动化应用编程接口,支持Selenium和WatiN 连同它们所有的风格和驱动程序.自从Fluient支持Selenium,那就意味着你可以使用Selenium ...
- 【腾讯Bugly干货分享】Redex初探与Interdex:Andorid冷启动优化
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/583b9e3ee8992c2c2df6e6ac 导语 早在去年10月份,face ...