2017-03-06 27 views
8

Jak dodać klasę do div, gdy unosi się na div.Jak dodać klasę do elementu po najechaniu myszą?

Template -

<div class="red">On hover add class ".yellow"</div> 

Component -

import {Component} from 'angular2/core'; 

@Component({ 
    selector: 'hello-world', 
    templateUrl: 'src/hello_world.html', 
    styles: [` 
    .red { 
     background: red; 
    } 

    .yellow { 
     background: yellow; 
    } 

    `] 
}) 
export class HelloWorld { 
} 

Demo

[UWAGA - I specjalnie chcesz dodać nową klasę i nie modyfikować istniejących klas]

Sigh ! Jest to normalny przypadek użycia i nie widzę jeszcze żadnego prostego rozwiązania!

+0

Zastosowanie dyrektywy. Przeczytaj ten artykuł i powinieneś być w stanie wymyślić resztę :) https://angular.io/docs/ts/latest/guide/attribute-directives.html –

+1

Każdy powód, by nie używać po prostu CSS ': hover' dla to? –

Odpowiedz

18

Można też po prostu użyć czegoś podobnego.

[ngClass]="color" (mouseover)="changeStyle($event)" (mouseout)="changeStyle($event)" 

Następnie w składniku

color:string = 'red'; 

changeStyle($event){ 
    this.color = $event.type == 'mouseover' ? 'yellow' : 'red'; 
} 

Plunker

+0

To działa, ale czy istnieje jakiś prosty sposób w samym szablonie, zamiast przechodzić od szablonu -> komponent -> szablon – Ajey

+2

w rzeczywistości ya, - '[ngClass] =" kolor "(mouseover) =" color = 'yellow' "(mouseout) =" color = 'red' "" działa, jak przypuszczam, – Dylan

+0

Byłbym szczęśliwy, gdyby udało się wstawić rozwiązanie do markup w twojej odpowiedzi. – isherwood

5

Proste jak poniżej

<button [class.btn-success]="mouseOvered" 
    (mouseover)="mouseOvered=true" 
    (mouseout)="mouseOvered=false"> Hover me </button> 

LIVE DEMO

+1

Co zrobić, jeśli masz więcej niż jeden przycisk? Chcesz zmienić klasę tylko dla tego, na którym się unosisz, a nie dla wszystkich. Czy istnieje sposób, aby to osiągnąć? – mario595

+0

@ mario595 użyj znacznika 'span' i zawiń go pod' * ngIf. jeśli potrzebujesz więcej informacji, daj mi znać – Aravind

0

W przypadku ustawionej style programowo (np atrybutu w składniku) i chce to zmienić przy aktywowaniu, można mieć spójrz na this Plunker demo.

Odpowiada również na pytanie, kiedy wiele elementów musi odpowiedzieć na zdarzenie mouseover.

Oto kod:

@Component({ 
    selector: 'app', 
    template: ` 
    <div id="1" 
     (mouseover)="showDivWithHoverStyles(1)" 
     (mouseout)="showAllDivsWithDefaultStyles()" 
     [ngStyle]="hoveredDivId ===1 ? hoveredDivStyles : defaultDivStyles"> 
     The first div 
    </div> 

    <div id="2" 
     (mouseover)="showDivWithHoverStyles(2)" 
     (mouseout)="showAllDivsWithDefaultStyles()" 
     [ngStyle]="hoveredDivId === 2 ? hoveredDivStyles : defaultDivStyles"> 
     The second div 
    </div>` 
}) 
class App{ 
    hoveredDivId; 
    defaultDivStyles= {height: '20px', 'background-color': 'white'}; 
    hoveredDivStyles= {height: '50px', 'background-color': 'lightblue'}; 

    showDivWithHoverStyles(divId: number) { 
    this.hoveredDivId = divId; 
    } 

    showAllDivsWithDefaultStyles() { 
    this.hoveredDivId = null; 
    } 
} 
0

@HostListener dekorator jest również dobrym rozwiązaniem, jeśli są stosowane na całym komponentu.

utrzymać html jak to jest i w składniku dodać @HostListener

<div class="red">On hover add class ".yellow"</div> 

    @HostListener('mouseenter') onMouseEnter() { 
    this.elementRef.nativeElement.class = 'red'; 
    } 

    @HostListener('mouseleave') onMouseLeave() { 
    this.elementRef.nativeElement.class = 'yellow'; 
    }