如何实现textarea的autoHeight功能

简介: 这个功能还比较常见,用来获取文本的长宽(避免了计算不准的问题),主要用于实现 textarea 自动变长。可以看到在我们使用 textarea 的时候,有时候需要感知内容的高度,然后动态撑开。(elementUI 的 textarea 就提供了 autosize 的功能。)那我们也想实现这样的功能应该怎么办呢?获取内容,然后统计字符个数估算。中文算两个,英文算一个。但是还是有问题的,比如说非等宽字体。聪明的读者已经看到了我们中间的 div 效果,就是我们想要的高度。也是 elementUI 的方案,创建一个拥有相同样式的 div,然后获取他的高度。

bVcHRXs.webp.jpg


构建相同样式的 DOM


看上去这个方案是最妙的。那么如何构建相同的DOM呢?


  1. 既然要构建相同的 DOM,那么我们需要知道 DOM 长什么样子。
    那么如何获取样式呢?获取class?获取style?


nonono,我们要用 window.getComputedStyle(el),然后就可以快乐的拿到计算后的属性。


  1. 之后我们需要知道什么属性会影响字体排列。


CONTEXT_STYLE = [ 'letter-spacing', 'line-height', 'padding-top', 'padding-bottom', 'font-family', 'font-weight', 'font-size', 'text-rendering', 'text-transform', 'width', 'text-indent', 'padding-left', 'padding-right', 'border-width', 'box-sizing']


  1. 因为我们需要重新搞一个DOM节点,而且我们不希望这个过程被用户看到,所以我们要隐藏起来。有什么方案呢?


  • display:none 这个是不行的,因为 none 之后不会绘制了。也就获取不到宽高了。


  • opacity:0 这个可以


  • visibility: hidden; 这个也可以


  • height:0;overflow:hidden 这个也可以,获取scrollHeight


  • z-index:-999 这也可以的。


  • position:absolute;top:-9999px;left:-9999px 也是可以的


elementUI 实现


https://github.com/ElemeFE/element/blob/dev/packages/input/src/calcTextareaHeight.js


let hiddenTextarea;
const HIDDEN_STYLE = `
  height:0 !important;
  visibility:hidden !important;
  overflow:hidden !important;
  position:absolute !important;
  z-index:-1000 !important;
  top:0 !important;
  right:0 !important
`;
const CONTEXT_STYLE = [
  'letter-spacing',
  'line-height',
  'padding-top',
  'padding-bottom',
  'font-family',
  'font-weight',
  'font-size',
  'text-rendering',
  'text-transform',
  'width',
  'text-indent',
  'padding-left',
  'padding-right',


相关文章
Latex更改字体颜色以及快速生成 SCI 论文的 revised version 和 pure version
Latex更改字体颜色以及快速生成 SCI 论文的 revised version 和 pure version
Latex更改字体颜色以及快速生成 SCI 论文的 revised version 和 pure version
|
JavaScript
vite-plugin-html的使用及实现
【8月更文挑战第4天】vite-plugin-html的使用及实现(实现一个简易版的插件)
1318 4
|
人工智能 自然语言处理 API
深入浅出LangChain与智能Agent:构建下一代AI助手
LangChain为大型语言模型提供了一种全新的搭建和集成方式,通过这个强大的框架,我们可以将复杂的技术任务简化,让创意和创新更加易于实现。本文从LangChain是什么到LangChain的实际案例到智能体的快速发展做了全面的讲解。
283007 62
深入浅出LangChain与智能Agent:构建下一代AI助手
|
人工智能 弹性计算 关系型数据库
学生免费领取阿里云服务器一年的方法,以及各种活动
学生可以免费领取阿里云服务器一年,新人可获2核4G,非新人2核2G。访问链接注册并完成学生认证,领取300元无门槛优惠券,购买轻量应用服务器。此外,还有多项活动可赢取实物奖品。
5856 2
|
数据采集 API 开发者
拼多多API接口怎么申请
拼多多API接口申请步骤简述:首先访问拼多多开放平台并注册账号,选择开发者类型并填写资料,审核通过后创建应用并申请API接口权限,等待审核结果,获取API密钥等信息。完成后,即可使用拼多多API接口进行开发,注意遵守相关规定。
|
Java API 数据安全/隐私保护
POI 导出 Excel:字体颜色、行列自适应、锁住、合并单元格……
POI 导出 Excel:字体颜色、行列自适应、锁住、合并单元格……
1021 0
POI 导出 Excel:字体颜色、行列自适应、锁住、合并单元格……
|
机器学习/深度学习 索引
深度学习基础:标量、向量、矩阵、张量
深度学习基础:标量、向量、矩阵、张量
1582 0
深度学习基础:标量、向量、矩阵、张量
【已解决】笔记本电脑连接wifi异常(无法连接到这个网络)
笔记本电脑连接wifi异常(无法连接到这个网络)
2425 1
【已解决】笔记本电脑连接wifi异常(无法连接到这个网络)
|
存储 Python
datetime库:Python日期与时间值管理计算(二)
datetime库:Python日期与时间值管理计算(二)
447 1
datetime库:Python日期与时间值管理计算(二)
|
存储 关系型数据库 MySQL
【MySQL】innodb_log_file_size=256M,是干什么的?底层原理是什么?
【MySQL】innodb_log_file_size=256M,是干什么的?底层原理是什么?
719 0