高度隨內(nèi)容變化并顯示字符數(shù)限制的<textarea>

當網(wǎng)頁中同時存在多個編輯框,文本高度都超過了<textarea>的高度時,編輯框內(nèi)容將變成可滑動的,多個編輯框都可以滑動,加上網(wǎng)頁的滑動,將會帶來網(wǎng)頁交互上的焦點混亂,尤其是在手機等小屏幕顯示網(wǎng)頁時,這種混亂會更加明顯。編輯框高度如果能隨高度變化,將能改善這種交互。

要實現(xiàn)這種效果其實也很簡單,即當內(nèi)容變化時實時計算和改變<textarea>的高度即可。
當 input 事件發(fā)生時添加如下方法來改變當前<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

從圖中我們可以看到左下角還有輸入的字數(shù)的實時顯示,而這里一個漢字被當作一個字符而兩個ascii碼被當作一個字符,其計算方法是如下函數(shù)得出的長度再除以2再取整數(shù)。

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="http://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="輸入內(nèi)容" 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="輸入內(nèi)容" 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>

下圖是當字符數(shù)超過限制時的顯示效果:


當字數(shù)超過限制時的顯示效果.png

本文所用到的知識很簡單,在不久前剛接觸h5時上面的知識確實把自己難倒過,所以在此只為做一點記錄和整理,見笑。由于最近看的東西太雜,很多知識學習都不夠深入,難以成文,見諒。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,052評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,769評論 25 709
  • 既然陪伴有期,在彼此交匯的時間里,好好愛對方,好好愛自己,且行且珍惜! ...
    溫墨Cherry閱讀 327評論 0 1
  • 2天后,全國近千萬學子將迎接人生的第一次大考—高考。等成績出來后,迎來的就是一次重大選擇:填志愿??蓜e小看選學校和...
    艾米正能量閱讀 277評論 0 1
  • 有一天的晩上,我坐在床上。手里拿著一本書,我一邊看書,一邊想東西。眉毛皺的緊緊的,突然,砰——!的一聲巨響。嚇了我...
    莉妲閱讀 324評論 0 1

友情鏈接更多精彩內(nèi)容