用javascript实现的单页应用骨架模型

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

用javascript实现的单页应用骨架模型

时间: 2024-08-29 20:55:09

用javascript实现的单页应用骨架模型的相关文章

mobilebone.js-mobile移动web APP单页切换骨架

昨天看到张鑫旭前辈发了一条微博,便互动了下,是他的一个开源移动端框架,没事看看,这是效果

mobilebone.js 移动web APP单页切换骨架

轻便体积小 原生无依赖 插件可扩展 设计无限制 动效可定制 动静两相宜 能进亦能退 桌面也兼修 一句话功能简介跟传统网页浏览的差别仅仅在于无刷新! 例如,我们浏览首页,首页上有个如下HTML链接: <a href="mocamoca.html">摩擦摩擦</a> 在传统页面,页面会刷新跳转至mocamoca.html, 但是,引入mobilebone.js后,就是无属性滑动到mocamoca.html页面. 二.mobilebone.js项目.资源以及八卦 Mo

单页开发web app项目中使用的技术点总结

首先项目中需要的技术依赖于业务,所以先说下业务概述 1.业务概述 个人用户在线申请房源 2.技术分解 2.1 项目布局结构 2.2 开发环境 2.2.1安装NodeJS环境 @echo offrem ======= 如何安装handlebars编译器 =======rem 1.到https://nodejs.org/下载并安装nodejsrem 2.打开cmd并定位到项目目录rem 3.执行npm install handlebars -g命令rem 4.执行npm install grunt-

vue+vuex构建单页应用

基本 构建工具: webpack 语言: ES6 分号:行首分号规则(行尾不加分好, [ , ( , / , + , - 开头时在行首加分号) 配套设施: webpack 全家桶, vue 全家桶 项目结构 基本目录结构 api :封装与后端接口交互的操作 common :放置一些 reset.css 之类的 components :组件 entry :项目入口文件 index.js,index.css,index.html filters :过滤器.注:虽然 vue2.0 已经基本废弃(只保留

《单页web应用 javaScript从前端到后端》3.1 开发shell小例子demo

目前看到这里,还不懂什么是单页应用,这不就是一个普通的点击滑开收缩的动画而已--作者写的那么复杂666 请转载此文的朋友务必附带原文链接,谢谢. 原文链接:http://xuyran.blog.51cto.com/11641754/1891022 spa.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <li

实战经验:快速构建H5单页面切换骨架

在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用程序,应用中所有的视图都包含在这个HTML页面中,并通过JavaScript控制相关视图的显示和隐藏,这种模式可以让用户在Web App感受Native App的速度和流畅.本篇文章的目的就是教你如何来快速的构建一个H5单页面切换骨架. 一. 页面设计 在构建SPA应用时,首先要确定你的应用需要包含

快速构建H5单页面切换骨架

原文  http://www.cnblogs.com/onepixel/p/5156442.html 在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用程序,应用中所有的视图都包含在这个HTML页面中,并通过JavaScript控制相关视图的显示和隐藏,这种模式可以让用户在Web App感受Native App的速度和流畅.本篇文章的目的就是教你如

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜

记录:掌握单页网站设计的5大技巧

在设计师们的不懈探究之下,单页设计已经摘掉了混乱单调的帽子,构建起了一套相对比较完善的设计体系,保持简洁而漂亮的设计,重视内容,强调清晰明了的表达.从用户体验的角度上来看,单页设计确实有其优势也有缺陷,但是值得注意的是,用户的确是喜欢单页网站的浏览方式,这也是单页设计流行开来的基石. ·单页网站导航方式简单,用户不易迷路,只需上下滚动. ·单页网站内容更专注,信息传递更清晰,更有针对性. ·单页网站几乎可以在全平台设备上流畅浏览,滚动和滑动浏览替代了点击 而设计单页网站最大的挑战在于让用户保持滚