js實(shí)現(xiàn)高度自適應(yīng)的簡單文本編輯框

摘要:本文描述了一種實(shí)現(xiàn)隨著文本輸入或刪除能自動(dòng)改變高度適應(yīng)文字量的簡單文本編輯框的方法伊磺,效果入下圖(沒有富文本格式焚辅,只有基本的換行浊仆、空格等格式)记焊。主要思路是建立兩個(gè)textarea元素,隱藏其中一個(gè)瘦穆,隨著文字輸入檢查隱藏的textarea元素的滾動(dòng)高度纪隙,把這個(gè)高度值賦給顯示的textarea

自適應(yīng)文本框.gif

起因

前段時(shí)間做了一個(gè)類ppt的在線編輯器扛或,當(dāng)然功能比ppt簡單很多绵咱。其中在插入文字的時(shí)候由于輸入完成之后要有基本的換行,空格之類的格式熙兔,因此用<textarea>元素是比較合適的悲伶。但是在textarea元素內(nèi)輸入文字的時(shí)候,如果內(nèi)容比較多住涉,超出元素高度的時(shí)候麸锉,就會(huì)出現(xiàn)滾動(dòng)條,這顯然是不符合一個(gè)類ppt編輯器對(duì)文字元素的要求的舆声。當(dāng)然簡單一點(diǎn)可以讓不去管它花沉,提供一個(gè)功能讓用戶自己去調(diào)整文字框的大小,不過既然做了總想做好一點(diǎn)媳握。于是通過搜索和摸索實(shí)現(xiàn)了一個(gè)能夠隨著文字輸入或刪除碱屁,高度能夠自適應(yīng)改變的文本框。

實(shí)現(xiàn)思路和過程

初始方案

一開始的基本思路就是每當(dāng)在textarea元素的內(nèi)容發(fā)生改變之后蛾找,獲取textareascrollHeight娩脾,然后讓textareastyle.height等于這個(gè)值。于是初版代碼大約是這樣(我用的vue框架打毛,其他框架或者不用框架應(yīng)該也是類似):

<textarea type="text" @focus="textFocus" v-model="content" ref="input" :style="{height: teaxtAreaHeight}" rows="1" 
    style="overflow-y: hidden;">
</textarea>
export default {
    data() {
        content: '',
        teaxtAreaHeight: ''
    },
    methods: {
        textFocus() {
            document.addEventListener('keyup', () => {
                this.$nextTick(() => {
                    const height = `${(this.$refs.input).scrollHeight}px`;
                    if (height !== this.teaxtAreaHeight) {
                        this.teaxtAreaHeight = height;
                    }
                });
            });
        }
    }
}

界面上的textarea元素內(nèi)容綁定了content變量晦雨,元素高度height綁定變量textAreaHeight架曹,初始是默認(rèn)高度。overflow-y屬性是hidden闹瞧,為的是不出現(xiàn)滾動(dòng)條。當(dāng)文本框獲得焦點(diǎn)時(shí)展辞,執(zhí)行textFocus奥邮,監(jiān)聽鍵盤輸入事件,獲取文本框的scrollHeight也就是滾動(dòng)高度罗珍,如果滾動(dòng)高度和現(xiàn)在文本框的高度不一樣洽腺,說明因?yàn)槲淖州斎雽?dǎo)致了文本內(nèi)容高度與文本框高度不同,則改變文本框高度teaxtAreaHeight覆旱。其中$nextTick方法是vue中用于等待下一次dom重新渲染后再執(zhí)行其中的代碼蘸朋,因?yàn)槲淖州斎牒笪谋究虻?code>scrollHeight要等到dom重新渲染才會(huì)變化。這樣就可以實(shí)現(xiàn)隨著文字輸入扣唱,文本框高度自動(dòng)適應(yīng)文本內(nèi)容高度藕坯,不會(huì)有滾動(dòng)條了。

初始方案的問題

上面這個(gè)方案雖然實(shí)現(xiàn)了隨著文字輸入高度自動(dòng)增加來適應(yīng)文本內(nèi)容噪沙,但是有個(gè)問題炼彪,就是不能夠隨著文字的刪除來自動(dòng)減小高度適應(yīng)刪減后的文本高度。因?yàn)橐坏┙otextarea設(shè)置了較大的高度height正歼,那么在文字刪除后scollHeight也不會(huì)重新減小了辐马!

改進(jìn)

為了解決上面的問題,加入第二個(gè)textarea局义。這個(gè)textarea始終是隱藏的喜爷,與顯示的textarea綁定了同樣的文本內(nèi)容,不改變?cè)?code>textarea的height萄唇,這樣scollHeight就會(huì)隨著文字內(nèi)容高度的變化而變化檩帐,這樣由它作為一把高度的尺子,以它的scollHeight為標(biāo)準(zhǔn)去改變顯示textareaheight

<textarea @focus="textFocus" type="text" v-model="content" ref="input" :style="{height: teaxtAreaHeight}"
    rows="1" style="overflow-y: hidden;">
</textarea>
<textarea style="position: absolute; visibility:hidden;" ref="heightRuler" v-model="content" rows="1"></textarea>
export default {
    data() {
        content: '',
        teaxtAreaHeight: ''
    },
    methods: {
        textFocus() {
            document.addEventListener('keyup', () => {
                this.$nextTick(() => {
                    const height = `${(this.$refs.heightRuler).scrollHeight}px`;
                    if (height !== this.teaxtAreaHeight) {
                        this.teaxtAreaHeight = height;
                    }
                });
            });
        }
    }
}

vue優(yōu)化版

思路還是之前那個(gè)思路穷绵,不過代碼可以變得更加優(yōu)雅轿塔。之前的做法是監(jiān)聽鍵盤事件,在vue中還可以直接通過watch監(jiān)聽value值來計(jì)算高度仲墨,也可以通過計(jì)算屬性的set方法在value發(fā)生改變的時(shí)候計(jì)算高度

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勾缭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子目养,更是在濱河造成了極大的恐慌俩由,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌蚁,死亡現(xiàn)場離奇詭異幻梯,居然都是意外死亡兜畸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門碘梢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咬摇,“玉大人,你說我怎么就攤上這事煞躬「嘏簦” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恩沛,是天一觀的道長在扰。 經(jīng)常有香客問我,道長雷客,這世上最難降的妖魔是什么芒珠? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮搅裙,結(jié)果婚禮上皱卓,老公的妹妹穿的比我還像新娘。我一直安慰自己呈宇,他們只是感情好好爬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甥啄,像睡著了一般存炮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜈漓,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天穆桂,我揣著相機(jī)與錄音,去河邊找鬼融虽。 笑死享完,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的有额。 我是一名探鬼主播般又,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼巍佑!你這毒婦竟也來了茴迁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤萤衰,失蹤者是張志新(化名)和其女友劉穎堕义,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脆栋,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倦卖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年洒擦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怕膛。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熟嫩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘉竟,到底是詐尸還是另有隱情邦危,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布舍扰,位于F島的核電站,受9級(jí)特大地震影響希坚,放射性物質(zhì)發(fā)生泄漏边苹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一裁僧、第九天 我趴在偏房一處隱蔽的房頂上張望个束。 院中可真熱鬧,春花似錦聊疲、人聲如沸茬底。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱表。三九已至,卻和暖如春贡珊,著一層夾襖步出監(jiān)牢的瞬間最爬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工门岔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爱致,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓寒随,卻偏偏與公主長得像糠悯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妻往,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案互艾? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評(píng)論 1 92
  • 高度自適應(yīng)的 textarea 背景介紹 正如我們所知道的 textarea 是一個(gè)行內(nèi)塊元素 display: ...
    岑早早咯閱讀 8,075評(píng)論 1 3
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)蒲讯。 注意:講述HT...
    kismetajun閱讀 27,450評(píng)論 1 45
  • 1忘朝、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評(píng)論 3 119
  • 近日,日本知名美妝集團(tuán)高絲攜專業(yè)品牌化妝師來到聚美優(yōu)品總部判帮,為聚美員工和用戶帶來了一場特別的直播局嘁,除了展示高絲旗下...
    科技蟲閱讀 537評(píng)論 0 1