结合使用 Router 展示视图动画效果
这个demo结合使用 router 模块来展示视图切换的动画效果。demo中定义了两个视图类:TBIndexView 和 TBAnimView ,其中 TBAnimView 拓展自 PageView。
请在移动浏览器或打开chrome开发人员工具模拟移动浏览器查看demo。
Source
        Output
        QRCode
    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
    <link href="//g.alicdn.com/kissy/k/5.0.1/css/base.css" rel="stylesheet"/>
    <link href="//g.alicdn.com/kissy/k/5.0.1/navigation-view/assets/dpl.css" rel="stylesheet">
    <link href="//g.alicdn.com/kissy/k/5.0.1/scroll-view/assets/dpl.css" rel="stylesheet">
    <script src="//g.alicdn.com/kissy/k/5.0.1/seed-debug.js"></script>
    <style>
        body,html {
            height: 100%;
        }
        .ks-navigation-bar {
            position: fixed;
            height: 47px;
            width: 100%;
            box-sizing: border-box;
            z-index: 10;
        }
        .ks-navigation-view-content {
            margin-top: 47px;
        }
        ul, li {
            margin: 0;
            padding: 0;
        }
        .nav {
            color: #000;
            background: white;
            border: 1px solid #aaa;
            padding-left: 0;
        }
        .nav > li {
            text-indent: 0;
            font-size: 1.5em;
            margin: 0;
            display: block;
            position: relative;
            list-style-type: none;
            vertical-align: middle;
            box-sizing: border-box;
            padding: .5em .7em;
            padding-left: 1em;
            line-height: 1.6em;
            overflow: hidden;
            color: #000;
            border: 0;
            background: transparent;
            border-radius: 0;
            border-top: 1px solid rgba(180, 180, 180, 0.5);
        }
        .nav > li:first-child {
            border-top: 0;
        }
        .nav a {
            line-height: inherit;
            text-decoration: none;
            margin: -0.5em -0.7em;
            margin-left: -1em;
            padding-left: 1em;
            color: #000;
            display: block;
            position: relative;
            list-style-type: none;
            vertical-align: middle;
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
            box-sizing: border-box;
            padding: .5em .7em;
        }
        .nav a:after {
            -webkit-text-fill-color: #fff;
            -webkit-transform: rotate(45deg);
            vertical-align: middle;
            margin-left: -0.2rem;
            border-style: solid;
            border-color: #777;
            content: "\a0";
            display: block;
            position: absolute;
            right: 1rem;
            top: 50%;
            margin-top: -0.32rem;
            color: #999ea9;
            width: .66rem;
            height: .64rem;
            border-width: 0;
            -webkit-box-shadow: inset -0.2rem .2rem 0 #999ea9;
            box-shadow: inset -0.2rem .2rem 0;
        }
        .nav .list-item-active a {
            background: #d9d9d9;
        }
        .ks-navigation-view-content {
            background: #eeeeee;
        }
        .anim-title {
            text-align: center;
            font-size: 18px;
            line-height: 24px;
            color: #444;
            text-shadow: rgba(255, 255, 255, 0.3) 0 1px 0;
            padding: 10px;
            width: 75%;
            margin: 0 auto;
        }
        .anim-content {
            text-align: center;
            font-size: 18px;
            line-height: 24px;
            color: #444;
            text-shadow: rgba(255, 255, 255, 0.3) 0 1px 0;
            padding: 10px;
            width: 75%;
            margin: 0 auto;
        }
        /**加上下面代码定义相关类隐藏后的样式*/
        .ks-navigation-view-content > .ks-navigation-view-loading.ks-navigation-view-loading-hidden, .ks-navigation-view-content > div.ks-page-view-hidden {
            display: none;
        }
    </style>
</head>
<body>
<script type="text/javascript">
if (location.href.indexOf('useHashChange') !== -1) {
    history.pushState = null;
}
define('page-view', ['scroll-view', 'scroll-view/plugin/scrollbar'], function(require,exports,module){
    var ScrollView = require('scroll-view');
    var ScrollBar = require('scroll-view/plugin/scrollbar');
    module.exports = ScrollView.extend({
            onScroll: function (fn) {
                this.__fn = function (e) {
                    fn(e.newVal);
                };
                this.on('afterScrollTopChange', this.__fn);
            },
            getContentEl: function () {
                return this.get('contentEl');
            },
            unScroll: function () {
                this.detach('afterScrollTopChange', this.__fn);
            }
        }, {
            ATTRS: {
                plugins: {
                    valueFn: function () {
                        return [ScrollBar];
                    }
                }
            }
        });
});
require(['util', 'navigation-view', 'navigation-view/bar', 'node', 'event-dom/gesture/tap', 'event-dom/gesture/basic', 'router', 'promise', 'page-view'], function (util,NavigationView, Bar, $, TapGesture, BasicGesture, router, Promise, PageView) {
    var S = modulex;
        var tap = TapGesture.TAP;
        var win = $(window);
        var anims = [
            {
                content: 'default-anim'
            },
            {
                content: 'none-anim',
                value: 'none'
            },
            {
                content: 'slide-left-anim',
                value: ['slide-left', 'slide-right']
            },
            {
                content: 'slide-top-anim',
                value: ['slide-top', 'slide-bottom']
            },
            {
                content: 'slide-bottom-anim',
                value: ['slide-bottom', 'slide-top']
            },
            {
                content: 'fade-anim',
                value: 'fade'
            },
            {
                content: 'pop-anim',
                value: 'pop'
            },
            {
                content: 'flip-left-anim',
                value: ['flip-left', 'flip-right']
            },
            {
                content: 'flip-right-anim',
                value: ['flip-right', 'flip-left']
            },
            {
                content: 'swap-left-anim',
                value: ['swap-left', 'swap-right']
            },
            {
                content: 'swap-right-anim',
                value: ['swap-right', 'swap-left']
            },
            {
                content: 'cube-left-anim',
                value: ['swap-left', 'swap-right']
            },
            {
                content: 'cube-right-anim',
                value: [ 'swap-right', 'swap-left']
            },
            {
                content: 'flow-left-anim',
                value: ['flow-left', 'flow-right']
            },
            {
                content: 'flow-right-anim',
                value: ['flow-right', 'flow-left']
            },
            {
                content: 'turn-anim',
                value: 'turn'
            }
        ];
        var menuContent = '<ul class="nav">';
        util.each(anims, function (anim) {
            menuContent += '<li class="list-item"><a tabindex="0">' + anim.content + '</a></li>';
        });
        var getAnimValue = function (content) {
            for (var i = 0; i < anims.length; i++) {
                if (anims[i].content === content) {
                    return anims[i].value;
                }
            }
            return null;
        };
       var TBIndexView = PageView.extend({
            enter: function (cfg) {
                // console.log('enter index ' + (cfg.fromCache ? 'from cache!' : ''));
                win.on('resize', this.sync, this);
                this.sync();
            },
            leave: function () {
                console.log('leave index');
                win.detach('resize', this.sync, this);
            },
            bindUI: function () {
                this.$el.delegate(tap, '.list-item', this.onMenuItemClick, this);
                this.$el.delegate(BasicGesture.START, '.list-item', function (e) {
                    e.currentTarget.classList.add('list-item-active');
                });
                this.$el.delegate(BasicGesture.END, '.list-item', function (e) {
                    e.currentTarget.classList.remove('list-item-active');
                });
                this.onScroll(function (top) {
                    // console.log(top);
                });
            },
            onMenuItemClick: function (e) {
                router.navigate('/' + util.trim(e.currentTarget.innerText));
            }
        }, {
            xclass: 'tb-index-view',
            ATTRS: {
                content: {
                    value: menuContent
                },
                title: {
                    value: 'navigation-view'
                }
            }
        });
        var tpl = '<h2 class="anim-title">{title}</h2>' +
            '<p class="anim-content">Sed ut perspiciatis unde omnis iste natus error ' +
            'sit voluptatem accusantium doloremque laudantium, ' +
            'totam rem aperiam, eaque ipsa quae ab illo inventore ' +
            'veritatis et quasi architecto beatae vitae dicta sunt ' +
            'explicabo. Nemo enim ipsam voluptatem quia voluptas sit ' +
            'aspernatur aut odit aut fugit, sed quia consequuntur magni ' +
            'dolores eos qui ratione voluptatem sequi nesciunt. Neque porro ' +
            'quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, ' +
            'adipisci velit, sed quia non numquam eius modi tempora incidunt ut ' +
            'labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima ' +
            'veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, ' +
            'nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum ' +
            'iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae ' +
            'consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>';
        tpl += tpl;
        tpl += tpl;
        tpl += tpl;
        var TBAnimView = PageView.extend({
            enter: function (cfg) {
                console.log('enter detail ' + (cfg.fromCache ? 'from cache!' : ''));
                win.on('resize', this.sync, this);
                this.sync();
            },
            leave: function () {
                console.log('leave detail');
                win.detach('resize', this.sync, this);
            },
            createDom: function () {
                this.getContentEl().html(util.substitute(tpl, {
                    title: this.get('viewId')
                }));
            },
            retIndex: function () {
                router.navigate('/');
            },
            bindUI: function () {
                this.getContentEl().delegate('click', '.retIndex', this.retIndex, this);
            }
        }, {
            xclass: 'tb-anim-view'
        });
        var navigationView = new NavigationView({
            loadingHtml: '<div class="ks-navigation-view-loading-outer">' +
                '<div class="ks-navigation-view-loading-inner"></div>' +
                '</div>',
            render: 'body'
        }).render();
        var bar = new Bar({
            navigationView: navigationView,
            elBefore: navigationView.get('contentEl')
        }).render();
        router.get('/', function (request) {
            if (!request.backward) {
                navigationView.push({
                    xclass: 'tb-index-view'
                });
            }
        });
        router.get('/:anim', function (request) {
            if (!request.backward) {
                var animation = getAnimValue(request.params.anim);
                if (animation) {
                    navigationView.replace({
                        animation: animation
                    });
                }
                navigationView.push({
                    xclass: 'tb-anim-view',
                    title: request.params.anim,
                    viewId: request.params.anim,
                    animation: animation
                });
            }
        });
        router.config({
            urlRoot: location.pathname,
            useHash: !window.useNativeHistory,
            triggerRoute: true
        });
        router.start();
    });
</script>
</body>
</html>
         
		