Angular 4 – 当div进入视口时如何触发动画?

前端之家收集整理的这篇文章主要介绍了Angular 4 – 当div进入视口时如何触发动画?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在使用Angular 4构建一个新站点,我正在尝试重新创建一个效果,当div变为可见时(向下滚动屏幕)然后可以触发角度动画以滑动div形式双方.

我以前在Angular 4之外使用jQuery已经能够做到这一点,但我想尝试使用原生的Angular 4动画创建相同的效果.

任何人都可以向我提供有关如何在div进入视图时触发动画的建议(即,当它进入视口时向下滚动到页面的下半部分?).我已经编写了幻灯片动画但我不知道如何在以后将div显示到视口时使用滚动触发它.

感谢大家!

我创建了一个指令,只要元素完全在视图中或者它的上边缘已到达视图的上边缘,就会发出一个事件.

这是一个吸烟者:https://embed.plnkr.co/mlez1dXjR87FNBHXq1YM/

它的使用方式如下:

  1. <div (appear)="onAppear()">...</div>

这是指令:

  1. import {
  2. ElementRef,Output,Directive,AfterViewInit,OnDestroy,EventEmitter
  3. } from '@angular/core';
  4. import {Observable} from 'rxjs/Observable';
  5. import {Subscription} from 'rxjs/Subscription';
  6. import 'rxjs/add/observable/fromEvent';
  7. import 'rxjs/add/operator/startWith';
  8.  
  9. @Directive({
  10. selector: '[appear]'
  11. })
  12. export class AppearDirective implements AfterViewInit,OnDestroy {
  13. @Output()
  14. appear: EventEmitter<void>;
  15.  
  16. elementPos: number;
  17. elementHeight: number;
  18.  
  19. scrollPos: number;
  20. windowHeight: number;
  21.  
  22. subscriptionScroll: Subscription;
  23. subscriptionResize: Subscription;
  24.  
  25. constructor(private element: ElementRef){
  26. this.appear = new EventEmitter<void>();
  27. }
  28.  
  29. saveDimensions() {
  30. this.elementPos = this.getOffsetTop(this.element.nativeElement);
  31. this.elementHeight = this.element.nativeElement.offsetHeight;
  32. this.windowHeight = window.innerHeight;
  33. }
  34. saveScrollPos() {
  35. this.scrollPos = window.scrollY;
  36. }
  37. getOffsetTop(element: any){
  38. let offsetTop = element.offsetTop || 0;
  39. if(element.offsetParent){
  40. offsetTop += this.getOffsetTop(element.offsetParent);
  41. }
  42. return offsetTop;
  43. }
  44. checkVisibility(){
  45. if(this.isVisible()){
  46. // double check dimensions (due to async loaded contents,e.g. images)
  47. this.saveDimensions();
  48. if(this.isVisible()){
  49. this.unsubscribe();
  50. this.appear.emit();
  51. }
  52. }
  53. }
  54. isVisible(){
  55. return this.scrollPos >= this.elementPos || (this.scrollPos + this.windowHeight) >= (this.elementPos + this.elementHeight);
  56. }
  57.  
  58. subscribe(){
  59. this.subscriptionScroll = Observable.fromEvent(window,'scroll').startWith(null)
  60. .subscribe(() => {
  61. this.saveScrollPos();
  62. this.checkVisibility();
  63. });
  64. this.subscriptionResize = Observable.fromEvent(window,'resize').startWith(null)
  65. .subscribe(() => {
  66. this.saveDimensions();
  67. this.checkVisibility();
  68. });
  69. }
  70. unsubscribe(){
  71. if(this.subscriptionScroll){
  72. this.subscriptionScroll.unsubscribe();
  73. }
  74. if(this.subscriptionResize){
  75. this.subscriptionResize.unsubscribe();
  76. }
  77. }
  78.  
  79. ngAfterViewInit(){
  80. this.subscribe();
  81. }
  82. ngOnDestroy(){
  83. this.unsubscribe();
  84. }
  85. }

猜你在找的Angularjs相关文章