JS 9行代码实现Textarea高度自适应

目录

1.代码展示

2.代码讲解

3.代码原理

1.代码展示

maininput.oninput = function () {
    maininput.style.height = 'auto'
    let contentheight = maininput.scrollHeight
    if (contentheight > 300) {
        maininput.style.height = 300 + "px"
    } else {
        maininput.style.height = contentheight + "px"
    }
}

利端:非常简单,容易理解

弊端:需指定行高, 且transition会失效

需求:指定行高

备注:最少显示行数需使用rows属性指定


2.代码讲解

第一行:maininput.oninput = function () {}

maininput(输入框名称)

参看文献:【input】输入框事件总结

给输入框绑定监听函数,当输入框内容发生任何改变时执行后面的函数

第二行:maininput.style.height = 'auto'

设置输入框高度为"自适应"

第三行:let contentheight = maininput.scrollHeight

定义一个变量,存储输入框高度.如果输入框设置了padding,则再减去上下padding的总和(单位为像素),例如我的输入框padding样式为20px,则该代码为let contentheight = maininput.scrollHeight - 40

第四行:if (contentheight > 300) {}

该代码的作用是判断输入框高度是否超过了指定值(300,单位px),用来限制输入框最大高度,如果输入框没有最大高度(无限制),则直接保留else语句内容即可

值为行高*最大显示行数

第五行:maininput.style.height = 300 + "px"

搭配第四行,当输入框达到最大高度后,设置一个固定高度

第六行:else {}

字面意思,既输入框高度未达到最大高度时执行指定语句

第七行:maininput.style.height = contentheight + "px"

将输入框高度设置为获取到的实际高度


3.代码原理

该代码主要利用了最简单的获取和设置输入框高度来计算行数,不必计算输入内容或者其他巴拉巴拉的方式去计算

代码核心依赖为输入框的行高,所以请务必设置行高或通过其他方式获取行高

首先,输入框产生变化时,使输入框高度产生变化的条件有两个,分别为增加一行删除一行

删除一行(统计最少行数):

该功能依赖核心为第二行:maininput.style.height = 'auto'

作用为:使输入框高度为auto,该auto的值默认为行高*剩余行数+上下padding,从而达到删除一行内容输入框高度随之减少的效果

而利用scrollHeight则会连带着被删除的那一行一块计算,导致输入框高度为行高*最大行数+上下padding,因而无法缩短

例:由4行减少至三行时

auto值为行高*剩余行数(3行)+上下padding

scrollHeight值为行高*最大行数(4行)+上下padding

增加一行(统计最大行数):

依赖核心:let contentheight = maininput.scrollHeight

根据本人观察.scrollHeight获取的值为行高*最大行数+上下padding,所以存在padding请在本行内减去值防止效果出错

获取到高度后进行后面语句巴拉巴拉

例:由3行变为4行时

scrollHeight值为行高*最大行数(4行)+上下padding

换一种说法就是

scrollHeight获取的行数是存在过的最大行数

17行删到10行,我只认17行,因为他是存在过的最大的值

auto则是获取目前已有的行数

17行删到10行,就是10行,因为他是实质存在的值

同时auto会刷新scrollHeight记忆的,最大的值

auto后的scrollHeight

17行删到10行,就是10行,因为auto在scrollHeight前,他告诉scrollHeight值为10,那scrollHeight就认为是10

语文不好,不知道怎么形容只能这么形容,请谅解

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值