由于添加另一个元素而移动的元素的 DOM 动画

Posted

技术标签:

【中文标题】由于添加另一个元素而移动的元素的 DOM 动画【英文标题】:DOM animation for elements moved because of adding another Element 【发布时间】:2015-12-01 15:53:58 【问题描述】:

我的问题取决于以下情况:

我有一个 JS 脚本,它将一个 span 元素添加到一个 div 中。由于 div 有一个 text-align:middle;,一旦新的 span 被追加或删除,已经存在的 span 就会向左或向右“跳跃”。

有没有什么方法可以为元素的跳转设置动画,而无需在每次添加元素时在容器 div 中的每个 span 元素的代码中手动计算它?

你可以在这里看到我的问题:http://dev.choozi.de/slide/tags.php,当你点击一个标签时,其他人会跳进上面的蓝色框。

为了更清楚起见,由于我正在添加新元素而正在移动的其他元素应该向左或向右滑动,以便为新元素腾出足够的空间,而不是跳跃。

我想为 CSS 过渡提供类似的东西,但对于所有 DOM 过渡。

* 
    -webkit-transition: all 0.5s;
    -moz-transition: all 0.5s;
    -o-transition: all 0.5s;
    transition: all 0.5s;

有没有这样的项目或通过 jQuery 或 JS 处理该问题的简单方法?

感谢您的时间和帮助。

【问题讨论】:

这是一个使用 JQuery 制作动画的尝试:jsfiddle。我尝试用 CSS 过渡做类似的事情,但我对它们不太熟悉。 【参考方案1】:

根据@John S 的回答,我编写了一些代码,效果很好:

HTML

<div class="choosen_tags_holder"></div>

CSS

.choosen_tags_holder span 
    padding: 0 8px;
    display: inline-block;
    overflow-x: hidden;
    white-space: nowrap;

JS

/* ===== REMOVES THE CLICKED ELEMENT FROM THE CONTAINER ===== */
function removeFromTagContainer(liElement) 
    $('.choosen_tags_holder span').each(function (e) 
        if ($(this).html() === liElement.next().html()) 
            $(this).animate( width: 0 , '500');
            $(this).animate( padding: 0 , '100');
            removeContent($(this));
        
    ); 


/* ===== ADDS THE CLICKED ELEMENT TO THE CONTAINER ===== */
function addToTagContainer(liElement) 
    var $span = $('<span>'+liElement.next().html()+'</span>').hide().prependTo(choosenTagsContainer);
    var width = $span.width();
    $span.css( width: 0 ).show().animate( width: width , '500');
 

它工作时的样子?这里:http://dev.choozi.de/slide/tags.php

它不是像我的问题中的 CSS 代码那样的通用解决方案,但它确实适用于添加和动画 DOM 元素的大多数问题。

非常感谢您的帮助!

【讨论】:

以上是关于由于添加另一个元素而移动的元素的 DOM 动画的主要内容,如果未能解决你的问题,请参考以下文章

将元素从一个父级移动到另一个父级的反应动画

从 dom 节点到 dom 节点的 javascript/css 动画

Win10系列:JavaScript动画2

JQuery - 我可以用 jquery 移动数组元素吗?并将它们存储在另一个数组中?

Angular/CSS - 动态添加新元素时动画内容的移动

Internet Explorer:当目标 DOM 元素在 DOM 中移动时,悬停状态变为粘滞状态