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>
相关文章
|
前端开发 开发者 容器
CSS 自适应内容宽度的输入框
CSS 自适应内容宽度的输入框
CSS 自适应内容宽度的输入框
CSS------当内容超出div宽度后自动换行和限制文字不超出div宽度和高度
原文:CSS------当内容超出div宽度后自动换行和限制文字不超出div宽度和高度 如图:   1.自动换行 111111111111111111111111 2.限制宽高度 11111111111111111111111111  (注意:如果div放在li中还需...
3705 0
|
5月前
CSS3 背景图片显示尺寸(放大/缩小背景图)(background-size) (背景适配 自适应)
CSS3 背景图片显示尺寸(放大/缩小背景图)(background-size) (背景适配 自适应)
|
9月前
|
前端开发 容器
如何使用 CSS 来控制 img 标签在父元素中自适应宽度或高度,并按比例显示
如何使用 CSS 来控制 img 标签在父元素中自适应宽度或高度,并按比例显示
304 1
|
前端开发
CSS层级小技巧:在滚动时自动添加头部阴影
CSS层级小技巧:在滚动时自动添加头部阴影
180 0
CSS层级小技巧:在滚动时自动添加头部阴影
|
前端开发
CSS常用定位方法(绝对定位、相对定位、固定定位)
CSS常用定位方法(绝对定位、相对定位、固定定位)
CSS常用定位方法(绝对定位、相对定位、固定定位)
|
前端开发 JavaScript
css控制超出宽度 ...展示
css控制超出宽度 ...展示
167 0
|
前端开发
CSS高级技巧——鼠标样式,轮廓,文本域防拖拽,vertical-align 垂直对齐,文字溢出问题
CSS高级技巧——鼠标样式,轮廓,文本域防拖拽,vertical-align 垂直对齐,文字溢出问题
192 0
CSS高级技巧——鼠标样式,轮廓,文本域防拖拽,vertical-align 垂直对齐,文字溢出问题
|
前端开发
内容滚动条和子 div 高度自适应
一个div里面,两个子div高度自适应(平分父div的高度)和元素内容过多的时候,根据需求出现高度滚动条或者宽度滚动条。 先放最终效果(在下面会有demo代码。): Paste_Image.png 实现这些效果要怎么做呢?咱一步一步来。 第一步: 先设置html结构:这里我已经搭好了。 第二步然后开始写css样式了 设置父元素box的样式 设置box1的样式 现在尝试把html解除注释 下面就到了关键的部分了(文章末尾有demo,不想看的话,可以自己试试。): 在上面我们已经设置了最大高度和最小高度,因为box1空间不够所以溢出来了。
726 0
内容滚动条和子 div 高度自适应
|
JavaScript
js 实现上下拖动改变父 div 的高度,左右上下拖动动态分割孩子的宽高
js 实现上下拖动改变父 div 的高度,左右上下拖动动态分割孩子的宽高
504 0
js 实现上下拖动改变父 div 的高度,左右上下拖动动态分割孩子的宽高