返回顶部
首页 > 资讯 > 精选 >Vue中textarea自适应高度方案怎么实现
  • 153
分享到

Vue中textarea自适应高度方案怎么实现

2023-06-22 08:06:23 153人浏览 八月长安
摘要

本篇内容介绍了“Vue中textarea自适应高度方案怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!隐藏的问题抛开原生js,框架的大

本篇内容介绍了“Vue中textarea自适应高度方案怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

隐藏的问题

抛开原生js框架的大部分UI库都支持自适应textarea高度功能,但普遍都忽略了一个功能,就是自适应高度的回显。

使用这些库的时候,我们很容易的在textarea中键入内容,超出范围时会自动延展一行,保证内容高度的自适应。当我们提交内容,在其它页面使用同样的UI来渲染时,麻烦的就来了,有些UI库是不支持自适应回显的,这就需要我们通过行高、行数甚至高度之间的计算得出一个基值,从而实现回显。

解决自适应高度的方案

常见得方案有两种,一种是在页面地“边远地区”添加一个ghost dom来模拟输入换行,这个dom的可能是editable属性为true的div或者是一个一摸一样得textarea。
以element-ui的input组件举例,当我们在组件内输入值时,会调用resizeTextarea方法

resizeTextarea() {  if (this.$isServer) return;  const { autosize, type } = this;  if (type !== 'textarea') return;  if (!autosize) {    this.textareaCalcStyle = {      minHeight: calcTextareaHeight(this.$refs.textarea).minHeight    };    return;  }  const minRows = autosize.minRows;  const maxRows = autosize.maxRows;  this.textareaCalcStyle = calcTextareaHeight(this.$refs.textarea, minRows, maxRows);}

当设置了autosize为true则textarea设为自适应高度。此时textarea的高度会通过calcTextareaHeight方法实时计算。

export default function calcTextareaHeight(  targetElement,  minRows = 1,  maxRows = null) {  if (!hiddenTextarea) {    hiddenTextarea = document.createElement('textarea');    document.body.appendChild(hiddenTextarea);  }  let {    paddingSize,    borderSize,    boxSizing,    contextStyle  } = calculatenodeStyling(targetElement);  hiddenTextarea.setAttribute('style', `${contextStyle};${HIDDEN_STYLE}`);  hiddenTextarea.value = targetElement.value || targetElement.placeholder || '';  let height = hiddenTextarea.scrollHeight;  const result = {};  if (boxSizing === 'border-box') {    height = height + borderSize;  } else if (boxSizing === 'content-box') {    height = height - paddingSize;  }  hiddenTextarea.value = '';  let singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;  if (minRows !== null) {    let minHeight = singleRowHeight * minRows;    if (boxSizing === 'border-box') {      minHeight = minHeight + paddingSize + borderSize;    }    height = Math.max(minHeight, height);    result.minHeight = `${ minHeight }px`;  }  if (maxRows !== null) {    let maxHeight = singleRowHeight * maxRows;    if (boxSizing === 'border-box') {      maxHeight = maxHeight + paddingSize + borderSize;    }    height = Math.min(maxHeight, height);  }  result.height = `${ height }px`;  hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);  hiddenTextarea = null;  return result;};

我们可以看到

if (!hiddenTextarea) {  hiddenTextarea = document.createElement('textarea');  document.body.appendChild(hiddenTextarea);}

element-ui创建了一个textarea的dom,通过calculateNodeStyling方法将真正的textarea的样式复制给hiddenTextarea(overflow不同步,真正的textarea是为hidden)。接着监听textarea的输入值,同步给hiddenTextarea。同时将hiddenTextarea的scrollHeight同步给textarea的高度,最后再将dom销毁掉。

关于样式的同步,element这里用了getComputedStyle和getPropertyValue这两个api。当然,如果你自己封装的话,也可以使用CSS预处理器的mixin。

第二种方案与第一种方案类似,不过不会创建额外的dom。以开头的vue-awesome-textarea举例:

init() {  this.initAutoResize()},initAutoResize () {  this.autoResize && this.$nextTick(this.calcResize)}

在页面mounted或者内容变动且开启自适应高度autoResize的时候,执行this.calcResize方法。

calcResize() {  this.resetHeight()  this.calcTextareaH()},resetHeight() {  this.height = 'auto'},calcTextareaH() {  let contentHeight = this.calcContentHeight()  this.height = this.calcHeightChange(contentHeight) + 'px'  if (this.needUpdateRows(contentHeight)) {    this.updateRows(contentHeight)  }  this.oldContentHeight = contentHeight},calcContentHeight () {  const { paddingSize } = this.calcNodeStyle(this.$el)  return this.$el.scrollHeight - paddingSize},

resetHeight()是来初始化textarea的高度,默认为auto。calcTextareaH()方法是用来计算内容区域的高度(textarea的scrollHeight减去padding的高度),同时将计算好的高度实时同步给textarea的高:
this.height = this.calcHeightChange(contentHeight) + 'px'

相比方案一,这个方案采用的思路相同(动态修改高度),但是减少了额外的dom创建和销毁的过程。
此外,vue-awesome-textarea还支持在自适应的过程中回调行数,可以更好的支持数据回显。实现的方法也很简单:

computed: {  ...  oneRowsHeight() {    return this.calcContentHeight() / Number(this.rows) || 0  }  ...}

在computed中我们计算出单行的高度,同时在执行this.calcTextareaH()方法时我们记录下内容高度:

this.oldContentHeight = contentHeight

接着我们会比对是否存在添加行操作,一旦添加则新的内容高度和老的内容高度会不同:

needUpdateRows(newContentHeight) {  return this.oldContentHeight !== newContentHeight},

此时我们会把最新的行高emit到组件外部:

updateRows(contentHeight) {  this.$emit('getRows', Math.round(contentHeight / this.oneRowsHeight))}

“Vue中textarea自适应高度方案怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Vue中textarea自适应高度方案怎么实现

本文链接: https://lsjlt.com/news/303454.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue中textarea自适应高度方案怎么实现
    本篇内容介绍了“Vue中textarea自适应高度方案怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!隐藏的问题抛开原生JS,框架的大...
    99+
    2023-06-22
  • Vue中textarea自适应高度方案的实现
    目录隐藏的问题解决自适应高度的方案先给方案,Vue栈有需求的同学可以直接下载vue-awesome-textarea 隐藏的问题 抛开原生JS,框架的大部分UI库都支持自适应text...
    99+
    2024-04-02
  • 怎么实现一个自适应高度的textarea
    今天就跟大家聊聊有关怎么实现一个自适应高度的textarea,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方法 HTML结构:<div id="contai...
    99+
    2023-06-09
  • 怎么在HTML5中使用 textarea实现高度自适应
    今天就跟大家聊聊有关怎么在HTML5中使用 textarea实现高度自适应,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方案一HTML5 Textarea 元素1. 自动获得焦点点击...
    99+
    2023-06-09
  • CSS中textarea高度自适应问题怎么解决
    这篇文章主要介绍“CSS中textarea高度自适应问题怎么解决”,在日常操作中,相信很多人在CSS中textarea高度自适应问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • css textarea高度自适应无滚动条怎么设置
    要实现textarea高度自适应且无滚动条,可以通过以下CSS样式设置:```csstextarea {resize: none; ...
    99+
    2023-09-20
    css
  • css高度自适应怎么实现
    这篇文章跟大家分析一下“css高度自适应怎么实现”。内容详细易懂,对“css高度自适应怎么实现”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。...
    99+
    2024-04-02
  • css怎么实现高度自适应
    本篇内容主要讲解“css怎么实现高度自适应”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css怎么实现高度自适应”吧!在写css静态页面的时候让Html的高度自适应屏幕高度是一个常见的需求,比如...
    99+
    2023-06-20
  • vue中的echarts实现宽度自适应的解决方案
    今天项目中需要使用到 echarts 为了自适应。找到了。以下解决方案、 效果图 代码 <template> <!-- 这是图表开始 --> &l...
    99+
    2024-04-02
  • iframe实现高度自适应小程序web-view方案
    目录前言关于 contentWindow, contentDocument定义和用法解决方案前言 最近在项目开发中,遇到一种场景:H5的页面展示的有服务端返回的页面展示,所以考虑的i...
    99+
    2023-01-11
    iframe高度自适应web-view iframe自适应web-view
  • iframe窗口高度自适应怎么实现
    要实现iframe窗口的高度自适应,可以使用以下方法:1. 使用JavaScript动态调整iframe的高度。在iframe的内容...
    99+
    2023-08-11
    iframe
  • 怎么实现图片高度随宽度自适应
    本篇文章为大家展示了怎么实现图片高度随宽度自适应,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、可以使用js判断图片的宽度得到具体数值之后,再来利用js设置图片的高度(这里就不具体为大家细说了)。...
    99+
    2023-06-09
  • 使用postMessage怎么实现iframe自适应高度
    这篇文章将为大家详细讲解有关使用postMessage怎么实现iframe自适应高度,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。index.html :<!DOCTYPE ...
    99+
    2023-06-09
  • CSS实现高度自适应铺满整屏的案例
    这篇文章主要介绍CSS实现高度自适应铺满整屏的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在自己写demo的过程中,想使用display:flex实现垂直居中,代码如下:<style> &...
    99+
    2023-06-08
  • iframe窗口高度自适应的实现方法
    要实现iframe窗口高度自适应,可以通过以下方法:1. 使用JavaScript动态调整iframe的高度:- 在iframe加载...
    99+
    2023-08-11
    iframe
  • css怎么让高度自适应
    这篇文章主要介绍了css怎么让高度自适应,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 css让高度自适应的方法...
    99+
    2024-04-02
  • css宽度自适应怎么实现
    这篇文章将为大家详细讲解有关css宽度自适应怎么实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。   我们经常会看到这样的页面,左侧(或者右侧)为固定的导航或者菜单栏...
    99+
    2024-04-02
  • echarts怎么实现自适应宽度
    要实现Echarts图表的自适应宽度,你可以使用以下方法: 使用CSS样式控制容器的宽度:将Echarts绘图容器的宽度设置为一个...
    99+
    2023-10-21
    echarts
  • CSS怎么让iframe实现自适应高度的效果
    小编给大家分享一下CSS怎么让iframe实现自适应高度的效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!   iframe自适应高度   出于演示目的,本文将使用视频嵌入我们的if...
    99+
    2024-04-02
  • 微信小程序怎么实现swiper高度自适应
    本篇内容主要讲解“微信小程序怎么实现swiper高度自适应 ”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序怎么实现swiper高度自适应 ”吧!要求:swiper高度自适应wxml&l...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作