项目反馈输入框内容比较多时候,让鼠标光标在最后一个位置,心想什么奇葩需求,后面试了一下,是有点影响体验,于是就有了下面的效果,我目前的项目都是若依的架子,用的是vue2版本。vue3的朋友想要使用,自行调节
效果图如下:
使用方法:
< el- input v- focus2end v- model= "dialog.form.actionSign" placeholder= "请输入" clearable / >
v-focus2end 指令
export default { inserted ( el ) { const input = el instanceof HTMLInputElement ? el : el. querySelector ( 'input' ) input. addEventListener ( 'focus' , focusEventListener . bind ( input) , false ) input. addEventListener ( 'blur' , blurEventListener . bind ( input) , false ) el. __focusEventListener = focusEventListenerel. __blurEventListener = blurEventListener} , unbind ( el ) { const input = el instanceof HTMLInputElement ? el : el. querySelector ( 'input' ) input. removeEventListener ( 'focus' , el. __focusEventListener, false ) input. removeEventListener ( 'blur' , el. __blurEventListener, false ) } ,
} function focusEventListener ( e ) { e. preventDefault ( ) setTimeout ( ( ) => { const inputLength = this . value. lengththis . setSelectionRange ( inputLength, inputLength) smoothMove . call ( this ) } , 300 )
} function blurEventListener ( ) { this . removeEventListener ( 'focus' , focusEventListener, false )
} function smoothMove ( ) { const scrollMax = this . scrollWidth - this . clientWidthconst duration = 300 const startTime = performance. now ( ) function smoothScroll ( timestamp ) { const elapsedTime = timestamp - startTimeconst progress = Math. min ( elapsedTime / duration, 1 ) const scrollPosition = progress * scrollMaxthis . scrollLeft = scrollPositionif ( elapsedTime < duration) { requestAnimationFrame ( smoothScroll . bind ( this ) ) } } requestAnimationFrame ( smoothScroll . bind ( this ) )
}