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


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 相关文章推荐
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
JavaScript自动设置IFrame高度的小例子
Jun 08 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
Google Dart编程语法和基本类型学习教程
Nov 27 Javascript
jQuery基于BootStrap样式实现无限极地区联动
Aug 26 Javascript
JavaScript判断浏览器和hack滚动条的写法
Jul 23 Javascript
js canvas实现简单的图像扩散效果
Jun 28 Javascript
AngularJs分页插件使用详解
Jun 30 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
Apr 19 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 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学习 计数器实例代码
2008/06/15 PHP
php 获取mysql数据库信息代码
2009/03/12 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
Zabbix实现微信报警功能
2016/10/09 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
python使用opencv进行人脸识别
2017/04/07 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
经理职责范文
2013/11/08 职场文书
机电一体化自荐信
2013/12/10 职场文书
销售业务员岗位职责
2014/01/29 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
员工离职证明范本
2015/06/12 职场文书
贷款担保书范本
2015/09/22 职场文书