摘要:將的高度和設置為僅能輸入一行,這么做是為了用元素的表示其內容的高度。在模塊內新建一個組件。輸出屬性將會在用戶輸入的數據變化時發出數據。讓的高度始終等于的這里是直接操作,建議最好使用進行的修改。
>> 前往stackblitz編輯代碼 核心思路
創建兩個textarea,這里暫取名為text和text1。(最后會將text1隱藏,調試時先讓text1顯示)。
將text1的高度和rows設置為僅能輸入一行,這么做是為了用元素的scrollHeight表示其內容的高度。
用戶將在text中輸入,我們將輸入的值同步綁定到text1中,并通過text1的scrollHeight獲取輸入內容的高度,并同步改變text的height。
實現 準備工作首先,新建一個模塊textarea.module.ts,并引入FormsModule,因為接下來將會用到ngModel進行雙向數據綁定。
在模塊內新建一個組件textarea。
在模塊內exports出該組件。以后只需引入該模塊即可使用該組件。
實作在組件模板內寫兩個textarea,并標記為模板變量#text和#text1。
在模板中數據綁定,并監聽數據變化。
在textarea.component.ts中增加一個輸入屬性和一個輸出屬性。輸入屬性maxHeight表示textarea的heigh的極限。輸出屬性valChange將會在用戶輸入的數據變化時發出數據。
@Input("max-height") maxHeight = 100; @Output("valChange") valChange = new EventEmitter();
在textarea.component.ts中寫模板中調用的onChange方法。讓text的高度始終等于text1的scrollHeight;這里是直接操作Dom,建議最好使用Renderer2進行dom的修改。
onChange() { this.reset(); setTimeout(() => { this.valChange.emit(this.val); this.reset(); }, 0) } reset() { this.text1.nativeElement.style.width = (this.text.nativeElement.scrollWidth + 2) + "px"; if (this.text1.nativeElement.scrollHeight < this.maxHeight) { this.text.nativeElement.style.height = (this.text1.nativeElement.scrollHeight + 2) + "px" } }
注意1:這里獲取scrollwidth的目的是因為不同的瀏覽器對滾動條的呈現邏輯有差異,我們在css中已經設置了text1的overflow=hidden,始終不會讓text1出現滾動條,因此我們需要讓他的寬度始終等于text1的寬度,以保證當text出現滾動條是他的的寬度也保持一致,從而讓scrollHeight可以完美映射到text,否則會出現text中明明還沒有達到邊界,高度就自行變化了。
注意2:setTimeout中的邏輯是為了應付事件環,因為我們監聽的是text的變化,當text中輸入變化時,text1中通過數據綁定得到的值往往還沒有改變,需要等一個節拍。
只需要監聽輸出屬性valChange,并傳入$event就可以獲取用戶輸入了。
如有需要可以在此基礎上繼續擴展,使其兼容響應式表單。
修改樣式需要注意選擇器的權重。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99265.html
摘要:但是現在產品經理說了需要這個文本框可以根據用戶輸入內容自適應其高度。想法很簡單,當用戶輸入的文本超過了文本框自身高度時不是會出現滾動條嘛,那么自然而然就能想到這個屬性。就應該是用戶輸入文本的真實高度,至少超過文本框既定高度時是這樣。 文本框是很常見的輸入控件,我相信只要寫過表單的肯定接觸過 textarea 這個元素。 OK。但是現在產品經理說了:需要這個文本框可以根據用戶輸入內容自適...
摘要:但是現在產品經理說了需要這個文本框可以根據用戶輸入內容自適應其高度。想法很簡單,當用戶輸入的文本超過了文本框自身高度時不是會出現滾動條嘛,那么自然而然就能想到這個屬性。就應該是用戶輸入文本的真實高度,至少超過文本框既定高度時是這樣。 文本框是很常見的輸入控件,我相信只要寫過表單的肯定接觸過 textarea 這個元素。 OK。但是現在產品經理說了:需要這個文本框可以根據用戶輸入內容自適...
摘要:一和的區別元素用于為基于的表單創建交互式控件,以便接受來自用戶的數據。 一、input 和 textarea 的區別 input: HTML 元素用于為基于Web的表單創建交互式控件,以便接受來自用戶的數據。 textarea: HTML 元素代表一個多行的純文本編輯控件. Write something here 區別: 標簽是成對的,有結束標簽進行閉合,標...
摘要:一和的區別元素用于為基于的表單創建交互式控件,以便接受來自用戶的數據。 一、input 和 textarea 的區別 input: HTML 元素用于為基于Web的表單創建交互式控件,以便接受來自用戶的數據。 textarea: HTML 元素代表一個多行的純文本編輯控件. Write something here 區別: 標簽是成對的,有結束標簽進行閉合,標...
閱讀 3952·2021-11-18 13:21
閱讀 4759·2021-09-27 14:01
閱讀 3110·2019-08-30 15:53
閱讀 2388·2019-08-30 15:43
閱讀 1730·2019-08-30 13:10
閱讀 1508·2019-08-29 18:39
閱讀 887·2019-08-29 15:05
閱讀 3340·2019-08-29 14:14