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


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 相关文章推荐
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
May 07 Javascript
JS保存、读取、换行、转Json报错处理方法
Jun 14 Javascript
JS操作Cookies的小例子
Oct 15 Javascript
js身份证判断方法支持15位和18位
Mar 18 Javascript
js实现横向伸展开的二级导航菜单代码
Aug 28 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
Apr 13 Javascript
canvas知识总结
Jan 25 Javascript
基于vue实现分页/翻页组件paginator示例
Mar 09 Javascript
Vue.directive自定义指令的使用详解
Mar 10 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
May 17 Javascript
CSS3+JavaScript实现翻页幻灯片效果
Jun 28 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使用DES进行加密与解密的方法详解
2013/06/06 PHP
php创建无限级树型菜单
2015/11/05 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
调试php程序的简单步骤
2019/10/04 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
javascript连续赋值问题
2015/07/08 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
详解Python的Lambda函数与排序
2016/10/25 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
信息管理员岗位职责
2013/12/01 职场文书
积极贯彻学习两会精神总结
2014/03/17 职场文书
初一学生期末评语
2014/04/24 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
go xorm框架的使用
2021/05/22 Golang
详解JAVA中的OPTIONAL
2021/06/14 Java/Android