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


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图片不完全按比例自动缩小的简单代码
Jul 29 Javascript
改变状态栏文字的js代码
Jun 13 Javascript
jQuery关键词说明插件cluetip使用指南
Apr 21 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
Jul 25 Javascript
微信小程序  wx.request合法域名配置详解
Nov 23 Javascript
浅谈js script标签中的预解析
Dec 30 Javascript
JS排序之快速排序详解
Apr 08 Javascript
基于angular实现三级联动的生日插件
May 12 Javascript
对Vue beforeRouteEnter 的next执行时机详解
Aug 25 Javascript
如何检查一个对象是否为空
Apr 11 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
Aug 10 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图片验证码代码
2008/03/27 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
Python如何读取MySQL数据库表数据
2017/03/11 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
Python实现代码块儿折叠
2020/04/15 Python
python 追踪except信息方式
2020/04/25 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
厨师岗位职责
2013/11/12 职场文书
监理员的岗位职责
2013/11/13 职场文书
财务会计专业推荐信
2013/11/30 职场文书
校园安全检查制度
2014/02/03 职场文书
兽医医药专业求职信
2014/07/27 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python