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中还需...
3864 0
|
17天前
|
前端开发 UED
在响应式布局中,如何避免 overflow 属性法导致的滚动条显示问题?
【10月更文挑战第27天】可以在响应式布局中有效地避免因`overflow`属性法导致的滚动条显示问题,提高页面的布局美观度和用户体验,使页面在不同的设备和屏幕尺寸下都能够呈现出良好的视觉效果和交互性能。
|
6月前
使用SDAutoLayout实现控件根据内容进行宽度自适应和高度自适应
使用SDAutoLayout实现控件根据内容进行宽度自适应和高度自适应
110 2
|
6月前
UITableView根据表格内容进行高度自适应与使用Masonry实现根据内容进行宽度自适应和高度自适应
UITableView根据表格内容进行高度自适应与使用Masonry实现根据内容进行宽度自适应和高度自适应
89 0
|
6月前
|
前端开发 JavaScript UED
使用 CSS 中的form-sizing属性实现文本区域的自动增加高度
使用 CSS 中的form-sizing属性实现文本区域的自动增加高度
128 0
|
前端开发 容器
如何使用 CSS 来控制 img 标签在父元素中自适应宽度或高度,并按比例显示
如何使用 CSS 来控制 img 标签在父元素中自适应宽度或高度,并按比例显示
703 1
|
前端开发
css给超出内容设置滚动条和去除滚动条显示:
css给超出内容设置滚动条和去除滚动条显示:
208 0
|
前端开发
内容滚动条和子 div 高度自适应
一个div里面,两个子div高度自适应(平分父div的高度)和元素内容过多的时候,根据需求出现高度滚动条或者宽度滚动条。 先放最终效果(在下面会有demo代码。): Paste_Image.png 实现这些效果要怎么做呢?咱一步一步来。 第一步: 先设置html结构:这里我已经搭好了。 第二步然后开始写css样式了 设置父元素box的样式 设置box1的样式 现在尝试把html解除注释 下面就到了关键的部分了(文章末尾有demo,不想看的话,可以自己试试。): 在上面我们已经设置了最大高度和最小高度,因为box1空间不够所以溢出来了。
830 0
内容滚动条和子 div 高度自适应
|
前端开发 JavaScript UED
CSS 技巧一则 -- 不定宽溢出文本适配滚动
CSS 技巧一则 -- 不定宽溢出文本适配滚动
253 0
CSS 技巧一则 -- 不定宽溢出文本适配滚动