小程序/网页实现textarea高度随内容自动改变


需求

textarea默认的高度不是对着内容变化,而是随着内容增多,出现了滚动条。目前的需求是实现一个能够输入的textarea,并且高度跟着内容变化。

发现了一个比较好用的插件flexText,但是这个基于jquery写的,目前的技术栈是react,所以简单看了下,然后用原生的js模拟了一个实现。

 

原理:

html结构:
  1.  
    <div class="body">
  2.  
    <div class="container">
  3.  
    <pre class="pre"><span /><br /><br /></pre>
  4.  
    <textarea class="content" placeholder="请输入内容" oninput="changeContent()"></textarea>
  5.  
    </div>
  6.  
    </div>
样式:

最外层的div不需要样式,重点在里面的pre和textarea

textarea绝对定位,高度为100%,也就是高度随着外面container的高度变化。

pre是块元素,占用空间但是不可见。在textarea输入的时候,实时的把内容写入到pre中,因为pre是container的子元素,且所以外层container的高度会被pre的高度撑开。

  1.  
    .container{
  2.  
    position: relative;
  3.  
    }
  4.  
    .content{
  5.  
    position:absolute;
  6.  
    top:0;
  7.  
    left:0;
  8.  
    height:100%;
  9.  
    background: transparent;
  10.  
    outline:0;
  11.  
    resize:none;
  12.  
    overflow:hidden;
  13.  
    }
  14.  
    .container pre {
  15.  
    display:block;
  16.  
    visibility:hidden;
  17.  
    }
js实时把textarea内容写入到pre:
  1.  
    function changeContent(){
  2.  
    var $textarea = document.getElementsByClassName( 'content');
  3.  
    var $pre = document.getElementsByClassName( 'pre');
  4.  
    $pre[ 0].innerhtml = $textarea[0].value;
  5.  
    }

 

简陋的源码

  1.  
    <!doctype html>
  2.  
    <html>
  3.  
    <head>
  4.  
    <meta charset="utf-8">
  5.  
    <meta name="viewport" content="width=device-width, initial-scale=1">
  6.  
    <style>
  7.  
    .container{
  8.  
    position: relative;
  9.  
    }
  10.  
    .content{
  11.  
    position:absolute;
  12.  
    top:0;
  13.  
    left:0;
  14.  
    height:100%;
  15.  
    background: transparent;
  16.  
    outline:0;
  17.  
    font-size: inherit;
  18.  
    color: inherit;
  19.  
    line-height: inherit;
  20.  
    text-indent: inherit;
  21.  
    letter-spacing: inherit;
  22.  
    resize:none;
  23.  
    overflow:hidden;
  24.  
    }
  25.  
    .container pre {
  26.  
    display:block;
  27.  
    visibility:hidden;
  28.  
    }
  29.  
     
  30.  
    </style>
  31.  
    </head>
  32.  
    <body>
  33.  
    <div class="body">
  34.  
    <div class="container">
  35.  
    <pre class="pre"><span /><br /><br /></pre>
  36.  
    <textarea class="content" placeholder="请输入内容" oninput="changeContent()"></textarea>
  37.  
    </div>
  38.  
    </div>
  39.  
    <script>
  40.  
    function changeContent(){
  41.  
    var $textarea = document.getElementsByClassName('content');
  42.  
    var $pre = document.getElementsByClassName('pre');
  43.  
    $pre[0].innerhtml = $textarea[0].value;
  44.  
    }
  45.  
    </script>
  46.  
    </body>
  47.  
    </html>

 

使用oninput而不是onchange的原因:

onkeyup使用复制粘贴时,高度不能自动改变

onchange事件:在内容改变(两次内容有可能相等)且失去焦点时触发,不能实时同步

oninput事件:html5 的标准事件,可以用来检测元素通过用户界面发生的内容变化,在内容修改后立即被触发

 

小程序中的实现

wxml:

<view class="text-box">
      <text>{{currentInput}}</text>
      <textarea class="weui-textarea" placeholder="请输入文本" bindinput="getInput" maxlength="1000"/>
</view>

  

 

wxss:

.text-box{
    width:100%; 
    position: relative;
    min-height:80rpx;
   margin-top:17rpx;
}
.text-box text{
   display:block;
   visibility:hidden;
   word-break:break-all;
   word-wrap:break-word;
}
.text-box .weui-textarea{
    height:100%;
    position: absolute;
    left:0;
    top:0; 
    overflow-y:hidden;
    word-break:break-all;
    word-wrap:break-word;
}

  

 

js:

Page({
  data: {
    currentInput:''
  },
  getInput:function(e){
    this.setData({
      currentInput: e.detail.value
    })
  }
})

  

资源网站大全 https://55wd.com 设计导航https://www.wode007.com/favorites/sjdh

提醒:默认textarea应该是200个字,如果想要增加字数限制,使用maxlength属性

扩展:如果想给textarea输入的文字加删除线,只需把text的visibility:hidden; 属性去掉,给textarea加一个透明的颜色就可以了。透明颜色:color:rgba(52, 52, 52,0.5);


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM