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


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使用cookie
Feb 02 Javascript
JScript中的undefined和&quot;undefined&quot;的区别
Mar 08 Javascript
js中 javascript:void(0) 用法详解
Aug 11 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
原生JS发送异步数据请求
Jun 08 Javascript
vue params、query传参使用详解
Sep 12 Javascript
javascript中的replace函数(带注释demo)
Jan 07 Javascript
Angular4 反向代理Details实践
May 30 Javascript
vue.js轮播图组件使用方法详解
Jul 03 Javascript
简单了解TypeScript中如何继承 Error 类
Jun 21 Javascript
微信小程序获取地理位置及经纬度授权代码实例
Sep 18 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调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
Python解决八皇后问题示例
2018/04/22 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
python实现感知器算法(批处理)
2019/01/18 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
英国医生在线预约:Top Doctors
2019/10/30 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
预备党员思想汇报范文
2013/12/29 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript