高度自适应的textarea,这个需求还是比较常见的,随着用户的输入textarea的高度自动变化,这样输入较少的时候可以节省空间,输入多的时候可以不出现滚动条,让内容尽可能的展现在用户的视线内。

可惜的是textarea本身没有自适用的技能,文字过多就会出现滚动条的,所以我们需要曲线救国。

 

基本思路:另外找一个元素,和textarea设置一样的样式,当textarea输入的时候,将内容填充到该元素内,然后再将该元素的高度赋值给textarea。

 

这个元素比较苛刻了,不仅要接收textarea的文字内容,也要接收格式,比如回车什么的,很明显是pre标签了。

写在pre标签里的东西可以原格式输出,如果要在别的元素,比如div上实现类似的效果,可能需要使用一些CSS,比如white-space:pre,诸如此类的代码。

 

直接上代码了:

首先准备一个pre,一个textarea:

<pre class="input" id="pre"></pre>
<textarea class="input" id="textarea"></textarea>

然后给他们设置相同的样式:

.input {
    padding: 10px;
    width: 300px;
    min-height: 150px;
    border: 1px solid #ccc;
    resize: none;
    font-size: 20px;
    line-height:30px;
    overflow: hidden;
    word-wrap: break-word;
}

这里设置了min-height,给他们一个最小高度,里面的字体行高的都设置的一样,这样他们的表现就一致了。注意:为了纯英文的换行,加上word-wrap。

最后一段简单的脚本:

var textarea = document.getElementById('textarea');
var pre = document.getElementById('pre');

textarea.oninput = function() {
    pre.textContent = textarea.value;
    textarea.style.height = pre.offsetHeight + 'px';
}

监听textarea的input事件,更新自身的高度。

 

这时候,高度自适应的textarea已经构造完成了。但是pre这个元素我们是不想让他显示的,需要把他隐藏掉,但不能简单的display:none,这样就取不到pre的高度了,所以使用另外一个属性visibility,不过这个属性还是会占用空间的,把pre绝对定位即可:

.hide {
    position: absolute;
    z-index: -100;
    visibility: hidden;
}

<pre class="input hide" id="pre"></pre>

 

大功告成!

 

不过还有一些兼容性工作要做,IE8以下是不支持oninput事件的,但他们支持一个更强大的属性:onpropertychange。

可能有的童鞋会觉得可以使用onkeyup或者onkeydown事件,我在chrome下试验了下,在textarea改变高度的时候,会有闪动,oninput的表现就比较平滑。推荐使用oninput。

 

完。

posted @ 2015-12-28 22:17 zjzhome 阅读(9782) 评论(2) 推荐(8)
摘要: HTML5给表单带来了很多改变,比如今天要说的maxlength,这个属性可以限制输入框输入的最大字字符数,更方便的是对于粘贴的内容也能够根据字符数自动截断。最近就接到这要一个需求,限制用户最多输入600字(汉字和字母不区分),对于粘贴的内容也要能自动截断,输入600字后就无法输入。第一时间想到了m... 阅读全文
posted @ 2015-12-26 15:05 zjzhome 阅读(3778) 评论(1) 推荐(0)
摘要: windows下做开发确实有些不方便,比如python、ruby什么的都要自己装,不过这还是小事情。有一次想安装node-sass,windows下报错缺少MSBuild什么的,可能需要装一个vs解决,不过估计没有人愿意装那么大的东西,另外如果你想安装node-canvas的话可能准备工作会更多。。 阅读全文
posted @ 2015-12-13 19:11 zjzhome 阅读(5771) 评论(0) 推荐(2)
摘要: 类似的题目一搜一大堆,我就不再写那些meta标签类似的内容了,记录一下自己实现中遇到的问题,如果能帮到你,那再好不过了。1px border的问题,大家能搜到很多方案,但如何选择还是要根据实际情况,比如border-image不能处理圆角,最好用的transform scale可能会因为改变布局导致... 阅读全文
posted @ 2015-11-21 15:54 zjzhome 阅读(999) 评论(4) 推荐(1)
摘要: 文章翻译自petehunt大神的petehunt/webpack-howto,作为学习webpack的开始。fork了一份,翻译后的在这里https://github.com/zjzhome/webpack-howto/blob/master/README-cn.md,有些地方翻译的不好,也希望在阅读后对于不好的地方对出评论或者在github上提个issue。 阅读全文
posted @ 2015-11-09 23:08 zjzhome 阅读(1193) 评论(0) 推荐(0)
摘要: 前几天的一篇博文:移动Web单行文字垂直居中的问题,提到了移动web里小于12px的文字居中异常的问题,最后还是改为12px才近乎解决了问题。但是有时候或许并不是那么乐观,你并不能将原本定为10px的字体改为12px。那该怎么办呢。我们都知道,移动端为了高清屏显示1px的border,会有那么几种方法,通常最好的方法是transform scale,并且支持圆角。既然一个border能缩放,那么整个文字区域自然也能缩放。 阅读全文
posted @ 2015-10-27 13:33 zjzhome 阅读(10183) 评论(2) 推荐(4)
摘要: 一个多月前水了一篇移动web屏幕适配方案,当时噼里啪啦的写了一通,自我感觉甚是良好。不过最近又有一些新的想法,和之前的有一些不同。先说一下淘宝的方案,感觉现在好多的适配方案都是受了它的影响,上周六看了winter在一个会议的分享,讲到了这个方案。现在你谷歌一下移动web适配,绝对可以看到很多类似的,... 阅读全文
posted @ 2015-10-26 23:36 zjzhome 阅读(2459) 评论(8) 推荐(2)
摘要: 移动端的3d硬件加速真的很有用!晚饭前,被测试吐槽说,banner轮播手动左右滑的时候会卡顿。我一看不科学啊,大水果手机怎么会卡顿。我一看测试手中拿的是iPod,我觉得大概是这小玩意性能不强悍,后来又拿来5S,依然会卡顿,有趣的是,两个5S,一个IOS7一个IOS8,IOS7基本没有卡顿,IOS8会卡。饭后着手解决此问题。 阅读全文
posted @ 2015-10-22 19:39 zjzhome 阅读(5560) 评论(5) 推荐(1)
摘要: 移动Web单行文字垂直居中在PC端显而易见, 到了移动端却发现了诡异的bug, 原因竟然是... 阅读全文
posted @ 2015-10-21 19:53 zjzhome 阅读(9322) 评论(8) 推荐(7)
摘要: 静态代码检查是开发工作中不可缺少的一环,毕竟对于程序化的工作人的眼睛是不可靠的,更何况是自己的眼睛看自己的代码。即使最后的运行结果通过,但可能存在一些未定义的变量、定义了但最后没用过的变量、分号有没有加(看团队规则)以及其他的问题。给力的工具必不可缺。 在本文要介绍的JSHint之前还有JSLint,道格拉斯的作品,应该是JavaScript精粹的附属产物。。。要求你必须使用它的规则,对于JavaScript这样一个灵活的语言,还是要用一个灵活的工具,JSHint就是就是这样。 阅读全文
posted @ 2015-09-19 19:49 zjzhome 阅读(22198) 评论(2) 推荐(2)
点击右上角即可分享
微信分享提示