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

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

要實現(xiàn)這種效果其實也很簡單释涛,即當(dāng)內(nèi)容變化時實時計算和改變<textarea>的高度即可。
當(dāng) input 事件發(fā)生時添加如下方法來改變當(dāng)前<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ù)的實時顯示唇撬,而這里一個漢字被當(dāng)作一個字符而兩個ascii碼被當(dāng)作一個字符,其計算方法是如下函數(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>

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


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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末指么,一起剝皮案震驚了整個濱河市酝惧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伯诬,老刑警劉巖系奉,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異姑廉,居然都是意外死亡缺亮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門桥言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萌踱,“玉大人,你說我怎么就攤上這事号阿〔⑼遥” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵扔涧,是天一觀的道長园担。 經(jīng)常有香客問我届谈,道長,這世上最難降的妖魔是什么弯汰? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任艰山,我火速辦了婚禮,結(jié)果婚禮上咏闪,老公的妹妹穿的比我還像新娘曙搬。我一直安慰自己,他們只是感情好鸽嫂,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布纵装。 她就那樣靜靜地躺著,像睡著了一般据某。 火紅的嫁衣襯著肌膚如雪橡娄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天癣籽,我揣著相機與錄音挽唉,去河邊找鬼。 笑死才避,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氨距。 我是一名探鬼主播桑逝,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俏让!你這毒婦竟也來了楞遏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤首昔,失蹤者是張志新(化名)和其女友劉穎寡喝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勒奇,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡预鬓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赊颠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片格二。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竣蹦,靈堂內(nèi)的尸體忽然破棺而出顶猜,到底是詐尸還是另有隱情,我是刑警寧澤痘括,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布长窄,位于F島的核電站滔吠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挠日。R本人自食惡果不足惜疮绷,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肆资。 院中可真熱鬧矗愧,春花似錦、人聲如沸郑原。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犯犁。三九已至属愤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酸役,已是汗流浹背住诸。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工密幔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留回懦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓届惋,卻偏偏與公主長得像入桂,于是被迫代替她去往敵國和親奄薇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫抗愁、插件馁蒂、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,519評論 25 707
  • 既然陪伴有期,在彼此交匯的時間里蜘腌,好好愛對方沫屡,好好愛自己,且行且珍惜撮珠! ...
    溫墨Cherry閱讀 295評論 0 1
  • 2天后,全國近千萬學(xué)子將迎接人生的第一次大考—高考志于。等成績出來后涮因,迎來的就是一次重大選擇:填志愿∷耪溃可別小看選學(xué)校和...
    艾米正能量閱讀 201評論 0 1
  • 有一天的晩上养泡,我坐在床上嗜湃。手里拿著一本書,我一邊看書澜掩,一邊想東西购披。眉毛皺的緊緊的,突然肩榕,砰——刚陡!的一聲巨響。嚇了我...
    莉妲閱讀 293評論 0 1