Vue 滚动条定位问题
作者:matrix 发布时间:2018-06-28 分类:零零星星
使用jquery的时候可以直接animate
方法完成滑动滚动条的动作,但是在vue项目中会很蛋疼。
$('.findcar_brand_ul').animate({scrollTop: liheight}, 300);
Vue中又没有相关的组件可以调用,载入jquery麻烦,要是需要临时解决的话可以使用js的scrollTop
。
看了网上各路大神的文章才恍悟。要做到渐缓动画 只是需要setTimeOut执行step操作就好,频率快,人眼也就察觉不出。先取使用js操作获取dom的scrollTop
取出需要让滚动条定位的目标位置,之后递增/减setTimeout
操作。
//方法2。js操作
var jump = document.querySelector('#postion');
var total = jump.offsetTop;//要定位的目标滚动条位置
console.log('纵坐标', total)
// var distance = document.documentElement.scrollTop || document.body.scrollTop
var distanceDom = document.querySelector('.findcar_brand_ul');//滚动条所在的容器
var distance = distanceDom.scrollTop;//容器的滚动条照度
// 平滑滚动,每1ms一跳,共20跳
var time = 15;//毫秒
var stepnum = 20;//共20跳
//时长(time*stepnum) ms
var step = total / stepnum //因为除法会出现余数情况 导致最终定位有偏差
if (total > distance) {
// console.log('smoothDown')
// console.log('distance:'+distance)
// console.log('total:'+total)
smoothDown()
} else {
// var newTotal = distance - total + 100
var newTotal = distance - total
step = newTotal / stepnum
// console.log('smoothUp')
smoothUp()
}
function smoothDown () {
if (distance < total) {
// console.log('distance < total')
distance += step
// Firefox
// document.documentElement.scrollTop = distance
// // Chrome
// document.body.scrollTop = distance
distanceDom.scrollTop = distance;
setTimeout(smoothDown, time)
} else {
// console.log('distance < total: else ')
// document.documentElement.scrollTop = total
// // document.body.scrollTop = total
// window.pageYOffset = total
// console.log('standard:'+standard)
distance = total;//将最后一小步的滚动操作的偏移量还原到目标位置。若不加此操作 会导致定位偏移不准的情况出现。因为step = newTotal / stepnum 的值会有除不尽的情况 !!important
// console.log('distance end:'+distance)
distanceDom.scrollTop = distance;
}
}
function smoothUp () {
if (distance > total) {
distance -= step
// // Firefox
// document.documentElement.scrollTop = distance
// // Chrome
// document.body.scrollTop = distance
distanceDom.scrollTop = distance;
setTimeout(smoothUp, time)
} else {
// document.documentElement.scrollTop = total
// document.body.scrollTop = total
// window.pageYOffset = total
distance = total;
distanceDom.scrollTop = distance;
}
}
说明:
demo环境:Vue.version >> "2.2.6"
修改代码使用div中滚动条,取消浏览器窗口滚动条的获取。
代码简单修改了下最终的定位偏移问题。因为step = newTotal / stepnum
至少这能解决问题,还需后面完善。
代码来自@wisewrong
PEACE~
参考:
https://www.cnblogs.com/wisewrong/p/6495726.html