AngularJS - CSS 动画只能以一种方式工作
AngularJS - CSS animations are only working one way
我正在尝试将元素从height: 20px
动画化到height: 0
,但它不起作用。但是,从 0 到 20 的转换确实有效。我正在使用角度从数组中添加/删除项目:
angular.module('app', [])
.controller('ctl', ctl);
ctl.$inject = ['$timeout'];
function ctl($timeout) {
var self = this;
self.newItemText = '';
self.deleteItem = function(id) {
self.items[id].class = 'hidden';
};
self.addItem = function() {
var newItem = {
id: self.items.length,
class: 'hidden',
text: self.newItemText
};
self.items.push(newItem);
self.items[self.items.length - 1].class = 'visible';
self.newItemText = '';
}
self.items = [{
id: 0,
class: 'visible',
text: 'one'
}, {
id: 1,
class: 'visible',
text: 'two'
}, {
id: 2,
class: 'visible',
text: 'three'
}, {
id: 3,
class: 'visible',
text: 'one'
}, {
id: 4,
class: 'visible',
text: 'two'
}, {
id: 5,
class: 'visible',
text: 'three'
}, {
id: 6,
class: 'visible',
text: 'one'
}, {
id: 7,
class: 'visible',
text: 'two'
}, {
id: 8,
class: 'visible',
text: 'three'
}, ];
};
body {
font-family: arial;
}
.text {
display: inline-block;
}
.close {
cursor: pointer;
}
.visible {
height: 20px;
transition: height 0.2s linear;
}
.hidden {
height: 0;
overflow: hidden;
transition: height 0.2s linear;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script>
<div ng-app='app' ng-controller='ctl as c'>
<input ng-model='c.newItemText' />
<button ng-click='c.addItem()'>
add
</button>
<div>
<ul>
<li ng-repeat='item in c.items' class='{{item.class}}'>
<span class='text'>{{item.text}}</span>
<span class='close' ng-click='c.deleteItem(item.id)'>x</span>
</li>
</ul>
</div>
</div>
相关 CSS:
.visible {
height: 20px;
transition: height 0.2s linear;
}
.hidden {
height: 0;
overflow: hidden;
transition: height 0.2s linear;
}
完整代码:
https://jsfiddle.net/1rqhLo83/
以下是事件发生的顺序:
- 该元素追加了一类
hidden
- 该类随后更改为
visible
- 然后发生重排/绘制事件,CSS以可视方式更新
这样做时,最初追加元素时看不到转换,因为在类已经visible
之前不会发生重绘事件。
一种解决方案是将元素与两个类一起附加,然后在轻微的 10ms 超时后删除visible
类。这样做时,将发生重排事件,并且转换将按预期生效。
更新的示例
self.addItem = function() {
var newItem = {
id: self.items.length,
class: 'visible hidden',
text: self.newItemText
};
self.items.push(newItem);
$timeout(function () {
self.items[self.items.length - 1].class = 'visible';
}, 10);
self.newItemText = '';
}
然后将 CSS 修改为以下内容:
.visible {
height: 20px;
transition: height 1s linear;
overflow: hidden;
}
.hidden {
height: 0;
}
相关文章:
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以让jQuery日期选择器在没有年份的情况下工作
- JS滑块计数器不工作..需要找到一种方法使其正常工作
- Javascript hide/show 切换在 Opera 中是双向的,但在其他浏览器中只能以一种方式工作
- AngularJS - CSS 动画只能以一种方式工作
- JavaScript排序函数是如何工作的(作为一种算法)
- Javascript函数以一种意想不到的方式工作
- Javascript-目标DOM在一种情况下工作,而不是在另一种情况
- 添加新行,将日期选择器绑定到cloumn以一种奇怪的方式工作
- 在IE中获得插入符号位置在一种情况下工作,在另一种情况下不工作
- 节点调度是一种类似cron的调度方法,在本地工作,但在生产中不起作用
- 一种获取工作表第一行/标题中值的列的方法
- 在Firefox上禁用JavaScript意味着我的按钮不能工作,是否有一种方法可以让按钮工作?
- 我需要为手风琴换一种颜色;我在一起工作
- Jquery动画以一种方式工作,而不是另一种方式
- Scala到JS的加密不起作用,但另一种方式工作得很好
- 是否有一种简单的方法可以让Lowpro与IE9一起工作?
- 警报框以一种方式工作,而不是以另一种方式
- 为什么相同的代码在另一种形式下可以工作而不能工作