textarea高度自適應自動增高撐開

方法一:div模擬textarea文本域輕鬆實現高度自適應

demo演示地址:http://www.xuanfengge.com/demo/201308/textarea/demo1.html

因爲textarea不支持自適應高度,就是定好高度或者是行數之後,超出部分就會顯示滾動條,看起來不美觀。

而用DIV來模擬時,首先遇到的問題是:div怎麼實現輸入功能?

可能我們還是第一次見到這個屬性contenteditable,如一個普通的block元素上加個contenteditable="true"就實現編輯,出現光標了。如

1

<div contenteditable="true"></div>

contenteditable屬性雖是HTML5裏面的內容,但是IE似乎老早就支持此標籤屬性了。所以,兼容性方面還是不用太擔心的。

CSS代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

.textarea{

    width: 400px;

    min-height: 20px;

    max-height: 300px;

    _height: 120px;

    margin-left: auto;

    margin-right: auto;

    padding: 3px;

    outline: 0;

    border: 1px solid #a0b3d6;

    font-size: 12px;

    line-height: 24px;

    padding: 2px;

    word-wrap: break-word;

    overflow-x: hidden;

    overflow-y: auto;

 

    border-color: rgba(82, 168, 236, 0.8);

    box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);

}

 HTML代碼

1

<div class="textarea" contenteditable="true"><br /></div>

CSS代碼中,因爲IE6不支持min/max,所以做了hack,其他的也好理解。

方法二:文本框textarea根據輸入內容自適應高度

demo演示地址:http://www.xuanfengge.com/demo/201308/textarea/demo2.html

這個寫法是用原生JS寫的,考慮了很多兼容性問題,完全和新浪微博的回覆效果一樣的功能。有興趣的童鞋可以仔細分析下代碼。

CSS代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#textarea {

    display: block;

    margin:0 auto;

    overflow: hidden;

    width: 550px;

    font-size: 14px;

    height: 18px;

    line-height: 24px;

    padding:2px;

}

textarea {

    outline: 0 none;

    border-color: rgba(82, 168, 236, 0.8);

    box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);

}

JavaScript代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

/**

* 文本框根據輸入內容自適應高度

* @param                {HTMLElement}        輸入框元素

* @param                {Number}                設置光標與輸入框保持的距離(默認0)

* @param                {Number}                設置最大高度(可選)

*/

var autoTextarea = function (elem, extra, maxHeight) {

        extra = extra || 0;

        var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,

        isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),

                addEvent = function (type, callback) {

                        elem.addEventListener ?

                                elem.addEventListener(type, callback, false) :

                                elem.attachEvent('on' + type, callback);

                },

                getStyle = elem.currentStyle ? function (name) {

                        var val = elem.currentStyle[name];

 

                        if (name === 'height' && val.search(/px/i) !== 1) {

                                var rect = elem.getBoundingClientRect();

                                return rect.bottom - rect.top -

                                        parseFloat(getStyle('paddingTop')) -

                                        parseFloat(getStyle('paddingBottom')) + 'px';        

                        };

 

                        return val;

                } : function (name) {

                                return getComputedStyle(elem, null)[name];

                },

                minHeight = parseFloat(getStyle('height'));

 

        elem.style.resize = 'none';

 

        var change = function () {

                var scrollTop, height,

                        padding = 0,

                        style = elem.style;

 

                if (elem._length === elem.value.length) return;

                elem._length = elem.value.length;

 

                if (!isFirefox && !isOpera) {

                        padding = parseInt(getStyle('paddingTop')) + parseInt(getStyle('paddingBottom'));

                };

                scrollTop = document.body.scrollTop || document.documentElement.scrollTop;

 

                elem.style.height = minHeight + 'px';

                if (elem.scrollHeight > minHeight) {

                        if (maxHeight && elem.scrollHeight > maxHeight) {

                                height = maxHeight - padding;

                                style.overflowY = 'auto';

                        } else {

                                height = elem.scrollHeight - padding;

                                style.overflowY = 'hidden';

                        };

                        style.height = height + extra + 'px';

                        scrollTop += parseInt(style.height) - elem.currHeight;

                        document.body.scrollTop = scrollTop;

                        document.documentElement.scrollTop = scrollTop;

                        elem.currHeight = parseInt(style.height);

                };

        };

 

        addEvent('propertychange', change);

        addEvent('input', change);

        addEvent('focus', change);

        change();

};

HTML代碼(寫在body裏面的)

1

2

3

4

5

<textarea id="textarea" placeholder="回覆內容"></textarea>

    <script>

        var text = document.getElementById("textarea");

        autoTextarea(text);// 調用

    </script>

 

方法三:文本框textarea根據輸入內容自適應高度,使用scrollHeight方法

HTML代碼:

<textarea id="textarea"></textarea>

JavaScript代碼:

//code from http://caibaojian.com/textarea-autoheight.html
function makeExpandingArea(el) {
    var timer = null;
    //由於ie8有溢出堆棧問題,故調整了這裏
    var setStyle = function(el, auto) {
        if (auto) el.style.height = 'auto';
        el.style.height = el.scrollHeight + 'px';
    }
    var delayedResize = function(el) {
        if (timer) {
            clearTimeout(timer);
            timer = null;
        }
        timer = setTimeout(function() {
            setStyle(el)
        }, 200);
    }
    if (el.addEventListener) {
        el.addEventListener('input', function() {
            setStyle(el, 1);
        }, false);
        setStyle(el)
    } else if (el.attachEvent) {
        el.attachEvent('onpropertychange', function() {
            setStyle(el)
        })
        setStyle(el)
    }
    if (window.VBArray && window.addEventListener) { //IE9
        el.attachEvent("onkeydown", function() {
            var key = window.event.keyCode;
            if (key == 8 || key == 46) delayedResize(el);

        });
        el.attachEvent("oncut", function() {
            delayedResize(el);
        }); //處理粘貼
    }
}

var textarea = document.getElementById('textarea');
makeExpandingArea(textarea);
如果展示無滾動條textarea添加css元素
textarea{
  overflow:hidden;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章