scrollIntoView 与 scrollIntoViewIfNeeded API 介绍

本文转自:scrollIntoView 与 scrollIntoViewIfNeeded API 介绍

根据 MDN 的描述,Element.scrollIntoView()方法让当前的元素滚动到浏览器窗口的可视区域内。而Element.scrollIntoViewIfNeeded()方法也是用来将不在浏览器窗口的可见区域内的元素滚动到浏览器窗口的可见区域。但如果该元素已经在浏览器窗口的可见区域内,则不会发生滚动。此方法是标准的Element.scrollIntoView()方法的专有变体。

因而再有什么回到顶部、去到置顶位置和键盘弹出挡住输入框之类的需求,都可以简单解决了。

然而,面对好用的 API,前端们第一个反映都是,看兼容性!

可以直接点击此处查看

先看scrollIntoView的:
image.pngscrollIntoView

看到一片黄黄绿绿的,基本可以安心,不支持的只是某个属性的取值而已,下面会有介绍~

之后看看scrollIntoViewIfNeeded
image.pngscrollIntoViewIfNeeded

IEFireFox全红,如果PC端想用的话,基本只能内部项目了,略为可惜。但移动端还是绿悠悠的,基本都OK,可以安心使用~

由于本文是介绍向~因而每个属性我都写了点小demo,点进去就可以体验一下哦!

scrollIntoView

先介绍scrollIntoView,使用起来其实很简单,获取某个元素后,直接调用scrollIntoView()即可,简单的 demo 点这就好,点一下侧边的小绿块,页面就会滚上去。demo代码大概长这样:

1<body> 2 <div class="chunk"></div> 3 <div class="btn">click</div> 4 <script> const btn = document.querySelector('.btn'); 5 const test = document.querySelector('.chunk'); 6 btn.addEventListener('click', function() { 7 test.scrollIntoView(); 8 }) </script> 9</body>

是不是很简单~不过可能有同学就有疑问了,这不就和锚点定位一样吗?感觉毫无意义啊!先别急,当你调用scrollIntoView的时候,其实是可以传参数进去的。scrollIntoView只接受一个参数,但接受两种类型的参数,分别是Boolean型参数和Object型参数。
先说Boolean型参数,顾名思义,参数可以使truefalse。如果为true,元素的顶端将和其所在滚动区的可视区域的顶端对齐。若为false,元素的底端将和其所在滚动区的可视区域的底端对齐。简单的 例子 可以点这里。主要代码如下:

1<body> 2 <div class="chunk"></div> 3 <div class="btn-top">up</div> 4 <div class="btn-bottom">down</div> 5 <script> const up = document.querySelector('.btn-top'); 6 const down = document.querySelector('.btn-bottom'); 7 const test = document.querySelector('.chunk'); 8 up.addEventListener('click', function() { 9 test.scrollIntoView(true); 10 }); 11 down.addEventListener('click', function() { 12 test.scrollIntoView(false); 13 }); </script> 14</body>

如你所见到的,当传入参数为分别为truefalse时,当点击右侧的按钮时,红色的div会贴近可视区域的顶部或底部。

之后是Object型参数,这个对象有两个选项,也就是对象里面的keyblock与之前的Boolean型参数一致,不过值不再是truefalse,是更语义化的startend

另一个选项是behavior,MDN上给出三个可取的值,分别是autoinstantsmooth。这个选项决定页面是如何滚动的,实测autoinstant都是瞬间跳到相应的位置,查阅W3C后发现了这么一句:

The instant value of scroll-behavior was renamed to auto.

因而基本可以确定两者表现是一致的。而smooth就是有动画的过程,可惜的是之前提及兼容性时说过,黄色其实不支持某个属性,就是不支持behavior取值为smooth。而且,实测了IE及移动端的UC浏览器后发现,它们根本就不支持Object型参数,因而在调用scrollIntoView({...})时,只有默认的结果,即scrollIntoView(true)。简单的 例子 看这里,如果想体验smooth的效果,需要使用Chrome或者Firefox哦!主要代码如下:

1<body> 2 <div class="chunk"></div> 3 <div class="btn-top">up</div> 4 <div class="btn-bottom">down</div> 5 <script> const up = document.querySelector('.btn-top'); 6 const down = document.querySelector('.btn-bottom'); 7 const test = document.querySelector('.chunk'); 8 up.addEventListener('click', function() { 9 test.scrollIntoView({ 10 block: 'start', 11 behavior: 'smooth' 12 }); 13 }); 14 down.addEventListener('click', function() { 15 test.scrollIntoView({ 16 block: 'end', 17 behavior: 'smooth' 18 }); 19 }); </script> 20</body>

scrollIntoViewIfNeeded

介绍完scrollIntoView,是时候介绍一下它的变体scrollIntoViewIfNeeded了。两者主要区别有两个。首先是scrollIntoViewIfNeeded是比较懒散的,如果元素在可视区域,那么调用它的时候,页面是不会发生滚动的。其次是scrollIntoViewIfNeeded只有Boolean型参数,也就是说,都是瞬间滚动,没有动画的可能了。

scrollIntoViewIfNeeded可以接受一个Boolean型参数,和scrollIntoView不同,true为默认值,但不是滚动到顶部,而是让元素在可视区域中居中对齐;false时元素可能顶部或底部对齐,视乎元素靠哪边更近。简单的 例子 可以点这里。大致代码如下:

1<body> 2 <div class="chunk"></div> 3 <div class="scrollIntoView">scrollIntoView top</div> 4 <div class="scrollIntoViewIfNeeded-top">scrollIntoViewIfNeeded top</div> 5 <div class="scrollIntoViewIfNeeded-bottom">scrollIntoViewIfNeeded botom</div> 6 <script> const scrollIntoView = document.querySelector('.scrollIntoView'); 7 const scrollIntoViewIfNeededTop = document.querySelector('.scrollIntoViewIfNeeded-top'); 8 const scrollIntoViewIfNeededBottom = document.querySelector('.scrollIntoViewIfNeeded-bottom'); 9 const test = document.querySelector('.chunk'); 10 scrollIntoView.addEventListener('click', function() { 11 test.scrollIntoView(true); 12 }); 13 scrollIntoViewIfNeededTop.addEventListener('click', function() { 14 test.scrollIntoViewIfNeeded(true); 15 }); 16 scrollIntoViewIfNeededBottom.addEventListener('click', function() { 17 test.scrollIntoViewIfNeeded(false); 18 }); </script> 19</body>

如文档所说,当红色的div完全在可视区域的情况下,调用scrollIntoView()是会发生滚动,而调用scrollIntoViewIfNeeded()则不会。而我实践后发现了一些文档没有的细节。当元素处于可视区域,但不是全部可见的情况下,调用scrollIntoViewIfNeeded()时,无论参数是true还是false,都会发生滚动,而且效果是滚动到元素与可视区域顶部或底部对齐,视乎元素离哪端更近。这个大家需要注意一下~

本文转自 https://blog.csdn.net/fxss5201/article/details/80672263,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

Python+Selenium自动化篇

本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''