vue中遇到scrollIntoView无效问题及解决
作者:°折月煮酒
vue中遇到scrollIntoView无效
官方文档写的简单
Element 接口的scrollIntoView()方法会滚动元素的父容器,使被调用scrollIntoView()的元素对用户可见。
语法:
element.scrollIntoView(); // 等同于element.scrollIntoView(true) element.scrollIntoView(alignToTop);// Boolean型参数 element.scrollIntoView(scrollIntoViewOptions);// Object型参数
首先容器滚动,然后document.geyElementById或者document.querySelector 获取指定元素,最够元素调用scrollIntoView.
参数:
- alignToTop可选
一个Boolean值:
如果为true,元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的 scrollIntoViewOptions: {block: "start", inline: "nearest"}。这是这个参数的默认值。
如果为false,元素的底端将和其所在滚动区的可视区域的底端对齐。相应的scrollIntoViewOptions: {block: "end", inline: "nearest"}。
- scrollIntoViewOptions 可选
一个包含下列属性的对象:
- behavior 可选
定义动画过渡效果, "auto"或 "smooth"之一。默认为"auto"。
- block 可选
定义垂直方向的对齐,"start","center","end", 或 "nearest"之一。默认为 “start”。
- inline 可选
定义水平方向的对齐, "start", "center","end", 或 "nearest"之一。默认为 “nearest”。
实际在vue项目中遇到,当通过点击事件调用子组件的元素滚动到可视区域时怎样都无效。
最终发现,这个方法还有一个限制:需要页面完全加载后再调用
这样,在vue中可以使用$nextTick函数,确保页面已渲染完成在去调scrollIntoView使滚动到可视区域
实现代码如下
父组件:
showDatePicker(){ if (this.$refs.pickers) { this.$nextTick(() => { this.$refs.pickers.showCurrentDate() }) }
子组件:
showCurrentDate() { this.$el.querySelector('.active').scrollIntoView({ block: 'start', }) // 回到顶部 },
scrollIntoView在vue里失效---kalrry
Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内。
element.scrollIntoView(); // 等同于element.scrollIntoView(true) element.scrollIntoView(alignToTop); // Boolean型参数 element.scrollIntoView(scrollIntoViewOptions); // Object型参数
参数
alignToTop: 一个boolean值 //true:等价于 scrollIntoViewOptions: {block: “start”, inline: “nearest”} //false:等价于scrollIntoViewOptions: {block: “end”, inline: “nearest”} scrollIntoViewOptions: 对象 behavior: 定义动画过度效果, ‘auto / smooth' , 默认 ‘auto' block:定义垂直方向的对齐, “start / center / end / nearest”。默认为 “start”。 inline 定义水平方向的对齐, “start / center / end / nearest”。默认为 “nearest”
问题
按照js标准选择元素方式,scrollIntoView在vue里失效
原因
该方法需在页面完全加载后才能生效
解决
方法一:
利用setTimeout方法
setTimeout(function(){ document.getElementById(target).scrollIntoView(); },100)
方法二:
运用vue中的this.$nextTick方法
this.$nextTick(()=>{ //对象方式设置滚动状态 document.querySelector("#01commonly").scrollIntoView({ block: 'end', behavior: 'smooth' }) })
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。