我正在尝试使用ng-animate类似于JQueryslideUp()和的行为slideDown()。只有我宁愿使用ng-show
我在这里查看ng-animate教程-http: //www.yearofmoo.com/2013/04/animation-in-angularjs.html,
我可以在提供的示例中再现淡入/淡出效果。
我如何更改CSS来获得向上/向下滑动的行为?另外,如果可能的话,最好让CSS不知道以像素为单位的组件高度。这样,我可以将CSS重用于不同的元素。
我正在尝试使用ng-animate类似于JQueryslideUp()和的行为slideDown()。只有我宁愿使用ng-show
我在这里查看ng-animate教程-http: //www.yearofmoo.com/2013/04/animation-in-angularjs.html,
我可以在提供的示例中再现淡入/淡出效果。
我如何更改CSS来获得向上/向下滑动的行为?另外,如果可能的话,最好让CSS不知道以像素为单位的组件高度。这样,我可以将CSS重用于不同的元素。
line-heightcss属性,范围是0到100%。有时是可行的...发布您的小提琴,以求我们能更好地帮助您。如果您找到执行此操作的好方法,请将其发送给我,然后将此示例放在我的网站上:AngularJS Ng-Animate
Answers:
我写了一个slideToggle()没有jQuery的Angular指令。
这实际上很容易做到。您所要做的就是更改CSS。
这是一个带有非常简单的淡入淡出动画的小提琴:http : //jsfiddle.net/elthrasher/sNpjH/
为了使其成为滑动动画,我首先必须将我的元素放在一个盒子(这是幻灯片容器)中,然后我添加了另一个元素来替换要离开的元素,只是因为我认为它看起来不错。删除它,该示例仍然有效。
我将动画CSS从“淡入淡出”更改为“幻灯片”,但请注意,这些是我给它命名的。我本来可以写一个名为“ fade”的幻灯片动画CSS或其他任何东西。
重要的部分是CSS中的内容。这是原始的“淡入淡出” css:
.fade-hide, .fade-show {
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
-moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
-o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
}
.fade-hide {
opacity:1;
}
.fade-hide.fade-hide-active {
opacity:0;
}
.fade-show {
opacity:0;
}
.fade-show.fade-show-active {
opacity:1;
}
此代码将元素的不透明度从0(完全透明)更改为1(完全不透明),然后再次返回。解决方案是不透明度不改变,而是改变顶部(如果要左右移动,则向左更改)。
.slide-hide, .slide-show {
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
-moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
-o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
}
.slide-hide {
position: relative;
top: 0;
}
.slide-hide.slide-hide-active {
position: absolute;
top: -100px;
}
.slide-show {
position: absolute;
top: 100px;
}
.slide-show.slide-show-active {
position: relative;
top: 0px;
}
我也从相对位置更改为绝对位置,因此一次只有一个元素会占用容器中的空间。
这是成品:http : //jsfiddle.net/elthrasher/Uz2Dk/。希望这可以帮助!
ng-hide="hidden == false"是多余的,如果hidden变量已经是布尔值,那么根本就不需要运算符。
Angular 1.2+的更新(本文发布时为v1.2.6):
.stuff-to-show {
position: relative;
height: 100px;
-webkit-transition: top linear 1.5s;
transition: top linear 1.5s;
top: 0;
}
.stuff-to-show.ng-hide {
top: -100px;
}
.stuff-to-show.ng-hide-add,
.stuff-to-show.ng-hide-remove {
display: block!important;
}
(矮人)
实际上,这可以通过添加CSS类(不要在JS中直接设置样式!)和ng-click事件来在CSS和最小的JS中完成。原理是不能设置动画height: 0;,height: auto;但是可以通过给max-height属性设置动画来欺骗。设置后,容器将扩展到其“自动高度”值.foo-open-无需固定高度或位置。
.foo {
max-height: 0;
}
.foo--open {
max-height: 1000px; /* some arbitrary big value */
transition: ...
}
作为评论中的一个关注点,请注意,尽管该动画可以很好地与线性缓动一起使用,但是任何指数缓动都会产生与预期不同的行为-由于动画属性本身max-height而不是height其本身;具体来说,只会显示height缓和曲线的一部分max-height。
max-height。
max-height。这正是过渡应该如何工作的方式。这种方法实际上具有以下优点:无论height
我最终放弃了该问题的其他答案的代码,而是继续使用此答案。
我认为,要做到这一点的最好办法是不使用ng-show,并ng-animate在所有。
/* Executes jQuery slideDown and slideUp based on value of toggle-slidedown
attribute. Set duration using slidedown-duration attribute. Add the
toggle-required attribute to all contained form controls which are
input, select, or textarea. Defaults to hidden (up) if not specified
in slidedown-init attribute. */
fboApp.directive('toggleSlidedown', function(){
return {
restrict: 'A',
link: function (scope, elem, attrs, ctrl) {
if ('down' == attrs.slidedownInit){
elem.css('display', '');
} else {
elem.css('display', 'none');
}
scope.$watch(attrs.toggleSlidedown, function (val) {
var duration = _.isUndefined(attrs.slidedownDuration) ? 150 : attrs.slidedownDuration;
if (val) {
elem.slideDown(duration);
} else {
elem.slideUp(duration);
}
});
}
}
});
这种基于类的javascript动画可在AngularJS 1.2(和1.4测试)中使用
编辑:我最终放弃了这段代码,朝着完全不同的方向发展。我更喜欢其他答案。在某些情况下,此答案将给您带来一些问题。
myApp.animation('.ng-show-toggle-slidedown', function(){
return {
beforeAddClass : function(element, className, done){
if (className == 'ng-hide'){
$(element).slideUp({duration: 400}, done);
} else {done();}
},
beforeRemoveClass : function(element, className, done){
if (className == 'ng-hide'){
$(element).css({display:'none'});
$(element).slideDown({duration: 400}, done);
} else {done();}
}
}
});
只需添加 .ng-hide-toggle-slidedown类到容器元素中,jQuery的下滑行为将基于ng-hide类实现。
您必须$(element).css({display:'none'})在beforeRemoveClass方法中包括该行,因为除非元素在display: none开始jQuery动画之前处于,否则jQuery将不会执行slideDown 。AngularJS使用CSS
.ng-hide:not(.ng-hide-animate) {
display: none !important;
}
隐藏元素。jQuery不了解这种状态,因此jQuery需要display:none先于第一个向下滑动动画。
动画发生时,AngularJS动画将添加.ng-hide-animate和.ng-animate类。
ngIf。但是我也看到,即使您使用它,在某些情况下它也不起作用ngShow。例如,当我在通过UI-Bootstrap创建的模式中使用它时,它似乎不起作用。真奇怪 它什么时候对您失败?
正如您所提到的,实际使用ng-animatefor有什么问题ng-show?
<script src="lib/angulr.js"></script>
<script src="lib/angulr_animate.js"></script>
<script>
var app=angular.module('ang_app', ['ngAnimate']);
app.controller('ang_control01_main', function($scope) {
});
</script>
<style>
#myDiv {
transition: .5s;
background-color: lightblue;
height: 100px;
}
#myDiv.ng-hide {
height: 0;
}
</style>
<body ng-app="ang_app" ng-controller="ang_control01_main">
<input type="checkbox" ng-model="myCheck">
<div id="myDiv" ng-show="myCheck"></div>
</body>