textarea.js文件
/**
* 文本框根据输入内容自适应高度
* @param {HTMLElement} 输入框元素
* @param {Number} 设置光标与输入框保持的距离(默认0)
* @param {Number} 设置最大高度(可选)
*/
export default function (elem, extra, maxHeight) { extra = extra || 0; 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.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(); };
该文件是操作DOM元素,可以使用vue的自定义指令,方便使用
创建directives.js 文件用来放自定义指令
import Vue from 'vue' import autoTextarea from './assets/lib/textarea' Vue.directive('growHeight', { componentUpdated: function (el,bonding) { const grow = el.getAttribute('data-grow'); if (grow==='false'){ autoTextarea(el, bonding.value); el.setAttribute('data-grow','true'); } }, inserted: function (el) { el.setAttribute('data-grow','false'); } });
如果DOM绑定数据,当第一次改变绑定的数据时,才调用autoTextarea事件
使用
<textarea v-grow-height="60" id="textarea" maxlength="500" placeholder="请输入作品描述,不超过500字" v-model="data"></textarea>
样式自己修改
#textarea { display: block; 676px; border: 0; margin-left: 10px; font-size: 15px; outline: none; border-radius: 5px; padding: 14px; background-color: #efe9db; word-break: break-all; min-height: 100px; } textarea { outline: 0 none; }