转载:利用本地存储实现记录滚动条的位置
在做项目的时候,希望给页面添加一个功能,就是刷新页面之后滚动条还可以保持在刷新之前的位置,方便用户继续浏览。查询了相关资料之后看到一篇文章讲得不错,链接如下:
原文地址:http://learning.sohu.com/20161219/n476332520.shtml
作者:HTML5学堂(http://www.h5course.com/)
文章原文:
在一定时间范围内,用手机微信打开之前浏览过的订阅号的文章,文章显示出来的是你上次阅读到的位置,而不是从头开始显示。手机微信是怎么知道你文章阅读的位置?前端工程师能否实现该功能?
本文主要内容:
1、功能介绍
2、功能分析
3、知识要点
4、具体实现
5、总结
1、功能介绍
为了让大家更清楚的知道今天要学习的效果,先一起来体验一下吧。我们先在手机微信打开Html5学堂订阅号中的文章,当文章浏览到某一个位置的时候点击左上角返回,然后再次点击刚刚浏览过的那篇文章,显示出来的是你刚才阅读到的位置,而不是从头开始显示,这个用户体验是不是觉得很赞。
效果:
2、功能分析
这个功能的实现并不是很难,当页面滚动时记录页面滚动条的位置并保存到本地存储里面,当你再次打开页面的时候读取本地存储里面的值来设置页面滚动条的位置。具体我们来分析一下。
分析:
1)监听页面滚动条的状态(是否滚动)
2)滚动时获取页面滚动条的位置
3)滚动条的位置保存到本地存储里面
4)页面每次加载的时候获取本地存储里面的值
5)获取到的值来设置页面滚动条的位置
3、知识要点
1)监听页面滚动条的状态(是否滚动)
浏览器监测到滚动条发生滚动时,就会触发scroll事件。
1 < type="text/java">
2 window.addEventListener('scroll', function() {
3 console.log('滚动条滚动了');
4 }, false);
5 </>
tips:页面需要有一定的内容才能出现滚动条,否则触发不了scroll事件。
2)滚动时获取页面滚动条的位置
代码中解决了获取滚动条位置的兼容问题。
1 < type="text/java">
2 var ls = window.localStorage;
3 ls.setItem('sTop', 200);
4 </>
3)滚动条的位置保存到本地存储里面
使用本地存储的setItem方法设置本地存储的值。
1 < type="text/java">
2 var ls = window.localStorage;
3 ls.setItem('sTop', 200);
4 </>
4)页面每次加载的时候获取本地存储里面的值
先判断本地存储里面是否有记录过页面滚动条的值,如果有则获取本地存储的值,否则不进行操作。
1 < type="text/java">
2 var ls = window.localStorage;
3 if (ls.getItem('sTop')) {
4 console.log(ls.getItem('sTop', 200));
5 } else {
6 console.log('抱歉,找不到滚动条的值');
7 }
8 </>
5)获取到的值来设置页面滚动条的位置
跟获取滚动条位置一样处理了浏览器兼容问题。
1 < type="text/java">
2 if (document.documentElement.scrollTop) {
3 document.documentElement.scrollTop = 200;
4 } else {
5 document.body.scrollTop = 200;
6 }
7 </>
4、具体实现
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8" />
5 <title>HTML5Course - 利用本地存储,记录页面浏览器的位置</title>
6 <link rel="stylesheet" type="text/css" href="http://css.h5course.cn/reset.css" />
7 <style type="text/css">
8 .wrap {
9 padding: 15px 0;
10 max-width: 640px;
11 margin: 0 auto;
12 }
13 .wrap > h2 {
14 padding: 10px 0;
15 color: #39f;
16 font-size: 24px;
17 }
18 .wrap > p {
19 line-height: 40px;
20 font-size: 18px;
21 }
22 </style>
23 </head>
24 <body>
25 <div class="wrap">
26 <h2>HTML5学堂官网</h2>
27 <p>HTML5学堂,致力于构建一个前端、HTML5的“原创”分享平台。能够为学习者提供一些资料,也为广大前端爱好者提供一个平台。HTML5学堂最初由两名讲师(利利和堡堡)创建,当前有多名HTML5讲师以及HTML5开发工程师组成。H5学堂中,主要涉及HTML与CSS、Java、jQuery、AJAX等前端的基本的知识、HTML5的实例开发、Java底层知识、类库、面试真题、相关技术、行业未来发展等。这里,将知识最通俗易懂的描述出来。我们希望HTML5学堂能够成为一个个性化的学习网站,为您提供最适合您的信息。</p>
28 <h2>HTML5学堂微信</h2>
29 <p>收罗HTML5与HTML5的相关技术。在这里有原创的HTML5、CSS3、Java等前端知识,也有来自互联网的HTML5全新动态~HTML5学堂由几位讲师倾情打造,或许这里没有最牛的技术,但却将HTML5最浅显易懂的表达了出来。</p>
30 <h2>摩登足迹微信号</h2>
31 <p>当前你的智能手机,隐藏着哪些功能你不了解的功能,又有哪些优秀的生活软件?“狗带”“宝宝心里苦”到底什么意思?所有内容尽收于此.这里有智能手机的小用法,有各类优秀软件,也有那些你不了解的流行词汇.</p>
32 <h2>HTML5学堂官网</h2>
33 <p>HTML5学堂,致力于构建一个前端、HTML5的“原创”分享平台。能够为学习者提供一些资料,也为广大前端爱好者提供一个平台。HTML5学堂最初由两名讲师(利利和堡堡)创建,当前有多名HTML5讲师以及HTML5开发工程师组成。H5学堂中,主要涉及HTML与CSS、Java、jQuery、AJAX等前端的基本的知识、HTML5的实例开发、Java底层知识、类库、面试真题、相关技术、行业未来发展等。这里,将知识最通俗易懂的描述出来。我们希望HTML5学堂能够成为一个个性化的学习网站,为您提供最适合您的信息。</p>
34 <h2>HTML5学堂微信</h2>
35 <p>收罗HTML5与HTML5的相关技术。在这里有原创的HTML5、CSS3、Java等前端知识,也有来自互联网的HTML5全新动态~HTML5学堂由几位讲师倾情打造,或许这里没有最牛的技术,但却将HTML5最浅显易懂的表达了出来。</p>
36 <h2>摩登足迹微信号</h2>
37 <p>当前你的智能手机,隐藏着哪些功能你不了解的功能,又有哪些优秀的生活软件?“狗带”“宝宝心里苦”到底什么意思?所有内容尽收于此.这里有智能手机的小用法,有各类优秀软件,也有那些你不了解的流行词汇.</p>
38 <h2>HTML5学堂官网</h2>
39 <p>HTML5学堂,致力于构建一个前端、HTML5的“原创”分享平台。能够为学习者提供一些资料,也为广大前端爱好者提供一个平台。HTML5学堂最初由两名讲师(利利和堡堡)创建,当前有多名HTML5讲师以及HTML5开发工程师组成。H5学堂中,主要涉及HTML与CSS、Java、jQuery、AJAX等前端的基本的知识、HTML5的实例开发、Java底层知识、类库、面试真题、相关技术、行业未来发展等。这里,将知识最通俗易懂的描述出来。我们希望HTML5学堂能够成为一个个性化的学习网站,为您提供最适合您的信息。</p>
40 <h2>HTML5学堂微信</h2>
41 <p>收罗HTML5与HTML5的相关技术。在这里有原创的HTML5、CSS3、Java等前端知识,也有来自互联网的HTML5全新动态~HTML5学堂由几位讲师倾情打造,或许这里没有最牛的技术,但却将HTML5最浅显易懂的表达了出来。</p>
42 <h2>摩登足迹微信号</h2>
43 <p>当前你的智能手机,隐藏着哪些功能你不了解的功能,又有哪些优秀的生活软件?“狗带”“宝宝心里苦”到底什么意思?所有内容尽收于此.这里有智能手机的小用法,有各类优秀软件,也有那些你不了解的流行词汇.</p>
44 </div>
45 < typetype="text/java">
46 var ls = window.localStorage;
47 // 页面每次加载的时候获取本地存储里面的值
48 if (ls.getItem('sTop')) {
49 var oldStop = ls.getItem('sTop');
50 // 获取到的值来设置页面滚动条的位置
51 if (document.documentElement.scrollTop) {
52 document.documentElement.scrollTop = oldStop;
53 } else {
54 document.body.scrollTop = oldStop;
55 }
56 } else {
57 console.log('抱歉,找不到滚动条的值');
58 }
59 // 监听页面滚动条的状态(是否滚动)
60 window.addEventListener('scroll', function() {
61 // 滚动时获取页面滚动条的位置
62 var sTop = document.documentElement.scrollTop || document.body.scrollTop;
63 // 滚动条的位置保存到本地存储里面
64 ls.setItem('sTop', sTop);
65 }, false);
66 </>
67 </body>
68 </html>
效果:
5、总结
利用本地存储,记录滚动条的位置,主要涉及了两个主要技术点,一个点是滚动条的操作,另外一个点是本地存储的操作。其实,这个功能还可以扩展到Tab切换里面,记录用户点击了哪一个Tab项,下次打开的时候显示上次打开的Tab项。