项目反馈输入框内容比较多时候,让鼠标光标在最后一个位置,心想什么奇葩需求,后面试了一下,是有点影响体验,于是就有了下面的效果,我目前的项目都是若依的架子,用的是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 = focusEventListener
el. __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. length
this . setSelectionRange ( inputLength, inputLength)
smoothMove . call ( this )
} , 300 )
}
function blurEventListener ( ) {
this . removeEventListener ( 'focus' , focusEventListener, false )
}
function smoothMove ( ) {
const scrollMax = this . scrollWidth - this . clientWidth
const duration = 300
const startTime = performance. now ( )
function smoothScroll ( timestamp ) {
const elapsedTime = timestamp - startTime
const progress = Math. min ( elapsedTime / duration, 1 )
const scrollPosition = progress * scrollMax
this . scrollLeft = scrollPosition
if ( elapsedTime < duration) {
requestAnimationFrame ( smoothScroll . bind ( this ) )
}
}
requestAnimationFrame ( smoothScroll . bind ( this ) )
}