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

从dom节点到dom节点的javascript/css动画,javascript,html,css,animation,Javascript,Html,Css,Animation,ng animate ref允许创建从一个dom节点到另一个dom节点的转换 ng animate使用第一个dom元素和第二个dom元素中的所有css样式,如位置、字体大小、字体颜色等,并创建css 3动画,将元素从状态a移动到状态b 这正是我需要的,但不幸的是,我不能在当前项目中使用Angular 1 是否有任何可重用的方法来实现相同的css3动画,而无需将所有样式从我的css文件移动到javascript 为了说明这个问题,请参见下面的示例。 如您所见,该示例根本没有自定义javascrip

ng animate ref
允许创建从一个dom节点到另一个dom节点的转换

ng animate使用第一个dom元素和第二个dom元素中的所有css样式,如
位置
字体大小
字体颜色
等,并创建css 3动画,将元素从状态
a
移动到状态
b

这正是我需要的,但不幸的是,我不能在当前项目中使用Angular 1

是否有任何可重用的方法来实现相同的css3动画,而无需将所有样式从我的css文件移动到javascript

为了说明这个问题,请参见下面的示例。 如您所见,该示例根本没有自定义javascript动画代码,只有javascript代码处理从列表
a
b
的状态逻辑切换元素

动画定义是用纯css编写的

演示:

预览:

当然,
jqueryanimate
可以在没有任何插件的情况下实现它

也许代码行不多,但它们确实有些复杂

是您想要的(ps:
jqueryui
仅用于更改颜色)

$(文档).ready(函数(){
var animating=false,
持续时间=300;
$('.items')。在(“单击“,”.items链接),函数()上{
如果(动画)返回;
动画=真;
变量$this=$(this),
dir=$this.parent().hasClass(“items-l”)?“r”:“l”,
color=dir==“l”?“0000FF”:“F00000”,
index=$this.attr(“数据索引”);
变量toItems=$('.items-'+dir),
itemsLinks=toItems.find(“.items链接”),
newEle=$this.clone(true),
nextEle=$this.next(),
托尔;
if(itemsLinks.length==0){
toItems.append(newEle)
}否则{
itemsLinks.each(函数(){
if($(this).attr(“数据索引”)>index){
toEle=$(本);
返回false;
}
});
伊夫(托尔){
toEle.before(newEle)。动画制作({
“marginTop”:$this.outerHeight()
},duration,function(){
css(“marginTop”,0);
});
}否则{
toEle=itemsLinks.last();
托尔。后(纽尔)
}
}
nextEle&&nextEle.css(“marginTop”,$this.outerHeight())
.制作动画({
“marginTop”:0
},durtion);
var animate=newEle.position();
动画[“背景色”]=颜色;
newEle.hide()&&$this.css('position','absolute')
.animate(动画、演示、函数(){
newEle.show();
$this.remove();
动画=假;
});
});
});
.items{
填充:0;
-webkit转换:300ms线性所有;
过渡:300ms线性所有;
}
.items.items-l{
浮动:左
}
.items.items-r{
浮球:对
}
.items.items-la{
背景:#0000FF
}
.items.items-ra{
背景:#F00000
}
.项目a,
.项目链接{
颜色:#fff;
填充:10px;
显示:块;
}
梅因先生{
宽度:100%;
}

只需将其复制粘贴到您的
HTML
页面,这正是您所需要的

/*CSS*/
#可恶的{
列表样式类型:无;
保证金:0;
填充:0;
宽度:500px;
}
#可悲的李{
利润率:0 125px 0 3px;
填充:0.4em;
字号:1.4em;
高度:18px;
浮动:左;
颜色:#fff;
光标:指针;
}
#可排序李:第n个孩子(奇数){
背景:#01BC9C;
}
#可排序李:第n个孩子(偶数){
背景:#E54A2D;
}
#可排序李跨度{
位置:绝对位置;
左边距:-1.3em;
}

试试这个
$(函数(){
$(“#可排序”).sortable();
$(“#可排序”).disableSelection();
} );
    第1项 第2项 第3项 第4项 第5项 第6项 第7项

一个简单的javascript解决方案,使用:

  • HTMLElement.getBoundingClientRect
    查找元素新旧位置之间的差异
  • css
    转换
    设置动画
  • css
    转换
    到翻译
方法说明: 其核心思想是让浏览器只计算/回流DOM一次。我们将自己处理初始状态和新状态之间的转换

通过仅转换(a)GPU加速的
转换
属性,在(b)一小部分元素(所有
  • 元素)上,我们将尝试确保高帧速率

    //存储对我们需要的DOM元素的引用:
    变量列表=[
    document.querySelector(“.js-list0”),
    document.querySelector(“.js-list1”)
    ];
    var items=Array.prototype.slice.call(document.querySelectorAll(“li”);
    //触发css转换的函数:
    变量转换=(函数(){
    var keyIndex=0,
    bboxesBefore={},
    bboxesAfter={},
    storeBbox=函数(对象,元素){
    var key=element.getAttribute(“数据键”);
    如果(!键){
    setAttribute(“数据键”、“键”+keyIndex++);
    返回存储框(对象,元素);
    }
    obj[key]=element.getBoundingClientRect();
    },
    storeBboxes=功能(对象、元素){
    返回elements.forEach(storeBbox.bind(null,obj));
    };
    //'action'是一个函数,它将DOM从*之前的状态*修改为*之后的状态**
    //'elements'是我们要监视和转换的HTMLElements数组
    返回函数(动作、元素){
    如果(!elements | |!elements.length){
    返回动作();
    }
    //存储旧位置
    存储盒(在元素之前的存储盒);
    //关闭动画
    文件
    
      $(".left").on("click", "li.element", function() {
        $(this).amAppendTo('.right', {
          addClasses: ['element--green'],
          removeClasses: ['element--golden']
        });
      });
      $(".right").on("click", "li.element", function() {
        $(this).amPrependTo('.left', {
          addClasses: ['element--golden'],
          removeClasses: ['element--green']
        });
      });
    
    body {
      margin: 0;
      width: 100%;
      &:after {
        content: '';
        display: table;
        width: 100%;
        clear: both;
      }
    }
    
    ul {
      list-style-type: none;
      padding: 0;
    }
    
    .element {
      width: 100px;
      height: 30px;
      line-height: 30px;
      padding: 8px;
      list-style: none;
      &--golden {
        background: goldenrod;
      }
      &--green {
        background: #bada55;
      }
      &.am-leave {
        visibility: hidden;
      }
      &.am-leave-prepare {
        visibility: hidden;
      }
      &.am-leave-active {
        height: 0;
        padding-top: 0;
        padding-bottom: 0;
      }
      &.am-enter {
        visibility: hidden;
      }
      &.am-enter-prepare {
        height: 0;
        padding-top: 0;
        padding-bottom: 0;
      }
      &.am-enter-active {
        height: 30px;
        padding-top: 8px;
        padding-bottom: 8px;
      }
      &.am-enter,
      &.am-move,
      &.am-leave {
        transition: all 300ms;
      }
    }
    
    .left {
      float: left;
    }
    
    .right {
      float: right;
    }