惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
D
Docker
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
IT之家
IT之家
H
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
B
Blog
D
DataBreaches.Net

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
还算有点用的scrollTo和scrollBy两个JS API « 张鑫旭-鑫空间...
张鑫旭,zhangxinxu · 2019-07-27 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu 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坐标。表示距离左侧滚动的距离坐标大小。
options
options是一个ScrollToOptions参数类型,包含left, topbehavior这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的优点有两个:

  1. 调用统一
    scrollLeft/scrollTop这两个属性只能作为元素上,在window对象上没有效果。而pageXOffset/pageYOffset只能作用于window对象上,在元素上没有效果。而scrollTo和scrollBy不仅可以作用于window对象上,还可以作用于元素上。实现的调用的统一。
  2. 平滑支持
    scrollLeft/scrollTop和pageXOffset/pageYOffset控制滚动定位,想要定位平滑,只能借助于CSS scroll-behavior属性,JS这块设置无力。但是scrollTo和scrollBy在比较方便,直接有API参数支持。

scrollTo和scrollBy两个JS API的缺点就一个:

  1. 兼容性
  2. 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页的距离。

更新于2023年2月28日

目前依然仅Firefox支持,看起来很长一段时间也都是Firefox支持,感觉此特性可以作为判断当前浏览器是否是Firefox浏览器的依据。

五、还算有点用

一番整理下来,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;
    };
}

或者点击这里下载scroll-polyfill.js

顺手一写,未经测试,欢迎反馈。

本文为原创文章,欢迎分享,勿全文转载,如果内容你实在喜欢,可以加入收藏夹,永不过期,而且还会及时更新知识点以及修正错误,阅读体验也更好。
本文地址:https://www.zhangxinxu.com/wordpress/?p=8799

(本篇完)