jQuery插件之Textarea自动长高

做一个小项目,要用到Textarea自动长高的效果,以前做过这个效果,方法是绑定keyup事件,根据字体大小和行高,以及换行符的个数计算实时高度。但是,对于分行短的可以,长篇的就有问题了。于是百度了下,找到一篇文章,方法是建一个隐藏textarea,根据scrollHeight来获取高度。这方法不错。不过,既然是scrollHeight可以获取实时高度,为什么还要新建一个呢?其实这是为了兼容高度减小的效果,scrollHeight最小高度总是textarea自身的高度,所以,根据自身的scrollHeight就只能增长,不能减少。

看了下代码,效果虽然达到了,考虑不够全面,没考虑到布局上需求textarea最小高度的问题,代码里设定了最小高度是20,另外,没考虑textarea样式中的字体和行高,所以不太精确。基于这些问题,作了修正,写了个jQuery插件出来,特此共享

 

jQuery.fn.extend({
	'autoHeight':function(){
		this.keyup(function(){
			var minHeight=40;
			if(!$(this).attr('min-height')){
				minHeight=$(this).innerHeight();
				$(this).attr('min-height',minHeight);
			}else{
				minHeight=$(this).attr('min-height');
			}
			if($("#_hidetextarea").length<=0){
				$("body").append('<textarea id="_hidetextarea" style="visibility:hidden;height:0;border:0;padding:0;margin:0;display:none;"></textarea>');
			}
			var mh=$("#_hidetextarea");
			mh.css({display:'',width:$(this).width(),'fontSize':$(this).css('fontSize'),'lineHeight':$(this).css('lineHeight')}).val($(this).val());
			$(this).css("height",Math.max(minHeight,mh[0].scrollHeight));
			mh.css('display','none');
		});
	}
});