

还算有点用的scrollTo和scrollBy两个JS API
source link: https://www.tuicool.com/articles/ENJ3M3a
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

byzhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8799
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可以联系授权。
一、韩信么?
scrollTo和scrollBy这两个JS API也是用来控制元素或者窗体的滚动距离的。
我脑中的存储快速索引了一遍,发现JS API中控制元素或者窗体的滚动距离的API还真不少。
例如兼容性很好的scrollLeft和scrollTop,使用示意:
// 设置element左滚动距离100 element.scrollLeft = 100; // 设置element上滚动距离200 element.scrollTop = 200;
或者IE9+浏览器支持,控制窗体滚动距离的pageXOffset和pageYOffset(注意,X, Y在Offset的前面):
// 设置窗体左滚动距离100 window.pageXOffset = 100; // 设置窗体上滚动距离200 window.pageYOffset = 200;
结果现在又多了个IE/Edge浏览器不支持的scrollTo和scrollBy两个JS API。
滚动是韩信吗?走多多益善的套路?
二、文体两开花
scrollTo和scrollBy两个JS API是近亲,语法一模一样,作用也非常类似。
这两个API都是文体两开花,既能作用于windows对象,表示窗体滚动;又可以作用于普通Element元素,表示元素滚动。
示意:
window.scrollTo(); Element.scrollTo(); window.scrollBy(); Element.scrollBy();
但是这两个API控制滚动的细节有所出入。
scrollTo()
表示滚到到指定的位置,而 scrollBy()
表示相对当前的位置滚动多少距离。
例如:
window.scrollTo(100, 200);
上面的写法等同于:
// 设置窗体左滚动距离100 window.pageXOffset = 100; // 设置窗体上滚动距离200 window.pageYOffset = 200;
而:
window.scrollBy(10, 20); // 偏移10, 20滚动距离
上面的写法等同于:
// 设置窗体左滚动距离增加10 window.pageXOffset += 10; // 设置窗体上滚动距离增加20 window.pageYOffset += 20;
具体语法
element.scrollTo(x-coord, y-coord) element.scrollTo(options) element.scrollBy(x-coord, y-coord) element.scrollBy(options)
其中
x-coord X坐标。表示距离左侧滚动的距离坐标大小。 y-coord y坐标。表示距离左侧滚动的距离坐标大小。 optionsoptions
是一个ScrollToOptions参数类型,包含
left
,
top
和
behavior
这3个参数值。例如:
window.scrollBy({ top: 10, left: 20, behavior: 'smooth' });
具体:
- left 指定沿着X轴距离window或者element滚动距离,值的单位是像素。
- top 指定沿着Y轴距离window或者element的滚动距离,值的单位是像素。
- behavior 指定滚动触发的时候,是平滑的动画还是直接过去。关于平滑滚动,可以参考去年写的 这篇关于CSS scroll-behavior的文章 。
也就是 window.scrollBy(10, 20)
我们也可以写作:
window.scrollBy({ left: 10, top: 20 })
眼见为实,例如,点击下面按钮,让页面垂直滚动距离增加20px:
HTML代码如下:
<button onclick="window.scrollBy(0, 20)">点击我滚动+20</button>
三、优缺点
scrollTo和scrollBy两个JS API的优点有两个:
- 调用统一
scrollLeft/scrollTop这两个属性只能作为元素上,在window对象上没有效果。而pageXOffset/pageYOffset只能作用于window对象上,在元素上没有效果。而scrollTo和scrollBy不仅可以作用于window对象上,还可以作用于元素上。实现的调用的统一。 - 平滑支持
scrollLeft/scrollTop和pageXOffset/pageYOffset控制滚动定位,想要定位平滑,只能借助于CSS scroll-behavior属性,JS这块设置无力。但是scrollTo和scrollBy在比较方便,直接有API参数支持。
scrollTo和scrollBy两个JS API的缺点就一个:
- 兼容性
scrollTo和scrollBy两个JS API在IE浏览器中是无效的,如果是需要兼容IE浏览器的项目,需要先写个简单的polyfill(见文末)。
四、狐朋狗友们
滚动相关的这波API不仅仅有scrollTo和scrollBy,还有scroll,使用示意:
Window.scroll() Element.scroll()
scroll()
方法和 scrollTo()
语法和作用是一样的。
另外还有两个非标准的相对滚动方法(目前仅Firefox浏览器支持),如下:
- Window.scrollByLines()
表示相对当前的滚动位置再滚动指定行数距离,行为表现接近于上下键控制滚动。语法如下:
window.scrollByLines(lines)
例如
window.scrollByLines(-5)
表示向上滚动5行的距离。 - Window.scrollByPages()
表示相对当前的滚动位置再滚动指定页数距离,行为表现接近于空格键(反向+Shift)控制滚动。语法如下:
window.scrollByPages(pages)
例如
window.scrollByPages(-1);
表示向上滚动1页的距离。
五、还算有点用
一番整理下来,scrollTo和scrollBy这两个API还算有点用。以后元素的滚动距离控制我打算都使用这两个API了,至于原因,不用用怎么知道这两个API隐藏的坑或者埋的彩蛋呢。
反正得失差不多,用用新的API,增加点前端技术的广度,挺好!
IE的polyfill其实很简单,顺手写两个:
/** * @description scrollTo/scrollBy的polyfill,IE9+ * @author zhangxinxu(.com) * @created 2019-07-27 */ if (!window.scrollTo) { window.scrollTo = function (x, y) { window.pageXOffset = x; window.pageYOffset = y; }; } if (!window.scrollBy) { window.scrollBy = function (x, y) { window.pageXOffset += x; window.pageYOffset += y; }; } if (!document.body.scrollTo) { Element.prototype.scrollTo = function (x, y) { this.scrollLeft = x; this.scrollTop = y; }; } if (!document.body.scrollBy) { Element.prototype.scrollBy = function (x, y) { this.scrollLeft += x; this.scrollTop += y; }; }
顺手一写,未经测试,欢迎反馈。
本文为原创文章,欢迎分享,勿全文转载,如果内容你实在喜欢,可以加入收藏夹,永不过期,而且还会及时更新知识点以及修正错误,阅读体验也更好。
本文地址: https://www.zhangxinxu.com/wordpress/?p=8799
(本篇完)
Recommend
-
81
问与答 - @hecz - 今天跟别人聊天,一个已经工作的人跟我说,百度已经不算一线互联网了,甚至没有美团,头条这些公司有认可度,想问问各位大佬,你们都是这样认为的么?
-
115
成都 - @stop9125 - 最近看到一个传闻,关于周围县市并入成都。只要并入了,房价又是飞涨的节奏。而且这两天得天气大家也看到了,关于工资也不想多说,大家都懂。
-
28
职场话题 - @SaintSeiya - 部分经济发达的省市将复工时间延迟到了 10 号,会不会大家都在等着快复工的时候回去
-
20
撰文 | 路畅 内容总策划 | 郭楠 里斯咨询的《2020中国烈酒市场分析报告 》 显示,2020年...
-
6
当稳定币没有锚定标的时,还算稳定币么? imToken 原创 2021-05-06 10:35 热度 78512 分享 微信扫一扫:分享 ...
-
7
隔离深圳的武汉,还算友好吗 深圳龙岗和盐田区的,现在去到武汉需要集中隔离14天,然后居家...
-
36
vxe-table 的表格新增一行怎么自动滚动到底部?api中的scrollTo和scrollToRow都没效果...
-
11
虽迟但到,我1号当天付定金,11号才付的尾款,14号拿到货后又搬家,所以耽误了一点时间,请各位见谅!AG275QXE我认为还算有诚意,目前价格2299元送个破鼠标垫,总体来说很值得推荐。(本文没有表妹,来看表妹的人要失望了。)一,五代爱攻的外观设...
-
3
V2EX › 程序员 2022 年了,从零写一个还算好看的静态博客只需要 10 分钟 djyde ·
-
3
Axie Infinity通过Google Play审核,没有P2E功能、还算Web3么? 2022-12-26 •
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK