元素移动到不同的父元素后,CSS转换没有运行



我有两个元素列表,我想用一个简单的CSS转换将项目从一个列表移动到另一个列表。

逻辑:

  • 为元素添加hidden类以使其淡出(opacity: 0, width: 0, plus transition)
  • 当转换结束时,将元素移动到另一个列表
  • 删除hidden类,使元素淡入

<ul id="list1">
    <li id="item1">Item 1</li>
    <li id="item2">Item 2</li>
</ul>
<ul id="list2">
    <li id="item3">Item 3</li>
    <li id="item4">Item 4</li>
</ul>
CSS

...
li {
    display: block;
    float: left;
    height: 80px;
    margin: 0 2px;
    -webkit-transition: all 1s ease-in-out;
       -moz-transition: all 1s ease-in-out;
         -o-transition: all 1s ease-in-out;
            transition: all 1s ease-in-out;
    width: 80px;
}
li.hidden {
    opacity: 0;
    width: 0;
}
...

JS

$(document).ready(function() {
    $('li').click(function() {
        var $item = $(this),
            parentId = $item.parent().attr('id'),
            newParentSelector = (parentId == 'list1') ? '#list2' : '#list1';

        $item.addClass('hidden');
        $item.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) {
            $item.appendTo(newParentSelector);
            $item.removeClass('hidden');
        });
    });
});

当在LI项上添加.hidden类时,过渡动画按预期运行。当LI项被移动到另一个列表并且.hidden类被移除时,过渡动画不会运行,但是该项会以正确的不透明度和宽度出现。

更奇怪的是,当我手动切换一个项目的"隐藏"类(即$('#item2').toggleClass('hidden');) fade-infade-out动画运行。

我无法向你解释为什么这是有效的,但是设置一个超时(即使它是1ms)似乎使它工作。

看到小提琴。

相关代码

$item.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) {
    $item.appendTo(newParentSelector);
    setTimeout(function() {
           $item.removeClass('hidden');
    }, 1);
});

编辑1:经过测试,Chrome和FF似乎可以像我们期望的那样处理这个问题,但IE10却不想这样做。将超时时间设置为50左右就可以了。

更新的小提琴。

$item.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) {
    $item.appendTo(newParentSelector);
    setTimeout(function() {
            $item.removeClass('hidden');
    }, 50);
});

相关内容

  • 没有找到相关文章

最新更新