文本框根据输入内容自适应高度的代码


Posted in Javascript onOctober 24, 2011

其实现代浏览器大多都支持文本框尺寸调节功能,绝大多数情况下却没有自动适应来得爽快,在网络上发现一方法比较简单的实现文本框高度自适应,于是封装了这个函数,准备以后应用到项目中。
源代码:
23:03文章更新:
感谢alucelx同学再次给力的帮助,大大简化了方法,更新代码为0.2版本,同时解决了兼容Opera浏览器,至此全兼容IE6+与现代浏览器!
在线演示: http://demo.3water.com/js/2011/autoArea/index.htm
autoTextarea.js

/** 
* 文本框根据输入内容自适应高度 
* @author tang bin 
* @version 0.3 
* @see http://www.planeart.cn/?p=1489 
* @param {HTMLElement} 输入框元素 
* @param {Number} 设置光标与输入框保持的距离(默认20) 
* @param {Number} 设置最大高度(可选) 
*/ 
var autoTextarea = function (elem, extra, maxHeight) { 
extra = extra || 20; 
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.maxHeight = 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(); 
};

测试代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>文本框根据输入内容自适应高度</title>
<style type="text/css">
#textarea { font: 1.4em/1.8em Arial; overflow: hidden; width: 550px; height: 6em; padding:10px; }
</style>
<script src="autoTextarea.js"></script>
</head>
<body style="background:#FBFCFD url(http://goo.gl/kLsZX);">
<textarea id="textarea"></textarea>
<script>
var text = document.getElementById("textarea"),
tip = '想写点什么..';
autoTextarea(text);// 调用
text.value = tip;
text.onfocus = function () {
if (text.value === tip) text.value = '';
};
text.onblur = function () {
if (text.value === '') text.value = tip;
};
</script>
</body>
</html>
Javascript 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
jquery基础教程之数组使用详解
Mar 10 Javascript
jQuery中的ajax async同步和异步详解
Sep 29 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
Nov 23 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
EasyUI在表单提交之前进行验证的实例代码
Jun 24 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
Dec 08 Javascript
Javascript下拉刷新的简单实现
Feb 14 Javascript
jquery获取select,option所有的value和text的实例
Mar 06 Javascript
利用d3.js实现蜂巢图表带动画效果
Sep 03 Javascript
Postman环境变量全局变量使用方法详解
Aug 13 Javascript
js创建数据共享接口——简化框架之间相互传值
Oct 23 #Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
Oct 23 #Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 #Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
Oct 23 #Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
Oct 22 #Javascript
js两行代码按指定格式输出日期时间
Oct 21 #Javascript
jQuery中live方法的重复绑定说明
Oct 21 #Javascript
You might like
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
Javascript函数的参数
2015/07/16 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
解析vue中的$mount
2017/12/21 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
监听element-ui table滚动事件的方法
2019/03/26 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
护理学专业推荐信
2013/12/03 职场文书
会计工作能力自我评价
2015/03/05 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸