textarea 根据内容自适应高度 -- jQuery插件

时间:2021-09-09 05:13:35

 

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>JQuery plugin textareaHeightAuto</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<style type="text/css">
*{margin: 0;padding: 0}
.textarea {overflow: hidden;margin: 50px;height: 100px;width: 400px;border: 1px solid #ccc;}
.button {padding: 5px 10px;cursor: pointer;}
</style>
</head>
<body>

<textarea name="" class="area" ></textarea>
<textarea name="" class="area" ></textarea>


<script type="text/javascript">
(function($){
           $.fn.adaptiveTextarea = function(options){
               $.fn.adaptiveTextarea.defaults = {
                   "maxH":99999,
                   "minH":0
               };
               var opts = $.extend({},$.fn.adaptiveTextarea.defaults,options);
               return this.each(function(){
                   var $this = $(this);
                   var defaultH = opts.minH || $this.height();
                   //初始化
                   $this.css({
                       "overflow":"auto",
                       "resize":"none",
                       "height":defaultH + "px"
                   });
                   $this.off("propertychange input").on("propertychange input",function(){
                       this.style.height = defaultH + "px";
                       if(opts.maxH >= opts.minH){
                           this.style.height = Math.min(this.scrollHeight,opts.maxH) + "px";
                       }
                   });
               });
           }
       })(jQuery);
        //调用
        $(function(){
            $(".area").adaptiveTextarea({
                minH:80,
                maxH:300
            });
        });
</script>
</body>
</html>

 

 

 

 

 

 

 

/*
* @author 愚人码头
* 【jQuery插件】autoTextarea-文本框根据输入内容自适应高度
* 参数 maxHeight:null,//文本框是否自动撑高,默认:null,不自动撑高;如果自动撑高必须输入数值,该值作为文本框自动撑高的最大高度
* 参数 minHeight:$(this).height()//默认最小高度,也就是文本框最初的高度,当内容高度小于这个高度的时候,文本以这个高度显示
* 更多http://www.css88.com/archives/3948
*/
(function($){
    $.fn.autoTextarea = function(options) {
        var defaults={
            maxHeight:null,//文本框是否自动撑高,默认:null,不自动撑高;如果自动撑高必须输入数值,该值作为文本框自动撑高的最大高度
            minHeight:$(this).height() //默认最小高度,也就是文本框最初的高度,当内容高度小于这个高度的时候,文本以这个高度显示
        };
        var opts = $.extend({},defaults,options);
        return $(this).each(function() {
            $(this).bind("paste cut keydown keyup focus blur",function(){
                var height,style=this.style;
                this.style.height =  opts.minHeight + 'px';
                if (this.scrollHeight > opts.minHeight) {
                    if (opts.maxHeight && this.scrollHeight > opts.maxHeight) {
                        height = opts.maxHeight;
                        style.overflowY = 'scroll';
                    } else {
                        height = this.scrollHeight;
                        style.overflowY = 'hidden';
                    }
                    style.height = height  + 'px';
                }
            });
        });
    };
})(jQuery);

 

 

JS代码,默认的参数及调用:
        //默认的参数
         $(".chackTextarea-area").autoTextarea({
            maxHeight:220,//文本框是否自动撑高,默认:null,不自动撑高;如果自动撑高必须输入数值,该值作为文本框自动撑高的最大高度
            minHeight:$(this).height()//默认最小高度,也就是文本框最初的高度,当内容高度小于这个高度的时候,文本以这个高度显示
         })

        

$(".chackTextarea-area").autoTextarea({maxHeight:220});

 

 

 

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>JQuery plugin textareaHeightAuto</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<style type="text/css">
*{margin: 0;padding: 0}
.textarea {overflow: hidden;margin: 50px;height: 100px;width: 400px;border: 1px solid #ccc;}
.button {padding: 5px 10px;cursor: pointer;}
</style>
</head>
<body>

<textarea id="J_Txt" class="textarea"></textarea>
<button type="button" id="J_Btn" class="button">destroy</button>

<script type="text/javascript">
;(function($){
    var methods = {
        init: function(options){
            debug('textareaHeightAuto start !');
            var main_opts = $.extend({}, $.fn.textareaHeightAuto.defaults, options);
            return this.each(function(){
                var $this = $(this);
                debug($this);
                //var opts = $.metadata ? $.extend({}, main_opts, $this.metadata()) : main_opts;
                var opts = main_opts;
                $this.data('textareaHeightAuto', opts);
                $this.on(opts.eventName, function(){
                    var $target = $(this);
                    // 这里是比较重要的地方 必须先对textarea的高度进行设置,然后才能取 scrollHeight 的值
                    // 这是因为 scrollHeight 返回的是 元素内容的高度 + 滚动条可以滚动的高度值,明白了这点,下面就可以理解了
                    $target.height(opts.minHeight - opts.bottomHeight);// 增加这个间隔值是为了修复设置textarea高度时(特别是在最后一行回车时)跳动太大的情况
                    var scrollHeight = $target[0].scrollHeight + opts.bottomHeight;// 一加一减,相互抵消
                    if((scrollHeight) > opts.minHeight){
                        if(scrollHeight < opts.maxHeight){
                            $target.css({'overflow-y': 'hidden'}).height(scrollHeight);
                        }else{
                            $target.css({'overflow-y': 'auto'}).height(opts.maxHeight);
                        }
                    }else{
                        $target.css({'overflow-y': 'hidden'}).height(opts.minHeight);
                    }
                });
            });
        },
        destroy: function(){
            return this.each(function(){
                var $this = $(this),
                    data = $this.data('textareaHeightAuto');
                $this.off(data.eventName);
                $this.css({height: data.minHeight});// 不知道重置(还原?)textarea高度是否有必要
                $this.removeData('textareaHeightAuto');
            });
        }
    };

    $.fn.textareaHeightAuto = function(method){
        if(methods[method]){
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        }else if(typeof method === 'object' || !method){
            return methods.init.apply(this, arguments);
        }else{
            $.error('Method '+ method + ' does not exist on jQuery.textareaHeightAuto');
        }
    };

    // 内部方法
    function debug(obj){
        if(window.console && window.console.log){
            window.console.log(obj);
        }
    }

    // 可以适当暴露一些可扩展的方法
    //$.fn.textareaHeightAuto.fun = function(str){};

    // 把默认参数放在外面,使得用户可以在插件之外就修改插件默认设置
    // $.fn.textareaHeightAuto.defaults.bottomHeight = 0;// 修改插件的默认设置
    // $('#textarea').textareaHeightAuto({bottomHeight: 0});// 修改应用插件的当前元素的默认设置
    $.fn.textareaHeightAuto.defaults = {
        maxHeight: 600,
        minHeight: 100,
        bottomHeight: 18,
        eventName: 'paste cut keydown keyup focus blur'
    };
})(jQuery);

$(document).ready(function(){
    $('#J_Txt').textareaHeightAuto();

    $('#J_Btn').on('click', function(){
        $('#J_Txt').textareaHeightAuto('destroy');
        $(this).attr('disabled', true);
    });
});
</script>
</body>
</html>

 

 

 

 

 

 //最小高度和最大高度默认
  $("#textarea1").textareaAutoHeight();
  //最大高度为100px
  $("#textarea2").textareaAutoHeight({ maxHeight:100 });
  //最小高度为50px,最大高度为200px
  $("#textarea3").textareaAutoHeight({ minHeight:50, maxHeight:200 }); 

$.fn.extend({
    textareaAutoHeight: function (options) {
        this._options = {
            minHeight: 0,
            maxHeight: 1000
        } 

        this.init = function () {
            for (var p in options) {
                this._options[p] = options[p];
            }
            if (this._options.minHeight == 0) {
                this._options.minHeight=parseFloat($(this).height());
            }
            for (var p in this._options) {
                if ($(this).attr(p) == null) {
                    $(this).attr(p, this._options[p]);
                }
            }
            $(this).keyup(this.resetHeight).change(this.resetHeight)
            .focus(this.resetHeight);
        }
        this.resetHeight = function () {
            var _minHeight = parseFloat($(this).attr("minHeight"));
            var _maxHeight = parseFloat($(this).attr("maxHeight")); 

            if (!$.browser.msie) {
                $(this).height(0);
            }
            var h = parseFloat(this.scrollHeight);
            h = h < _minHeight ? _minHeight :
                        h > _maxHeight ? _maxHeight : h;
            $(this).height(h).scrollTop(h);
            if (h >= _maxHeight) {
                $(this).css("overflow-y", "scroll");
            }
            else {
                $(this).css("overflow-y", "hidden");
            }
        }
        this.init();
    }
}); 

 

 

 

 

 

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
  <title>Javascript 实现 Textarea 自动伸缩,兼容IE6、IE7、IE8、IE9、Firefox、Safari、Chome、Opera</title>
  <style type="text/css">
  textarea {overflow:hidden;}
  </style>
</head>
<body>

<textarea id="txt"></textarea>
</table>
<script type="text/javascript">
   var minRows = 5;
    // 最大高度,超过则出现滚动条
    var maxRows = 12;
    function autoResize(){
        var t = document.getElementById('txt');
        if (t.scrollTop == 0) t.scrollTop=1;
        while (t.scrollTop == 0){
            if (t.rows > minRows)
                t.rows--;
            else
                break;
            t.scrollTop = 1;
            if (t.rows < maxRows)
                t.style.overflowY = "hidden";
            if (t.scrollTop > 0){
                t.rows++;
                break;
            }
        }
        while(t.scrollTop > 0){
            if (t.rows < maxRows){
                t.rows++;
                if (t.scrollTop == 0) t.scrollTop=1;
            }
            else{
                t.style.overflowY = "auto";
                break;
            }
        }
    }
</script>
</body>
</html>