文章来源:http://blog.csdn.net/tianyitianyi1/article/details/49923069

转自:http://www.xuanfengge.com/textarea-on-how-to-achieve-a-high-degree-of-adaptive.html

今天需要些一个回复评论的页面,设计师给的初始界面就是一个只有一行的框。然后当时就想这个交互该怎么实现比较好,然后想起了新浪微博的做法:点击评论,默认显示一行,当输入的文字超过一行或者输入Enter时,输入框的高度会随着改变,直到输入完毕。顿时觉得这个细节做得挺不错的,可以效仿下。下面分享2种实现textarea高度自适应的做法,一种是用div来模拟textarea来实现的,用CSS控制样式,不用JS;另一种是利用JS控制的(因为存在浏览器兼容问题,所以写起来比较麻烦);

方法一: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>

转载于:https://www.cnblogs.com/liangzhixiaolaohu/p/8392870.html

textarea如何实现高度自适应?相关推荐

  1. html textarea文本域高度自适应

    1.可直接在 菜鸟教程网站测试页面中测试 <!DOCTYPE html> <html> <head><meta charset="utf-8&quo ...

  2. java textarea 大小_textarea高度自适应的两种方案

    阅读全文你将获得以下解决方案. 点击长文本编辑textarea,自动获得焦点 随着输入值自动伸缩高度 可复制添加信息 可粘贴文本 可粘贴图片 以下实例代码执行环境为Chrome80 方案一 HTML5 ...

  3. html textarea a 整体,html textarea文本域高度自适应

    1.可直接在 菜鸟教程网站测试页面中测试 菜鸟教程(runoob.com) id="symptomTxt" οninput="autoTextAreaHeight(thi ...

  4. div模拟textarea文本域轻松实现高度自适应——张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com 本文地址: http://www.zhangxinxu.com/wordpress/?p=1362 一.关于t ...

  5. freemarker模板文件中文本域(textarea)的高度自适应实现

    2019独角兽企业重金招聘Python工程师标准>>> freemarker模板文件中实现文本域(textarea)的高度自适应实现. 从网上找的大部分办法中很多方法兼容性并不好,要 ...

  6. div模拟textarea文本框,输入文字高度自适应,且实现字数统计和限制

    需求: 文本框可根据输入内容高度自适应,不带滚动条,高度可变的那种,我搜索了很多,发现textarea无法实现我的需求,scrollHeigh这个无法获取实际内容的高度(我用的是那种简单的,可能我写的 ...

  7. vue实现textarea框,文字高度自适应

    vue实现textarea框,文字高度自适应,https://blog.csdn.net/qq_38128179/article/details/103591717 下面是两种方式,注释掉的是一种,不 ...

  8. 自适应textarea文本域高度原理

    自适应文本域高度原理.什么是自适应文本域高度?可能名字叫的不是很容易理解,这里解释下,就是一个文本域输入框的高度会跟随内容高度变化而刚好就是文本高度.这就是自适应文本域高度 文本域的标签通常就是 te ...

  9. textarea高度自适应自动增高撑开

    方法一:div模拟textarea文本域轻松实现高度自适应 demo演示地址:http://www.xuanfengge.com/demo/201308/textarea/demo1.html 因为t ...

最新文章

  1. 少侠!如何写一手好 SQL ?
  2. treeselect 如何选中多个_word使用技巧之-如何让你工作效率翻倍提升
  3. bootstrap table 表头与内容不对齐问题解决
  4. 以太坊 node data write error_以太坊的新时代将要到来,DeFi会是最大的收益吗?
  5. 年轻人对于“绰号”的认识
  6. DataX配置及使用
  7. 题库明细 使用java理解程序逻辑
  8. pandas按照字典格式替换dataframe的值
  9. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
  10. postgresql安装过程小记
  11. Delphi取UTC时间秒
  12. exclips为什么j创建局java出错_clips.BuildRule出错
  13. MATLAB安装教程
  14. [K8S] PV动态供给
  15. 2012-2013年薪水涨幅最高的十五个IT职位
  16. flex+java项目创建_创建Flex 4和Java Web应用程序
  17. 翡翠手链的起源和发展历史
  18. 铜仁一中2021高考成绩查询,贵州铜仁第一中学2021年招生录取分数线
  19. 将扩散模型用于目标检测任务,从随机框中直接检测!
  20. ESP32任务看门狗实践

热门文章

  1. SQL Server里查看当前连接的在线用户数
  2. Flutter AnimatedSwitcher 实现优美的图片切换动画
  3. Flutter CustomScrollView实现的一个经典滑动折叠头部图片的效果
  4. Okhttp使用简析——Android网络请求框架(一)
  5. Oracle 中调用外部C动态库函数
  6. 使用vue来开发一个下拉菜单组件(2)
  7. 机器学习之--数据构造,函数图显示
  8. nodeJs利用mongoose模块操作数据
  9. 【j2ee spring】30、巴巴荆楚网-综合hibernate4+spring4(5)分页
  10. 【学习记录】Sql中存储过程的