根据 MDN的描述,Element.scrollIntoView()方法让当前的元素滚动到浏览器窗口的可视区域内。

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

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

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

先看scrollIntoView的:

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

之后看看scrollIntoViewIfNeeded:

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

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

scrollIntoView

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

<body>
<div class="chunk"></div>
<div class="btn">click</div>
<script>
const btn = document.querySelector('.btn');
const test = document.querySelector('.chunk');
btn.addEventListener('click', function() {
test.scrollIntoView();
})
</script>
</body>

是不是很简单~不过可能有同学就有疑问了,这不就和锚点定位一样吗?感觉毫无意义啊!先别急,当你调用scrollIntoView的时候,其实是可以传参数进去的。scrollIntoView只接受一个参数,但接受两种类型的参数,分别是Boolean型参数和Object型参数。

先说Boolean型参数,顾名思义,参数可以使true和false。如果为true,元素的顶端将和其所在滚动区的可视区域的顶端对齐。若为false,元素的底端将和其所在滚动区的可视区域的底端对齐。简单的例子可以点这里。主要代码如下:

<body>
<div class="chunk"></div>
<div class="btn-top">up</div>
<div class="btn-bottom">down</div>
<script>
const up = document.querySelector('.btn-top');
const down = document.querySelector('.btn-bottom');
const test = document.querySelector('.chunk');
up.addEventListener('click', function() {
test.scrollIntoView(true);
});
down.addEventListener('click', function() {
test.scrollIntoView(false);
});
</script>
</body>

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

之后是Object型参数,这个对象有两个选项,也就是对象里面的key。block与之前的Boolean型参数一致,不过值不再是true和false,是更语义化的start和end。

另一个选项是behavior,MDN上给出三个可取的值,分别是auto、instant与smooth。这个选项决定页面是如何滚动的,实测auto与instant都是瞬间跳到相应的位置,查阅W3C后发现了这么一句:"The instant value of scroll-behavior was renamed to auto."。因而基本可以确定两者表现是一致的。而smooth就是有动画的过程,可惜的是之前提及兼容性时说过,黄色其实不支持某个属性,就是不支持behavior取值为smooth。而且,实测了IE及移动端的UC浏览器后发现,它们根本就不支持Object型参数,因而在调用scrollIntoView({...})时,只有默认的结果,即scrollIntoView(true)。简单的例子看这里,如果想体验smooth的效果,需要使用Chrome或者Firefox哦!主要代码如下:

<body>
<div class="chunk"></div>
<div class="btn-top">up</div>
<div class="btn-bottom">down</div>
<script>
const up = document.querySelector('.btn-top');
const down = document.querySelector('.btn-bottom');
const test = document.querySelector('.chunk');
up.addEventListener('click', function() {
test.scrollIntoView({
block: 'start',
behavior: 'smooth'
});
});
down.addEventListener('click', function() {
test.scrollIntoView({
block: 'end',
behavior: 'smooth'
});
});
</script>
</body>

scrollIntoViewIfNeeded

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

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

<body>
<div class="chunk"></div>
<div class="scrollIntoView">scrollIntoView top</div>
<div class="scrollIntoViewIfNeeded-top">scrollIntoViewIfNeeded top</div>
<div class="scrollIntoViewIfNeeded-bottom">scrollIntoViewIfNeeded botom</div>
<script>
const scrollIntoView = document.querySelector('.scrollIntoView');
const scrollIntoViewIfNeededTop = document.querySelector('.scrollIntoViewIfNeeded-top');
const scrollIntoViewIfNeededBottom = document.querySelector('.scrollIntoViewIfNeeded-bottom');
const test = document.querySelector('.chunk');
scrollIntoView.addEventListener('click', function() {
test.scrollIntoView(true);
});
scrollIntoViewIfNeededTop.addEventListener('click', function() {
test.scrollIntoViewIfNeeded(true);
});
scrollIntoViewIfNeededBottom.addEventListener('click', function() {
test.scrollIntoViewIfNeeded(false);
});
</script>
</body>

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

作者:sea_ljf
链接:https://juejin.im/post/59d74afe5188257e8267b03f
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
 
window.addEventListener('resize', () => {    

   if (document.activeElement.tagName == 'INPUT') {        

       //延迟出现是因为有些 Android 手机键盘出现的比较慢         window.setTimeout(() => {            

           document.activeElement.scrollIntoViewIfNeeded();        

    }, 100);    

} });

js scrollIntoViewIfNeeded的更多相关文章

  1. selenium常用的js总结

    1. 对input执行输入 直接设置value属性, 此方法主要应对输入框自动补全以及readonly属性的element,sendkeys不稳定 比如: //inputbox is a WebEle ...

  2. appium java 滑动(js滑动和swipe滑动)

    最近有一个页面的内容很多,有的元素需要滑动到底部才能看到,所以就研究一下滑动,下面是我学习到的两种滑动方式 一:用js滑动 用js滑动的思路是很简单,首先是先定位到这个元素,定位到之后不做任何操作,然 ...

  3. js判断浏览器类型和版本

    原网址:http://www.cnblogs.com/rubylouvre/archive/2009/10/14/1583362.html 除了另无它法,肯定不使用navigator.userAgen ...

  4. selenium webdriver——JS滚动到指定位置

    1.DOM滚动方法 1.scrollIntoView(alignWithTop)  滚动浏览器窗口或容器元素,以便在当前视窗的可见范围看见当前元素.如果alignWithTop为true,或者省略它, ...

  5. js高级程序设计 笔记 --- DOM

    DOM是针对HTML和XML文档的一个API.DOM描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 1,节点层次 DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的 ...

  6. 更新常用的js工具函数

    在手机调试时打印代码<script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></ ...

  7. Js中遇到的坑点汇总

    一.Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug 解决思路: 1.去掉overflow属性 2. Android 手机下, input 或 textarea 元素聚焦时, 主动 ...

  8. JS 手札记

    addEventListener中的事件如果移除(removeEventListener)的话不能在事件中执行bind(this)否则会移除无效! // selectCurrent() // copy ...

  9. JS小整理

    禁止右键和复制 $(document).ready( function() { document.body.oncontextmenu = document.body.ondragstart = do ...

随机推荐

  1. C#学习笔记(19)——使用IComparer(百度文库)

    说明(2017-7-24 19:15:15): 1. 百度文库里的一篇文章,觉得讲的比较好.原文地址:https://wenku.baidu.com/view/b53cd250ad02de80d4d8 ...

  2. Nosql相关产品和分布式相关中间件

    1.memcached 2.redis 3.mongodb 4.消息队列的运用

  3. WPF样式继承

    场景:样式A和样式B的背景颜色一样,但是文字颜色不一样 <Style x:key="BaseStyle" TargetType="Button"> ...

  4. C语言 · 字符串编辑

    算法训练 字符串编辑   时间限制:1.0s   内存限制:512.0MB      问题描述 从键盘输入一个字符串(长度<=40个字符),并以字符 ’.’ 结束.编辑功能有: 1 D:删除一个 ...

  5. s9303这样的arp表是代表什么意思?

    s9303这样的arp表是代表什么意思? 在s9303交换机下dis arp 看到了最末2条有这样的记录 那个Incomplete 是什么意思呢? 答: 如果该字段显示为“Incomplete”,表示 ...

  6. 枚举Enum和常量0之间的恩怨

    1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...

  7. android开发(25) - 推送的实现,使用百度云推送

    什么叫推送? 中文名称:推送 英文名称:push 定义:描述因特网内容提供者和因特网用户之间工作方式的术语.“推送”指因特网内容提供者定期向预订用户“提供”数据. 项目中有可能会用到推送.如果自己写一 ...

  8. MySQL 5.6 GTID 原理以及使用

    转自:http://hamilton.duapp.com/detail?articleId=47 简介 GTID是MySQL 5.6的新特性,其全称是Global Transaction Identi ...

  9. 【C】——动态库中函数的作用范围

    如何生成动态库 net小伙 已经在此文中说明——[C]——如何生成静态库和动态库:接下来就要看看动态库中函数的作用范围: 首先我们使用命令   gcc -fPIC -shared -o libtest ...

  10. PCL特征点与配准(1)

    关于输入一个具体的物体的点云,从场景中找出与该物体点云相匹配的,这种方法可以用来抓取指定的物体等等,具体的代码的解释如下,需要用到的一些基础的知识,在之前的博客中都有提及,其中用到的一些方法可以翻阅前 ...