一门新的技术诞生总会引来一番争议,单页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. Tomcat7 配置 ssl

    运行一个配置了ssl的项目时tomcat总是启动不成功,报错:“requires the APR/native library which is not available”,后来发现是找不到apr的 ...

  2. CSS 页面顶部阴影和给浏览器强制加上滚动条

    /*给浏览器强制加上滚动条*/ html{height: 101%;} /*页面顶部阴影*/ body:before{ content: ""; position: fixed; ...

  3. VS 默认开发环境如何更改

    话不多说,直接上图

  4. FizzBuzzWhizz游戏的高效解法

    最近比较火的一道题(传送门),看见园友们的谈论(传送门1 传送门2),都是从1到100的扫描,我想说说的另一种想法. 可以把这道题转换成给100个人发纸牌的游戏,每人所报的就是纸牌上写的东西. 纸牌发 ...

  5. java 遍历arrayList的四种方法

    package com.test; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public ...

  6. xcodebuild命令行打包发布ipa

    配置好证书,然后在命令行转到项目目录 1.清除 EthantekiiMac:CTest ethan$ xcodebuild clean 2.编译 EthantekiiMac:CTest ethan$ ...

  7. PostgreSQL 与 MySQL 相比,优势何在?

    一. PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃.断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统 ...

  8. Web打印组件jatoolsPrinter

    应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布.但对程序员来说,因为浏览器的局限性,却要面对很多挑战.怎么样 ...

  9. .net中事件引起的内存泄漏分析

    系列主题:基于消息的软件架构模型演变 在Winform和Asp.net时代,事件被大量的应用在UI和后台交互的代码中.看下面的代码: private void BindEvent() { var bt ...

  10. Microsoft Azure Web Sites应用与实践【1】—— 打造你的第一个Microsoft Azure Website

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...