基于vue的textarea文本框自动高度示例

有时候我们需要textarea文本框能够随着内容的输入自动收缩,如果根据textarea的scrollHeight属性计算高度,文本框可以自动撑开,但是文本删除时不能自动收缩回去;因此整个思路是:做一个紧邻textarea文本框的pre标签,原模原样的显示文本框内容,再将pre标签的高度赋值给文本框即可,下面基于vue编写的一个单页面示例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>文本框自动高度</title>
		<script src="js/vue.js"></script>

		<style type="text/css">
			.text-wrap {
				position: relative;
			}

			.text-wrap .pre,
			.text-wrap .textarea {
				margin: 0;
				position: absolute;
				left: 0;
				top: 0;
				z-index: 0;
				display: block;
				border: 1px solid #000000;
				width: 200px;
				padding: 0;
				font-size: 14px;
				line-height: 20px;
				width: 100%;

				font-family: '宋体';
				white-space: pre-wrap;
				/* css-3 */
				white-space: -moz-pre-wrap;
				/* Mozilla, since 1999 */
				white-space: -pre-wrap;
				/* Opera 4-6 */
				white-space: -o-pre-wrap;
				/* Opera 7 */
				word-wrap: break-word;
				/* Internet Explorer 5.5+ */
				word-break: break-all;
				overflow: hidden;
			}

			.text-wrap .textarea {
				z-index: 1;
				position: relative;
			}
		</style>
	</head>
	<body>
		<div id='app'>
			<table>
				<tr>
					<td>
						<div class="text-wrap">
						<pre class="pre">{{val1}}</pre>
							<textarea class="textarea" v-model="val1"></textarea>
						</div>
					</td>
					<td>
						<div class="text-wrap">
							<pre class="pre">{{val2}}</pre>
							<textarea class="textarea" v-model="val2"></textarea>
						</div>
					</td>
				</tr>
			</table>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el: '#app',
				data: function() {
					return {
						val1: '',//文本框1的值
						val2: ''//文本框2的值
					}
				},
				watch: {
					val1: function(value) {
						this.setTextareaHeight(value);
					},
					val2: function(value) {
						this.setTextareaHeight(value);
					}
				},
				methods:{
				    //设置值等于value的文本框高度,定义该方法是为了适应多个文本框情况,减少变量申请,降低页面复杂度
					setTextareaHeight:function(value){
						let _self = this;
						setTimeout(function() {
							let textareas = document.getElementsByTagName('textarea');
							//遍历页面的所有文本框
							for (var i = 0; i < textareas.length; i++) {
								let obj = textareas[i];
								//捕获到值等于value的文本框对象,该对象为当前输入值的文本框
								if (obj.value === value) {
									obj.style.height = obj.previousElementSibling.clientHeight+'px';
								}
							}
						}, 10);
					}
				}
			})
		</script>
	</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值