2017-07-03 83 views
0

我使用的是Angular 4.2.5,我正在寻找一种在使用Renderer2创建的元素中进行动画制作的方法。以前,Renderer有一个功能.animate(),但现在不是这种情况。比方说,我有以下指令:在使用Renderer2创建的元素中进行动画制作

import { Directive, Input, ElementRef, Renderer2, HostListener } from '@angular/core'; 

@Directive({ 
    selector: '[text-content]' 
}) 
export class TextContentDirective { 
    @Input('text-content') textContent: string; 
    box: ElementRef; 

    constructor(private element: ElementRef, private renderer: Renderer2) { } 

    @HostListener('mouseenter', ['$event.target']) 
    mouseEnter(target) { 
    this.box = this.renderer.createElement('div'); 
    let span = this.renderer.createElement('span'); 
    let content = this.renderer.createText(this.textContent); 
    this.renderer.appendChild(span, content); 
    this.renderer.appendChild(this.box, span); 
    this.renderer.appendChild(this.element.nativeElement, this.box); 
    } 
} 

而且

<div [text-content]="Hello World">Hover me</div> 

元素被创建并添加到时我将鼠标悬停divdiv的HTML,但我怎么能使其出现与动画?通过向生成的div添加一个类可能是可能的。但不能太快,否则动画不会启动。我正在寻找一种方法来处理@angular/animations

+0

你尝试官方文档? [Angular 4动画](https://angular.io/guide/animations)。现在,由于Angular团队引入了平台独立层,因此动画不在Renderer2中。 –

+0

@ShanilFernando更多关于动画元素而不是动画元素 –

+0

你尝试过使用CSS3过渡吗? –

回答

0

我没有测试这一点,但我只是想给你一个想法,尝试

import { Directive, Input, ElementRef, Renderer2, HostListener } from '@angular/core'; 

@Directive({ 
    selector: '[text-content]' 
}) 
export class TextContentDirective { 
    @Input('text-content') textContent: string; 
    box: ElementRef; 

    constructor(private element: ElementRef, private renderer: Renderer2) { 
    this.box = this.renderer.createElement('div'); 
    // Added 
    this.renderer.setStyle(this.box,"opacity",0); 
    this.renderer.setStyle(this.box,"transition","opacity 2s"); 
    // 
    let span = this.renderer.createElement('span'); 
    let content = this.renderer.createText(this.textContent); 
    this.renderer.appendChild(span, content); 
    this.renderer.appendChild(this.box, span); 
    this.renderer.appendChild(this.element.nativeElement, this.box); 
} 

    @HostListener('mouseenter', ['$event.target']) 
    mouseEnter(target) { 
    this.renderer.setStyle(this.box,"opacity",1); 
    } 
} 

编辑 试试这个

 import { Directive, Input, ElementRef, Renderer2, HostListener } from '@angular/core'; 

     @Directive({ 
      selector: '[text-content]' 
     }) 
     export class TextContentDirective { 
      @Input('text-content') textContent: string; 
      box: ElementRef; 

      constructor(private element: ElementRef, private renderer: Renderer2) { 

     } 

      @HostListener('mouseenter', ['$event.target']) 
      mouseEnter(target) { 
      this.box = this.renderer.createElement('div'); 
      // Added 
      this.renderer.setStyle(this.box,"opacity",0); 
      this.renderer.setStyle(this.box,"transition","opacity 2s"); 
      // 
      let span = this.renderer.createElement('span'); 
      let content = this.renderer.createText(this.textContent); 
      this.renderer.appendChild(span, content); 
      this.renderer.appendChild(this.box, span); 
      this.renderer.appendChild(this.element.nativeElement, this.box); 
      this.renderer.setStyle(this.box,"opacity",1); 
      } 
     } 
+0

这样的事情应该工作,但我一直在寻找用于创建它时创建动画的方法。现在,您首先创建所有框,然后只在悬停时向其添加/删除类。 –

+0

“现在你首先创建所有的盒子,然后只在悬停时向他们添加/删除一个类”是的,我故意做它获得更多的性能。想一想,如果内容相同,为什么每次他徘徊时都需要创建相同的内容? –

+0

当然,我知道在这种情况下,它可能是在init中渲染它们的更好方法。但是可能会出现这样的情况,您不希望在页面init上渲染元素/一堆元素 –