单击元素时角度关注输入

时间:2019-06-01 05:23:36

标签: javascript css angular typescript

我在下面附上了堆叠闪电战

https://stackblitz.com/edit/angular-dgx3pe

我想要实现的是单击标签元素时它应该集中在输入上。因此 input:focus 类被激活。我相信它可以通过javascript实现/ jquery。但是我更喜欢用角度的方法来实现。

总之,这是我要做的两件事,

  • 单击标签时,将焦点放在输入元素上。
  • 当焦点切换到另一个输入元素并且前一个元素不为空(如果键入了某些值)时,标签应保持在顶部位置。

HTML

<input class="input" type="text">
<label class="label">Name</label>

<div>
<input class="input" type="text">
<label class="label">Name</label>
</div>

CSS

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;
}

3 个答案:

答案 0 :(得分:1)

您可以使用纯标记来执行此操作。您需要在输入中添加一个id,在标签中添加一个for元素

<input class="input" type="text" id="firstName">
<label class="label" for="firstName" >First Name</label>

这只是html规范的一部分-标签可以与输入相关联-开箱即用的功能是单击标签时将焦点设置为其关联的输入。 id for 属性必须匹配才能起作用。

对于问题的第二部分,并重用CSS类,请在组件中添加匹配的变量。当变量具有值时,使用ngClass添加.go-top类

在组件中-

firstName: string;

然后在html中-

  <input class="input" type="text" id="firstName" [(ngModel)]="firstName">
  <label class="label" for="firstName" [ngClass]="{'go-top': firstName}">First Name</label>

答案 1 :(得分:1)

  1. 在html中,添加对输入文本的引用-#firstNameField,并添加方法以单击标签的事件-(click)=“ focusOnFirstName()”
    <input #firstNameField class="input" type="text">
    <label class="label" (click)="focusOnFirstName()">First Name</label>

  1. 在您的组件中声明ViewChild并实现单击标签字段的方法。
      @ViewChild("firstNameField") firstNameField;

      focusOnFirstName(){
        this.firstNameField.nativeElement.focus();
      }


答案 2 :(得分:1)

我正在从为您的条件样式请求提供更“ Angular”的解决方案的角度来看待这个问题。为此,您应该专注于将输入/标签组合滚动到自定义输入组件中。创建具有原始元素作为开始模板的组件后,可以更有效地执行以下操作。

基本策略是使用Angular的[class]属性绑定或[NgStyle]指令有条件地应用样式。

  1. 在输入元素的模板上执行ViewChild查询
    1. 在模板的输入元素上添加事件监听器
    2. 无论何时检测到keyup事件,它都会触发检查您的<input>字段值并更新表示该字段是否为空的类属性
    3. 更改检测将触发,[NgClass]或[class]绑定将触发对元素类的更新
//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
    }
  } 

}

//component.html with [ngClass] directive

<label for="my-input" #label> {{ labelName }}
<input type="text" id="my-input" [ngClass]="styles()" (keyup) = "isEmpty()" #input>

//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>