You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中如何实现textarea根据文本内容自动调整尺寸?

问题原因

<textarea> 属于普通表单元素,本身不支持 onload 事件,所以你修改触发事件后不会生效,只有 body、img、script、iframe 这类需要加载外部资源的元素才会触发 load 事件。

Angular 正确实现方案

1. 优化自适应方法

原来的方法仅支持内容增加时拉伸,没有处理内容减少时高度回落的逻辑,先做优化:

autoResize(el: HTMLTextAreaElement) {
  // 先重置行数为1,适配内容减少的场景
  el.rows = 1;
  while (el.scrollHeight > el.offsetHeight) {
    el.rows += 1;
  }
}

2. 组件类中添加初始化触发逻辑

通过 Angular 的视图查询拿到 textarea 元素,在视图渲染完成后自动触发一次适配:

import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html'
})
export class YourComponent implements AfterViewInit {
  // 查询模板中的textarea元素
  @ViewChild('autoResizeTextarea') textarea!: ElementRef<HTMLTextAreaElement>;

  // 视图初始化完成后触发第一次适配
  ngAfterViewInit(): void {
    this.autoResize(this.textarea.nativeElement);
  }

  autoResize(el: HTMLTextAreaElement) {
    el.rows = 1;
    while (el.scrollHeight > el.offsetHeight) {
      el.rows += 1;
    }
  }
}

3. 模板绑定事件

模板中给 textarea 加模板引用变量,同时绑定 input 事件处理用户输入时的动态适配:

<textarea 
  #autoResizeTextarea
  (input)="autoResize($event.target as HTMLTextAreaElement)"
>默认文本内容</textarea>

如果你的 textarea 绑定了表单数据,建议在表单赋值完成后额外调用一次 autoResize 方法,避免异步加载的内容适配不及时。

内容的提问来源于stack exchange,提问作者Kaike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:06:04