高度随内容变化并显示字符数限制的<textarea>

当网页中同时存在多个编辑框,文本高度都超过了<textarea>的高度时,编辑框内容将变成可滑动的,多个编辑框都可以滑动,加上网页的滑动,将会带来网页交互上的焦点混乱,尤其是在手机等小屏幕显示网页时,这种混乱会更加明显。编辑框高度如果能随高度变化,将能改善这种交互。

要实现这种效果其实也很简单,即当内容变化时实时计算和改变<textarea>的高度即可。
当 input 事件发生时添加如下方法来改变当前<textarea>的高度

        $('textarea').unbind('input');
        $('textarea').bind('input', function () {
            handleTextareaHeight(this);
        });
        function handleTextareaHeight(element) {
            var textareaMinHeight = 108;
            element.style.height = textareaMinHeight + 'px';
            if (element.scrollHeight > textareaMinHeight) {
                element.style.height = element.scrollHeight + 'px';
            }
        }

其中textareaMinHeight 限定的是<textarea>最小高度。其对比显示效果如下

示例1.png

从图中我们可以看到左下角还有输入的字数的实时显示,而这里一个汉字被当作一个字符而两个ascii码被当作一个字符,其计算方法是如下函数得出的长度再除以2再取整数。

function getByteLen(val) {
     var len = 0;
     for (var i = 0; i < val.length; i++) {
           var a = val.charAt(i);
           if (a.match(/[^\x00-\xff]/ig) != null) {
                len += 2;
           }
           else {
                len += 1;
           }
     }
     return len;
}

完整代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <script src="//lib.sinaapp.com/js/jquery/2.0.3/jquery-2.0.3.min.js"></script>
    <!--<link href="./css/respond_media.css" rel="stylesheet"/>-->
    <style>
        .text-area {
            padding: 8px 8px 8px 8px;
            background-color: #eeeeee;
            width: 100%;
            color: #404040;
            font-size: 15px;
            resize: none;
            height: 120px;
        }
        .text-editing {
            background-color: white;
            width: 100%;
            position: relative;
            margin-top: 5px;
            margin-bottom: 5px;
        }
        .text-size-alert {
            color: #9a9a9a;
            font-size: 10px;
            position: absolute;
            line-height: 8px;
            left: 9px;
            bottom: 12px;
        }
    </style>
</head>
<body>

<div  class = "text-editing"  style="margin: 50px;max-width:400px">
    <textarea class="text-area" placeholder="输入内容" rows="4"></textarea>
    <div class="text-size-alert"></div>
</div>

<div  class = "text-editing"  style="margin: 50px;max-width:400px">
    <textarea class="text-area" placeholder="输入内容" rows="4"></textarea>
    <div class="text-size-alert"></div>
</div>

<script>
    $(function(){
        var maxEditNumber = 2048;
        $('textarea').unbind('input');
        $('textarea').bind('input', function () {
            //this.clientHeight = this.scrollHeight;
            handleTextareaHeight(this);
            updateTextSizeShow(this);
        });
        $('textarea').unbind('focus');
        $('textarea').bind('focus', function () {
            handleTextareaHeight(this);
        });

        function handleTextareaHeight(element) {
            var textareaMinHeight = 108;
            element.style.height = textareaMinHeight + 'px';
            if (element.scrollHeight > textareaMinHeight) {
                element.style.height = element.scrollHeight + 'px';
            }
        }
        function updateTextSizeShow(element) {
            var string = $(element).val();
            var len = maxEditNumber - Math.floor(getByteLen(string) / 2);
            var alert = $(element).parents('.text-editing').find('.text-size-alert');
            if (len >= 0) {
                len = maxEditNumber - len;
                alert.html(len + '/' + maxEditNumber);
            }
            else {
                len = -len;
                alert.html('<span>-' + len + '</span>');
            }
        }
        function getByteLen(val) {
            var len = 0;
            for (var i = 0; i < val.length; i++) {
                var a = val.charAt(i);
                if (a.match(/[^\x00-\xff]/ig) != null) {
                    len += 2;
                }
                else {
                    len += 1;
                }
            }
            return len;
        }
    });
</script>
</body>
</html>

下图是当字符数超过限制时的显示效果:


当字数超过限制时的显示效果.png

本文所用到的知识很简单,在不久前刚接触h5时上面的知识确实把自己难倒过,所以在此只为做一点记录和整理,见笑。由于最近看的东西太杂,很多知识学习都不够深入,难以成文,见谅。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,196评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,916评论 25 708
  • 既然陪伴有期,在彼此交汇的时间里,好好爱对方,好好爱自己,且行且珍惜! ...
    温墨Cherry阅读 301评论 0 1
  • 2天后,全国近千万学子将迎接人生的第一次大考—高考。等成绩出来后,迎来的就是一次重大选择:填志愿。可别小看选学校和...
    艾米正能量阅读 212评论 0 1
  • 有一天的晩上,我坐在床上。手里拿着一本书,我一边看书,一边想东西。眉毛皱的紧紧的,突然,砰——!的一声巨响。吓了我...
    莉妲阅读 297评论 0 1