textarea 动态宽高(根据内容动态撑开宽高)

简介: textarea 动态宽高(根据内容动态撑开宽高)

  • 推荐通过 div 实现 input、textarea 输入框,如果自定义的也需要动态计算宽高度,下面的方式可以参考,计算行高加间距就行了,下面是系统自带的 textarea
  • 重点:计算的 span 标签属性需要与 输入框 的字体属性保持一致,这样才能算的精准。
  • 案例代码,标签虽然有默认属性,但是为了能够通过 JS 取到值,所以必须手动写一遍样式属性,html 一样带上 style 即可。
<script>
  // 文本输入框(必备属性,主要是字体相关属性)
  // var inputEl = document.createElement('textarea')
  // inputEl.value = '默认文字'
  // inputEl.rows = 1
  // inputEl.style.width = '20px'
  // inputEl.style.fontSize = '20px'
  // inputEl.style.fontWeight = 400
  // inputEl.style.fontFamily = 'monospace'
  // inputEl.style.wordBreak = 'break-all'
  // inputEl.style.whiteSpace = 'normal'
  // document.body.appendChild(inputEl)
  // // 有默认内容初始化尺寸
  // inputSizeChange(inputEl)
  // 文本输入框(案例)
  var inputEl = document.createElement('textarea')
  inputEl.rows = 1
  inputEl.style.width = '20px'
  inputEl.style.fontSize = '20px'
  inputEl.style.fontWeight = 400
  inputEl.style.fontFamily = 'monospace'
  inputEl.style.padding = 0
  inputEl.style.border = 'none'
  inputEl.style.backgroundColor = 'red'
  inputEl.style.outline = 'none'
  inputEl.style.resize = 'none'
  inputEl.style.wordBreak = 'break-all'
  inputEl.style.whiteSpace = 'normal'
  document.body.appendChild(inputEl)
  // 输入监听
  inputEl.oninput = (e) => {
    // 动态调整宽高
    inputSizeChange(inputEl, 23)
  }
  // 获取焦点
  setTimeout(() => {
    // 获取焦点
    inputEl.focus()
    inputEl.select()
  }, 0)
  // 计算输入框大小
  // input:(必填)输入框
  // rowh:(必填)当没有内容时默认高度,如果不传当没有内容时会没高度
  // colw:(可选)当没有内容时默认宽度,如果不传宽度会很窄
  function inputSizeChange (input, rowh, colw) {
    // 输入的内容
    const text = input.value.replaceAll('\r','').replaceAll('\n\n','\n')
    // 创建一个 span
    const span = document.createElement('span')
    // 隐藏
    span.style.opacity = 0
    // 清空间距
    span.style.padding = 0
    span.style.margin = 0
    // 保证能正常撑开
    span.style.display = 'inline-block'
    // 字体属性跟输入框保持一致
    span.style.wordBreak = input.style.wordBreak
    span.style.whiteSpace = input.style.whiteSpace
    span.style.fontSize = input.style.fontSize
    span.style.fontWeight = input.style.fontWeight
    span.style.fontFamily = input.style.fontFamily
    // 将输入内容分割成行数组
    var texts = text.split('\n')
    // 插入标签元素
    var innerHTML = ''
    // 便利组装
    texts.forEach(function (text, index) {
      // 根据情况进行组装
      if (index === 0) {
        // 0 行直接使用
        innerHTML += text
      } else if (!text.length) {
        // 空行则手动加换行符与临时计算内容
        innerHTML += '<br/><span>s</span>'
      } else {
        // 非空行则回车加内容
        innerHTML += ('<br/>' + text)
      }
    })
    // 将回车替换成换行符
    span.innerHTML = innerHTML
    // 添加到页面上才能得到尺寸
    document.body.appendChild(span)
    // 获取 span 的宽高,+ 5 在刚好的宽度上多 5px 保证光标的显示,要不然宽度不够会自动到下一行
    var width = span.clientWidth + 5
    var height = span.clientHeight
    // 最后一行是否为空行
    var isEmptyLine = !texts[texts.length - 1].length
    // 就只剩一行并且是空行,则需要使用默认匡高
    if (texts.length === 1 && isEmptyLine) {
      if (colw) { width = colw }
      if (rowh) { height = rowh }
    }
    // 设置宽高
    input.style.width = `${width}px`
    input.style.height = `${height}px`
    // 移除计算的 span
    document.body.removeChild(span)
  }
  // 支持全部替换(部分浏览器不自带)
  String.prototype.replaceAll = function (s1, s2) {
    return this.replace(new RegExp(s1, "gm"), s2)
  }
</script>
相关文章
|
JSON 前端开发 API
fetchEventSource源码解析
fetchEventSource源码解析
2870 1
Element el-color-picker 颜色选择器详解
本文目录 1. 前言 2. 基本用法 3. 带默认值 4. 调整尺寸 5. 小结
3017 0
Element el-color-picker 颜色选择器详解
|
移动开发 缓存 JavaScript
2021最新阿里代码规范(前端篇)
2021最新阿里代码规范(前端篇)
55519 11
2021最新阿里代码规范(前端篇)
|
数据格式
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
本文介绍了在ElementUI和ElementPlus中使用`el-table`组件实现合并行功能的技巧,包括多列合并和单列合并的方法,并提供了相应的示例代码和运行效果。
8762 1
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
|
JavaScript
使用Vue+Textarea实现在文本内容变化时自适应高度
这篇文章提供了Vue 2和Vue 3中实现Textarea在文本内容变化时自适应高度的示例代码和方法。
930 0
使用Vue+Textarea实现在文本内容变化时自适应高度
【Node】Mac多版本Node切换
【Node】Mac多版本Node切换
1114 1
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
【vue2】切换页面之后滚动条停留在上个页面的位置,解决方案
874 6
element UI实现输入建议下拉列表 —— el-select filterable可筛选的下拉列表 or 带输入建议的输入框 el-autocomplete ?
element UI实现输入建议下拉列表 —— el-select filterable可筛选的下拉列表 or 带输入建议的输入框 el-autocomplete ?
627 0
|
JavaScript 前端开发 数据安全/隐私保护
vue3+ts+elementplus写一个登录页面教程
【6月更文挑战第3天】本文介绍了如何使用 Vue 3 和 TypeScript 创建一个登录页面。首先,需安装 Vue CLI,然后创建新项目并启用 TypeScript 支持。接着,创建 `Login.vue` 组件,设计登录表单,包括用户账号、密码和验证码字段,并实现相关验证规则。页面样式包括背景、登录框和按钮等元素的布局与样式。最后,展示了`&lt;script&gt;`部分的代码,包括表单验证逻辑、生成验证码的函数以及登录提交处理。文章还提供了一个登录页面的截图和完整代码示例。
5093 1
|
12月前
|
JavaScript 前端开发 API
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
本文介绍了如何在Vue 3项目中使用v-md-editor组件库来创建markdown编辑器和预览组件。文章提供了安装步骤、如何在main.js中进行全局配置、以及如何在页面中使用VMdEditor和VMdPreview组件的示例代码。此外,还提供了一个完整示例的链接,包括编辑器和预览组件的使用效果和代码。
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用