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


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 相关文章推荐
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
Jun 25 Javascript
让浏览器非阻塞加载javascript的几种方法小结
Apr 25 Javascript
用jQuery获取IE9下拉框默认值问题探讨
Jul 22 Javascript
jQuery实现延迟跳转的方法
Jun 05 Javascript
完美实现八种js焦点轮播图(下篇)
Apr 20 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
js中开关变量使用实例
Feb 24 Javascript
vue 粒子特效的示例代码
Sep 19 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
Jan 18 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
Aug 06 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
PHP的栏目导航程序
2006/10/09 PHP
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
js控制frameSet示例
2013/09/10 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
python查找目录下指定扩展名的文件实例
2015/04/01 Python
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
python监控进程脚本
2018/04/12 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
内衣营销方案
2014/03/15 职场文书
幼儿园安全责任书
2014/04/14 职场文书
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers