J'ai joint le stackblitz ci-dessous
https://stackblitz.com/edit/angular- dgx3pe
Ce que j'essaie de réaliser, c'est qu'en cliquant sur l'élément d'étiquette, il doit se concentrer sur l'entrée.Par conséquent, la classe input: focus est activée. Belive est que cela peut être réalisable via javascript / jquery.Mais je préfère la manière angulaire pour y parvenir.
En bref, ce sont les deux choses que j'essaye de faire,
p {
font-family: Lato;
}
.input
{
border:none;
border-bottom:1px solid grey;
outline:none;
margin-top:20%;
}
.input:focus
{
border-bottom:1px solid orange;
}
.label
{
position:relative;
left:-170px;
}
.input:focus + .label
{
bottom:20px;
}
<input class="input" type="text"> <label class="label">Name</label> <div> <input class="input" type="text"> <label class="label">Name</label> </div>
3 Réponses :
Vous pouvez le faire avec du balisage pur. Vous devez ajouter un identifiant à l'entrée et un élément for à l'étiquette
<input class="input" type="text" id="firstName" [(ngModel)]="firstName">
<label class="label" for="firstName" [ngClass]="{'go-top': firstName}">First Name</label>
Ceci n'est qu'une partie de la spécification html - les étiquettes peuvent être associées aux entrées - la fonctionnalité prête à l'emploi ici est qu'en cliquant sur une étiquette, il met le focus sur son entrée associée. Les attributs id et for doivent correspondre pour que cela fonctionne.
Pour la deuxième partie de votre question et pour réutiliser vos classes css - ajoutez des variables correspondantes à votre composant. Utilisez ngClass pour ajouter la classe .go-top lorsque la variable a une valeur
Dans le composant -
firstName: string;
Puis dans le html -
<input class="input" type="text" id="firstName"> <label class="label" for="firstName" >First Name</label>
Merci maintenant je suis capable de faire la première partie ... mais pouvez-vous m'expliquer comment cela fonctionne réellement ?? Et pouvez-vous aussi m'aider pendant que l'entrée a une certaine valeur..label devrait rester top
Merci, il l'a résolu .. Seule une chose pouvez-vous me suggérer s'il existe un moyen de le faire dynamiquement sans créer de variables séparées pour chaque entrée
[(ngModel)] est la solution parfaite pour suivre votre valeur d'entrée. Assurez-vous d'importer le module de formulaires afin de ne pas obtenir une erreur de directive inconnue: import {FormsModule} de '@ angular / forms'
@ViewChild("firstNameField") firstNameField;
focusOnFirstName(){
this.firstNameField.nativeElement.focus();
}
<input #firstNameField class="input" type="text">
<label class="label" (click)="focusOnFirstName()">First Name</label>
Merci, il a presque résolu ma question sauf la deuxième partie..quand s'il y a une valeur, l'étiquette doit rester en haut.Une fois retirée, elle doit être de retour à sa position d'origine
Je regarde cela dans l'optique de créer une solution plus "angulaire" pour votre demande de style conditionnel. À cette fin, vous devez vous concentrer sur le roulement de votre combinaison entrée / étiquette dans un composant d'entrée personnalisé. Une fois que vous avez créé un composant avec vos éléments d'origine comme modèle de départ, vous pouvez appliquer plus efficacement ce qui suit:
La stratégie de base consiste à appliquer conditionnellement vos styles en utilisant la liaison de propriété [class] ou les directives [NgStyle] d'Angular.
et mettra à jour une propriété de classe indiquant si le champ est vide //component.html with [style] property binding
// in this instance, empty is a reference to the property in the .ts file
<label for="my-input" #label> {{ labelName }}
<input type="text" id="my-input" [class.empty]="empty" #input>
//component.html with [ngClass] directive
<label for="my-input" #label> {{ labelName }}
<input type="text" id="my-input" [ngClass]="styles()" (keyup) = "isEmpty()" #input>
//component.ts
import { Component, Input, ViewChild, ElementRef } from '@angular/core'
@Component({
selector: 'app-input',
styleUrls: ['./input.component.css'],
templateUrl: './input.component.html'
})
export class InputComponent{
@Input() labelName: string = "Your Label Here"
@ViewChild("input") myInput:ElementRef<any> //ViewChild query
empty: Boolean = true; // this property will track whether input value is truthy
isEmpty(){ // attached to keyup event on input element in your template file
if (this.myInput.nativeElement.value){
this.empty = false;
} else{
this.empty = true;
}
}
styles(){ // attached to the [ngClass] directive binding on input element in template file
return {
'empty': this.empty ? true: false,
'not-empty': this.empty ? false: true
}
}
}
Merci pour votre temps..Si vous en faites une directive, comment pouvons-nous l'attacher au formulaire..Dans mon cas, c'est un formulaire réactif..La directive d'entrée spécifique demandera un groupe de formulaires qui n'est disponible que chez le parent composant..Est-il un moyen de surmonter cela?
De plus, le code joint semble un peu déroutant, pouvez-vous partager le stackblitz.?
Voulez-vous que l'étiquette soit des constantes après le premier événement de focus sur l'élément?
Pourquoi n'essayez-vous pas Mat-Input
L'étiquette doit être de retour à la position si l'entrée n'a pas de valeur ... mais si elle a une valeur, elle doit être constante et lorsque la valeur est supprimée et que le focus est éteint, elle doit revenir à la position d'origine ... Merci pour la suggestion mais je suis essayer d'éviter le matériel ..