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


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 相关文章推荐
关于锚点跳转及jQuery下相关操作与插件
Oct 01 Javascript
jQuery.validate 常用方法及需要注意的问题
Mar 20 Javascript
js函数setTimeout延迟执行的简单介绍
Jul 17 Javascript
浅谈JavaScript事件的属性列表
Mar 01 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
Sep 17 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
Dec 02 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
Feb 19 Javascript
Vue filter介绍及其使用详解
Oct 21 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
理顺8个版本vue的区别(小结)
Sep 17 Javascript
layer.confirm()右边按钮实现href的例子
Sep 27 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
Apr 13 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
Terran兵种介绍
2020/03/14 星际争霸
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
php单链表实现代码分享
2016/07/04 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
[08:40]Navi Vs Newbee
2018/06/07 DOTA
简介Django中内置的一些中间件
2015/07/24 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
如何利用python生成MD5并去重
2020/12/07 Python
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
党员教师工作决心书
2014/03/13 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
吴仁宝观后感
2015/06/09 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL