从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;
}