34avalon - 指令ms-effect(动画绑定)

简介: 34avalon - 指令ms-effect(动画绑定)

ms-effect拥有这三种绑定形式:

<p ms-effect="[@configObj,{is:'fade'}">属性值为字面量,其中一个对象必须包括is属性,这用于指定特效名</p>
<p ms-effect="{is:fade, stagger:300}">属性值为对象字面量, 里面拥有is属性</p>
<p ms-effect="@fadeConfig">属性值为vm的对象,里面拥有is属性</p>

avalon2实际上没有实现完整的动画模块,它只是对现有的CSS3动画或jquery animate再包装一层。

我们先说如何用CSS3为avalon实现动画效果。首先要使用avalon.effect注册一个特效。

avalon.effect(name, definition)

css3动画要求我们至少添加4个类名。这个是从angular那里学过来的。因此如何你以前的项目是基于angular,它那些CSS动画类可以原封不动地搬过来用。

avalon.effect('animate', {
    enterClass: 'animate-enter',
    enterActiveClass: 'animate-enter-active',
    leaveClass: 'animate-leave',
    leaveActiveClass: 'animate-leave-active', 
})

当然,这些类名会默认帮你添加,因为它内部是这样实现的。

avalon.effect = function (name, opts) {
    var definition = avalon.effects[name] = (opts || {})
    if (support.css && definition.css !== false) {`在这里插入代码片`
        patchObject(definition, 'enterClass', name + '-enter')
        patchObject(definition, 'enterActiveClass', definition.enterClass + '-active')
        patchObject(definition, 'leaveClass', name + '-leave')
        patchObject(definition, 'leaveActiveClass', definition.leaveClass + '-active')
    }
    patchObject(definition, 'action', 'enter')
}
function patchObject(obj, name, value) {
    if (!obj[name]) {
        obj[name] = value
    }
}

因此你可以简化成这样:

avalon.effect('animate', {})
avalon.effect('animate')

definition配置对象css如果等于false,那么它会强制使用JS方式

注册完,我们就需要在样式表中添加真正的CSS类。

.animate-enter, .animate-leave{
    width:100px;
    height:100px;
    background: #29b6f6;
    transition: width 2s;
    -moz-transition: width 2s; /* Firefox 4 */
    -webkit-transition: width 2s; /* Safari 和 Chrome */
    -o-transition: width 2s; /* Opera */
}  
.animate-enter-active, .animate-leave{
    width:300px;
}
.animate-leave-active{
    width:100px;
}

我们还得定义一个vm,里面指明动画的动作(默认有三种方式, enter, leave, move) 及动画结束时的回调(这是可选的)

var vm = avalon.define({
    $id: 'effect',
    aaa: "test",
    action: 'enter',
    enterCb: function(){
        avalon.log('动画完成')
    },
    leaveCb: function(){
        avalon.log('动画回到原点')
    }
})

然后页面上这样使用:

<div ms-controller='effect' >
    <div ms-effect="{is:'animate', action:@action,onEnterDone: @enterCb,onLeaveDone: @leaveCb}">
        {{@aaa}}
    </div>
    <button ms-click='@action = @action !== "leave" ? "leave": "enter"'
            type="button">click</button>
</div>

ms-effect的值为一个对象,其中is是必选。除了action, 还支持这么多种回调:

onEnterDone, onLeaveDone, onEnterAbort, onLeaveAbort, onBeforeEnter, onBeforeLeave


目录
相关文章
16avalon - 指令ms-attr(属性绑定)
16avalon - 指令ms-attr(属性绑定)
65 1
15avalon - 指令ms-important(important绑定)
15avalon - 指令ms-important(important绑定)
54 1
|
JavaScript
24avalon - 指令ms-for(循环绑定)
24avalon - 指令ms-for(循环绑定)
45 0
20avalon - 指令ms-active(active绑定)
20avalon - 指令ms-active(active绑定)
43 0
|
前端开发
17avalon - 指令ms-css(样式绑定)
17avalon - 指令ms-css(样式绑定)
52 0
33avalon - 指令ms-validate(验证绑定)
33avalon - 指令ms-validate(验证绑定)
47 0
19avalon - 指令ms-class(类名绑定)
19avalon - 指令ms-class(类名绑定)
58 0
|
前端开发
26avalon - 指令ms-duplex(各表单元素用法)
26avalon - 指令ms-duplex(各表单元素用法)
48 1
21avalon - 指令ms-hover(hover绑定)
21avalon - 指令ms-hover(hover绑定)
40 0
30avalon - 指令ms-duplex(同步后的回调)
30avalon - 指令ms-duplex(同步后的回调)
37 0