binding - 当图像 src 绑定(bind)更改时,knockout js 淡入淡出过渡绑定(bind)处理程序

标签 binding knockout.js bindinghandlers

如果我有以下简单的 js/knockout 代码:

.js( View 模型):

var image = ko.observable('http://placehold.it/300x150');

查看:

<img data-bind={attr: {src: image}} />

如何创建 ko 绑定(bind)处理程序,以便在图像属性更改时执行简单的交叉淡入淡出?

最佳答案

我认为最好的解决方案是创建另一个图像并将其淡入。

这是一个简单的绑定(bind)处理程序,每次更新源可观察对象时,它都会在绑定(bind)元素内创建一个新图像(在本例中是一个带有背景图像的 div),并使用 CSS3 动画淡入淡出:

ko.bindingHandlers.transitionImage = {
    init: function (element, valueAccessor) {
        // create a holder for the images
        var holder = document.createElement('div');
        holder.style['position'] = 'relative';
        holder.style['height'] = '100%';
        holder.style['width'] = '100%';
        element.appendChild(holder);

        // create initial image
        var url = ko.utils.unwrapObservable(valueAccessor());
        var fore = document.createElement('div');
        fore.style['background-image'] = 'url(' + url + ')';
        fore.style['position'] = 'absolute';
        fore.style['height'] = '100%';
        fore.style['width'] = '100%';
        fore.style['background-size'] = '100% 100%'
        holder.appendChild(fore);
    },
    update: function (element, valueAccessor) {
        var url = ko.utils.unwrapObservable(valueAccessor());

        // retrieve the holder element
        var holder = element.childNodes[0];

        // create new image to transition to
        var fore = document.createElement('div');
        fore.className = 'transition';
        fore.style['background-image'] = 'url(' + url + ')';
        fore.style['position'] = 'absolute';
        fore.style['height'] = '100%';
        fore.style['width'] = '100%';
        fore.style['background-size'] = '100% 100%'
        fore.style['opacity'] = '0'; // ensure it is hidden
        holder.appendChild(fore);

        // CSS3 animate opacity
        setTimeout(function () {
            fore.style['opacity'] = '1';
        }, 0);

        // dispose of unnecessary hidden images eventually
        setTimeout(function () {
            var toRemove = holder.childNodes[0];
            var removed = holder.removeChild(toRemove);
            delete removed;
        }, 10000);
    }
};

它需要一些 CSS 才能使不透明度变得动画:

div.transition {
    -webkit-transition: opacity 0.5s linear;
    -moz-transition: opacity 0.5s linear;
    -o-transition: opacity 0.5s linear;
    transition: opacity 0.5s linear;
}

要使用它,请将其绑定(bind)到 div 容器:

<div data-bind="transitionImage: image" style="width: 100px; height: 100px"></div>

这种方法的优点是,只需使用 CSS 就可以很容易地替换更复杂的动画,例如滑动。

Here is a fiddle for it!

关于binding - 当图像 src 绑定(bind)更改时,knockout js 淡入淡出过渡绑定(bind)处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17121458/

相关文章:

mvvm - 根据不同的数据绑定(bind)到自定义构建的控件

c# - 更改属性的自定义控件和 View 模型绑定(bind)

html - 剑道击倒 : NumericTextBox show validation message on inserting more than max value

javascript - MVVM Javascript 与传统 ASP.NET MVC 网站的可扩展性比较如何

javascript - 绑定(bind)处理程序 'value is not a function' knockoutJS

javascript - 无法读取未定义的 Backbone.js 属性 'bind'

javascript - Knockout.js - foreach 表的每一行上的文本输入,应该只编辑该行上的字段

knockout.js - 带有 afterAdd 的 Knockoutjs foreach 自定义绑定(bind)处理程序

knockout.js - 带有 Knockout 和 RequireJS 的自定义绑定(bind)处理程序

cocoa - 将 NSArrayController 绑定(bind)到 NSDictionary allValues