用ng-view创建单页APP

我们假设我们有一个单页面的程序,并且想为这个页面添加动画效果。点击某一个链接会将一个试图滑出,同时将另一个试图滑入。

我们将会使用:

  • 使用 ngRoute 来为我们的页面路由
  • 使用 ngAnimate 来为页面创建动画效果
  • 对页面使用 CSS Animations
  • 当我们离开或进入试图时,我们的每一个页面会有不同的动画效果

让我们看一下ngAnimate是如何工作的。ngAnimate 会根据是进入还是离开视图来为不同的Angular 指令(directive)添加和移除不同的CSS类名。例如,当我们加载网站时,无论ng-view中填充了什么都会得到一个.ng-enter的类名。

我们所需要做的就是给.ng-enter 类名添加CSS动画效果,该动画在进入的时候会自动生效。

ngAnimate 可以应用于: ngRepeat, ngInclude, ngIf, ngSwitch, ngShow, ngHide, ngView 以及 ngClass

需要的文件列表:

- index.html
- style.css
- app.js
- page-home.html
- page-about.html
- page-contact.html

index.html,
加载我们需要的资源,定义我们的Angular app,并且为我们注入的视图添加ng-view类名。
<html>
<head>

    <!-- CSS -->
    <!-- load bootstrap (bootswatch version) -->
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootswatch/3.1.1/readable/bootstrap.min.css">
    <link rel="stylesheet" href="style.css">

    <!-- JS -->
    <!-- load angular, ngRoute, ngAnimate -->
    <script type="text/javascript" src="http://apps.bdimg.com/libs/angular.js/1.2.13/angular.min.js"></script>
    <script src="http://lib.baomitu.com/angular.js/1.2.13/angular-route.min.js"></script>
    <script src="http://lib.baomitu.com/angular.js/1.2.13/angular-animate.min.js"></script>
    <script src="app.js"></script>

</head>

<!-- apply our angular app -->
<body ng-app="animateApp">

    <!-- inject our views using ng-view -->
    <!-- each angular controller applies a different class here -->
    <div class="page {{ pageClass }}" ng-view></div>

</body>
</html>

app.js

现在,我们需要将会创建一个带路由的Angular程序,以便我们可以在不刷新页面的情况下修改我们的页面。

// define our application and pull in ngRoute and ngAnimate
var animateApp = angular.module(‘animateApp‘, [‘ngRoute‘, ‘ngAnimate‘]);

// ROUTING ===============================================
// set our routing for this application
// each route will pull in a different controller
animateApp.config(function($routeProvider) {

    $routeProvider

        // home page
        .when(‘/‘, {
            templateUrl: ‘page-home.html‘,
            controller: ‘mainController‘
        })

        // about page
        .when(‘/about‘, {
            templateUrl: ‘page-about.html‘,
            controller: ‘aboutController‘
        })

        // contact page
        .when(‘/contact‘, {
            templateUrl: ‘page-contact.html‘,
            controller: ‘contactController‘
        });

});

// CONTROLLERS ============================================
// home page controller
animateApp.controller(‘mainController‘, function($scope) {
    $scope.pageClass = ‘page-home‘;
});

// about page controller
animateApp.controller(‘aboutController‘, function($scope) {
    $scope.pageClass = ‘page-about‘;
});

// contact page controller
animateApp.controller(‘contactController‘, function($scope) {
    $scope.pageClass = ‘page-contact‘;
});

page-home.html

<!-- page-home.html -->
<h1>Angular Animations Shenanigans</h1>
<h2>Home</h2>

<a href="#about" class="btn btn-success btn-lg">About</a>
<a href="#contact" class="btn btn-danger btn-lg">Contact</a>

page-about.html

<!-- page-about.html -->
<h1>Animating Pages Is Fun</h1>
<h2>About</h2>

<a href="#" class="btn btn-primary btn-lg">Home</a>
<a href="#contact" class="btn btn-danger btn-lg">Contact</a>

page-contact.html

<!-- page-contact.html -->
<h1>Tons of Animations</h1>
<h2>Contact</h2>

<a href="#" class="btn btn-primary btn-lg">Home</a>
<a href="#about" class="btn btn-success btn-lg">About</a>

style.css

/* make our pages be full width and full height */

/* positioned absolutely so that the pages can overlap each other as they enter and leave */

.page {
    bottom: 0;
    padding-top: 200px;
    position: absolute;
    text-align: center;
    top: 0;
    width: 100%;
}

.page h1 {
    font-size: 60px;
}

.page a {
    margin-top: 50px;
}

/* PAGES (specific colors for each page)
============================================================================= */

.page-home {
    background: #00D0BC;
    color: #00907c;
}

.page-about {
    background: #E59400;
    color: #a55400;
}

.page-contact {
    background: #ffa6bb;
    color: #9e0000;
}

/* ANIMATIONS
============================================================================= */

.ng-enter {
    animation: scaleUp 0.5s both ease-in;
    z-index: 8888;
}

.ng-leave {
    animation: slideOutLeft 0.5s both ease-in;
    z-index: 9999;
}

.ng-enter {
    z-index: 8888;
}

.ng-leave {
    z-index: 9999;
}

/* page specific animations ------------------------ */

/* home -------------------------- */

.page-home.ng-enter {
    animation: scaleUp 0.5s both ease-in;
}

.page-home.ng-leave {
    transform-origin: 0% 0%;
    animation: rotateFall 1s both ease-in;
}

/* about ------------------------ */

.page-about.ng-enter {
    animation: slideInRight 0.5s both ease-in;
}

.page-about.ng-leave {
    animation: slideOutLeft 0.5s both ease-in;
}

/* contact ---------------------- */

.page-contact.ng-leave {
    transform-origin: 50% 50%;
    animation: rotateOutNewspaper .5s both ease-in;
}

.page-contact.ng-enter {
    animation: slideInUp 0.5s both ease-in;
}

/* leaving animations ----------------------------------------- */

/* rotate and fall */

@keyframes rotateFall {
    0% {
        transform: rotateZ(0deg);
    }
    20% {
        transform: rotateZ(10deg);
        animation-timing-function: ease-out;
    }
    40% {
        transform: rotateZ(17deg);
    }
    60% {
        transform: rotateZ(16deg);
    }
    100% {
        transform: translateY(100%) rotateZ(17deg);
    }
}

/* slide in from the bottom */

@keyframes slideOutLeft {
    to {
        transform: translateX(-100%);
    }
}

/* rotate out newspaper */

@keyframes rotateOutNewspaper {
    to {
        transform: translateZ(-3000px) rotateZ(360deg);
        opacity: 0;
    }
}

/* entering animations --------------------------------------- */

/* scale up */

@keyframes scaleUp {
    from {
        opacity: 0.3;
        -webkit-transform: scale(0.8);
    }
}

/* slide in from the right */

@keyframes slideInRight {
    from {
        transform: translateX(100%);
    }
    to {
        transform: translateX(0);
    }
}

/* slide in from the bottom */

@keyframes slideInUp {
    from {
        transform: translateY(100%);
    }
    to {
        transform: translateY(0);
    }
}

我们将使用CSS来添加所有的动画效果。这种方法很棒,因为我们所要做的事就是添加ngAnimate,并且不用修改我们的代码就可以添加CSS动画效果。

ngAnimate为我们的ng-view添加的两个类分别是.ng-enter和.ng-leave。你可以想象一些他们各自的作用。

我们定义了6个不同的动画效果。每一个页面都会有他们各自的ng-enter 和 ng-leave 的动画效果。

时间: 2024-10-24 17:16:16

用ng-view创建单页APP的相关文章

七天学会ASP.NET MVC(七)——创建单页应用

注:本文为学习摘录,原文地址为:http://www.cnblogs.com/powertoolsteam/p/MVC_Seven.html 目录 引言 最后一篇学什么 实验32—整理项目组织结构 关于实验32 实验33——创建单页应用——第一部分—安装 什么是Areas? 关于实验33 实验34——创建单页应用——第二部分—显示Employee 实验35——创建单页应用——第三部分—新建Employee 实验36——创建单页应用——第三部分—上传 实验32 ———整理项目组织结构 实验32与其

Nodejs之MEAN栈开发(六)---- 用Angular创建单页应用

在上一节中我们学会了如何在页面中添加一个组件以及一些基本的Angular知识,而这一节将用Angular来创建一个单页应用(SPA).这意味着,取代我们之前用Express在服务端运行整个网站逻辑的方式(jade.路由都需要在服务端编译),我们将用Angular在客户端浏览器上跑起来.PS:在正常的开发流程上,我们可能不会在服务器端创建了一个网站,然后又用SPA重建它.但从学习的角度来说这还不错,这样掌握了两种构建方式. 上一节所有Angular相关的代码都在一个js里面,这不便管理和维护,这一

vue学习二:用 Vue.js + Vue Router 创建单页应用的几个步骤

通过vue学习一:新建或打开vue项目,创建好项目后,接下来的操作为: src目录重新规划——>新建几个页面——>配置这几个页面的路由——>给根实例注入路由配置 src目录重整 在项目中创建如下对应的文件 ├── App.vue // APP入口文件 ├── api // 接口调用工具文件夹 │ └── index.js // 接口调用工具 ├── components // 组件文件夹,目前为空 ├── config // 项目配置文件夹 │ └── index.js // 项目配置文

单页网站不是梦,几款国外的单页网站创建工具

单页网站已经流行很久了,受到很多人的喜爱.从立体动感的视差滚动效果和流畅的动画到固定和干净的菜单,你会发现单页网站的效果真的很酷! 在这篇文章中,我们寻找了一些真正好用的单页网站创建工具分享给大家.这些工具对于那些想要一个方便的方法来创建单页网站的在线作品集网站或引导页面的人来说很有用.这些服务的最酷??的部分是,他们开箱即用的精美主题可以让制作出来的网页有华丽的外观. 您可能感兴趣的相关文章 经典网页设计:超炫动画效果单页网站 30个独具匠心的精美单页网站设计案例 25个以全屏照片为背景的精美

Singal Page App:使用Knockout和RequireJS创建高度模块化的单页应用引擎

开篇扯淡 距离上一篇文章已经有好几个月,也不是没有时间记录点东西,主要是换了新的工作,在一家外资工作,目前的工作内容大多都是前端开发,新接触的东西因为时间原因,大多还不成体系,所以这么长时间什么都没记录下来,也正是因为新的工作内容,才有了今天这篇文章. 这篇文章是我自己的博客项目的前端重写,因为目前ASP.NET API和单页应用的流行,结合目前工作中用到的东西,我决定把我的博客项目的前端部分整个重写,(以前的就是一坨-) 步入正题 背景知识 RequireJS http://www.requi

【单页应用之通信机制】view之间应该如何通信

前言 在单页应用中,view与view之间的通信机制一直是一个重点,因为单页应用的所有操作以及状态管理全部发生在一个页面上 没有很好的组织的话很容易就乱了,就算表面上看起来没有问题,事实上会有各种隐忧,各种坑等着你去跳 最初就没有一定理论上的支撑,极有可能是这么一种情况: ① 需求下来了,搞一个demo做交待 ② 发现基本满足很满意,于是直接在demo中做调整 上面的做法本身没有什么问题,问题发生在后期 ③ 在demo调整后应用到了实际业务中,发现很多地方有问题,于是见一个坑解决一个坑 ④ 到最

HTML5单页框架View.js介绍

什么是单页应用单页应用,是指将用户视觉上的多个页面在技术上使用一个载体来实现的应用. 换句话来讲,用户视觉效果,与技术实现的载体,并不是一定要一一对应的.采取哪种技术方案,取决于产品设计.技术组成以及方案之间的优劣平衡.放到 Web 前端环境中,这个承载了多个视觉效果的载体,就是 html 文件(或 asp,jsp 等). 为便于描述,本文将使用多个术语.其名称及对应的含义如下所示: 页面:技术上的一个html文件:视图:视觉上的一页内容:初步实现单页应用直观效果的单页应用,其实现过程其实并不复

Vue 基于node npm &amp; vue-cli &amp; element UI创建vue单页应用

基于node npm & vue-cli & element UI创建vue单页应用 开发环境   Win 10   node-v10.15.3-x64.msi 下载地址: https://nodejs.org/en/ 安装node 安装vue-cli 1.安装node-v10.15.3-x64.msi 2.设置注册地址 因为npm官方仓库在国外,有时候下载速度会非常慢,不过有淘宝镜像可以使用,下载包的速度很快.而且淘宝镜像是定时更新同步npm的官方仓库的. npm config set

【单页应用】view与model相关梳理

前情回顾 根据之前的学习,我们形成了一个view与一个messageCenterview这块来说又内建了一套mvc的东西,我们这里来理一下首先View一层由三部分组成:① view② dataAdpter③ viewController view一块两个重要数据是模板以及对应data,一个状态机status这里view只负责根据状态取出对应的模板,而后根据传入的数据返回组装好的html这里一个view多种状态是什么意思呢?比如我有一个组件,但是里面有一圈数据是需要Ajax请求的,所以我的view