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

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

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

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

先看scrollIntoView的:

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

之后看看scrollIntoViewIfNeeded

IEFireFox全红,如果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型参数,顾名思义,参数可以使truefalse。如果为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>

如你所见到的,当传入参数为分别为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哦!主要代码如下:

<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. [转]Commons IO 官方文档

    原文地址:http://ifeve.com/commons-io/ 本文翻译自 Commons IO 官方文档 译者:MagicWolf Common IO 是一个工具库,用来帮助开发IO功能 它包括 ...

  2. Android——Service

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  3. 私有IP地址共有三个范围段

    在现在的网络中,IP地址分为公网IP和私有IP地址.公网IP是在Internet使用的IP地址,而私有IP地址是在局域网中使用的IP地址. 由于我们目前使用的IP V4协议的限制,现在IP地址的数量是 ...

  4. CentOS服务器简单判断CC攻击的命令

    使用下面的命令,可以分析下是否在被CC攻击.   第一条命令: tcpdump -s0 -A -n -i any | grep -o -E '(GET|POST|HEAD) .*' 正常的输出结果类似 ...

  5. 全国地区的省份、城市、区县 最新Sql脚本

    IF (EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TB_Province]') AND type =' ...

  6. Redis的内存回收机制

    Redis的内存回收机制 2018年01月16日 17:11:48 chs007chs 阅读数:1172   Redis的内存回收机制主要体现在一下两个方面: 删除过期时间的键对象 删除过期键对象 : ...

  7. JQ 点击指定文本框显示div。点击其他区域隐藏DIV

    <input id="username" type="text" style="width:90%;margin-top: 40px;" ...

  8. CRNA的使用

    为了能让更多人感受 RN 的魅力,早在几个月前 React-community 就给出了一个不错的解决方案,可以让一个完全没接触过 RN 的人,从配环境开始5分钟实现 Hello Wolrd 的编写( ...

  9. viewpager+fragment滑动切换卡顿问题

    最近在做项目的时候遇到个问题,viewpager中的fragment添加使用listview添加数据后出现滑动卡顿,造成用户体验感极差.找了很久的资料,也试了很多大方法,在这里给大家分享下: 1.添加 ...

  10. Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

    转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...