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


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 相关文章推荐
提示$ is not defined错误分析及解决
Apr 09 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
Dec 08 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
实例讲解JQuery中this和$(this)区别
Dec 08 Javascript
javascript中的正则表达式使用详解
Aug 30 Javascript
AngularJS 表达式详解及实例代码
Sep 14 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
jQuery实现右侧抽屉式在线客服功能
Dec 25 jQuery
新手如何快速理解js异步编程
Jun 24 Javascript
layUI实现三级导航菜单效果
Jul 26 Javascript
Node.js之删除文件夹(含递归删除)代码实例
Sep 09 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初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php之XML转数组函数的详解
2013/06/07 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
Python解释执行原理分析
2014/08/22 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
优质的学校老师推荐信
2013/10/28 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
扩展多台相同的Web服务器
2021/04/01 Servers
详解python字符串驻留技术
2021/05/21 Python
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android