2014-09-12 60 views
1

我有一个包含textarea元素的div。 div的大小是固定的,但滚动条会显示是否输入了足够的文本。目前,textarea高度可以正确动态增长和缩小,但不是宽度。动态调整文本区宽度和高度以包含文本

我已被修改给定的代码在这里:http://alistapart.com/article/expanding-text-areas-made-elegant和已经得到了这一点(在的jsfiddle示出):http://jsfiddle.net/fayu5sh2/2/

它目前的工作方式是,textarea的被设定为100%的宽度和高度div,它的内容被送入一个隐藏的跨度,它改变了高度(当按下输入时)和包含div的宽度。跨度正确运行时,textarea不保持宽度:100%。是否有可能做到这一点?

隐藏跨度当前可见,以显示其内容正在做什么,textarea中的文本应该直接位于跨度中文本的顶部。

下面是HTML:

<div id="containing_box"> 
    <div class="expandingArea"> 
     <pre><span></span><br></pre> 
     <textarea></textarea> 
    </div> 
</div> 

这里是JavaScript:

$(document).ready(

    function() { 

     $('div.expandingArea').each(function() { 
      var area = $('textarea', $(this)); 
      var span = $('span', $(this)); 

      area.bind('input', function() { 
       span.text(area.val()); 
      }); 

      span.text(area.val()); 

      $(this).addClass('active'); 
     });  
    } 
); 

和CSS:

#containing_box { 
    width: 300px; 
    height: 200px; 
    overflow: auto; 
    border: 1px solid; 
} 

textarea, 
pre, p { 
    margin: 0; 
    padding: 0; 
    outline: 0; 
    border: 0; 
} 

.expandingArea { 
    position: relative; 
    border: 1px solid #888; 
    background: #fff; 
} 

.expandingArea > textarea, 
.expandingArea > pre { 
    padding: 5px; 
    background: transparent; 
    white-space: pre; 
} 

.expandingArea > textarea { 
    /* The border-box box model is used to allow 
    * padding whilst still keeping the overall width 
    * at exactly that of the containing element. */ 

    -webkit-box-sizing: border-box; 
    -moz-box-sizing: border-box; 
     -ms-box-sizing: border-box; 
      box-sizing: border-box; 


    /* This height is used when JS is disabled */ 
    height: 100px; 
    width: 100px; 
} 

.expandingArea.active > textarea { 
    /* Hide any scrollbars */ 
    overflow: hidden; 
    position: absolute; 
    top: 0; 
    left: 0; 
    height: 100%; 
    width: 100%; 
    /* Remove WebKit user-resize widget */ 
    resize: none; 
} 

.expandingArea > pre { 
    /* display: none;*/ 
    color: blue; 
} 
.expandingArea.active > pre { 
    display: block; 
    /* Hide the text; just using it for sizing */ 
    /* visibility: hidden; */ 
} 
+0

检查这个线程。 http://stackoverflow.com/questions/17772260/textarea-auto-height – sbjumani 2014-09-12 23:00:16

+0

@sbjumani我找到的所有线程似乎只处理调整textarea高度,不幸的是不是宽度... – Ayb4btu 2014-09-12 23:09:02

+0

你想避免包装,还是你想宽度和高度总是相等,所以textarea是一个正方形? – 2014-09-12 23:15:02

回答

0

在JavaScript

$('textarea').on('keyup',function(){ 
    var spanwidth = $('span').css('width') 
    $('textarea').css('width',spanwidth) 
}) 
添加此

继承人的小提琴http://jsfiddle.net/fayu5sh2/5/

如果你有比这些网页上多了一个,你需要使用ID或类,而不是一般的“跨度”和“文本区域”的

+0

我最初尝试了小提琴,发现它没有按预期工作。问题是这个函数的内容应该在我已经拥有的每个函数中。还有一些其他问题仍然存在,主要与边界不相关。 – Ayb4btu 2014-09-14 22:21:55

2

可以使一个textarea通过在keyup事件中监视其scrollWidthscrollHeight来动态调整大小。

此代码大小调整所有textarea s,而保持的50像素的最小宽度和高度:

$('textarea').on('keyup',function() { 
    $(this).css('width','0px'); 
    $(this).css('height','0px'); 
    $(this).css('width',Math.max(50,this.scrollWidth)+'px'); 
    $(this).css('height',Math.max(50,this.scrollHeight)+'px'); 
}); 

注意widthheight首先设置为0以强制滚动。

设置textareawrap属性设置为 “关”:

<textarea wrap="off"></textarea> 

,并设置其风格overflow:hidden

textarea { 
    overflow:hidden; 
} 

小提琴在http://jsfiddle.net/aj9tarnu/

+0

这使我更接近我所追求的。我已经合并了这种方法并简化了我的代码([jsfiddle](http://jsfiddle.net/4qa58b9q/1/))。尽管为什么textarea边界会在溢出中消失? – Ayb4btu 2014-09-14 09:57:48

+0

不确定你是指我的代码还是你的代码?你的小提琴明确地隐藏了textarea边框,但它应该在我的视图中可见。 – 2014-09-14 16:25:27

+0

我明白你的意思了,我看到的边框是扩展区div边框,而不是textarea边框。 – Ayb4btu 2014-09-14 22:24:52