Last active
January 18, 2016 07:39
-
-
Save zzbo/9efb8df8391e42813c8a to your computer and use it in GitHub Desktop.
textarea 自适应高度
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#textarea { | |
display: block; | |
margin:0 auto; | |
overflow: hidden; | |
width: 550px; | |
font-size: 14px; | |
height: 18px; | |
line-height: 24px; | |
padding:2px; | |
} | |
textarea { | |
outline: 0 none; | |
border-color: rgba(82, 168, 236, 0.8); | |
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 文本框根据输入内容自适应高度 | |
* @param elem {HTMLElement} 输入框节点 | |
* @param extra {Number} 设置光标与输入框保持的距离(默认为0) | |
* @param maxHeight {Number} 设置最大高度(可选) | |
*/ | |
var autoTextarea = function (elem, extra, maxHeight) { | |
extra = extra || 0; | |
var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window; | |
var isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'); | |
var addEvent = function (type, callback) { | |
elem.addEventListener ? | |
elem.addEventListener(type, callback, false) : | |
elem.attachEvent('on' + type, callback); | |
}; | |
var 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]; | |
}; | |
var minHeight = parseFloat(getStyle('height')); | |
elem.style.resize = 'none'; | |
var change = function () { | |
var scrollTop, height, paddingTop, paddingBottom; | |
var doc = document; | |
var padding = 0; | |
var style = elem.style; | |
if (elem._length === elem.value.length) return; | |
elem._length = elem.value.length; | |
if (!isFirefox && !isOpera) { | |
paddingTop = parseInt(getStyle('paddingTop')); | |
paddingBottom = parseInt(getStyle('paddingBottom')) | |
padding = paddingTop + paddingBottom; | |
} | |
scrollTop = doc.body.scrollTop || doc.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(); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment