scrollTo
element.scrollTo(x-coord, y-coord) 例如:element.scrollTo(0, 1000); element.scrollTo(options) 例如:
element.scrollTo({ top: 100, left: 100, behavior: 'smooth' });
scrollTop、scrollLeft
用法1:获取值 var top = element.scrollTop;//返回数字,单位像素 用法2:设置值 element.scrollTop = 200;
针对上面两种方法,移动端若存在无特效的情况,我的方法是设置滚动时间和滚动值的线性函数,使得滚动看起来有动画。
scrollIntoView(直接截图了,懒惰如我)
移动端父子元素滚动问题
其实也是一个滚动链问题,百度的解释如下:
默认情况下,当触及页面顶部或者底部时(或者是其他可滚动区域),移动端浏览器倾向于提供一种“触底”效果,甚至进行页面刷新。你可能也发现了,当对话框中含有可滚动内容时,一旦滚动至对话框的边界,对话框下方的页面内容也开始滚动了——这被称为“滚动链”。
尝试方法如下
- 组件body-scroll-lock,针对ios端safari无效
- 组件vue-scroll-lock,会导致子元素无法滚动,哪怕调整了lock,bodyLock属性,反而放开了bodyLock属性内部能滚了,但是解决不了父子元素滚动影响的问题。
- overscroll-behavior: none:能够解决安卓端父子元素滚动问题,但兼容性差,解决不了ios;
最终方案:
- 对父元素fixed,子元素fixd,滚动时设置:
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- overscroll-behavior: none;
- 当子元素出现,父元素动态设置overflow:hidden,子元素overflow:auto,子元素消失,给父元素overflow:auto
- 要注意overflow:auto和元素消失的顺序,否则可能失效