JS实现页面滚动到关闭时的位置与不滚动效果

作者:恪愚 时间:2024-04-10 10:47:56 

标题显而易见,要说两种情况:重新打开页面或者返回某个页面时滚动到上次离开时的位置,以及不滚动保持在顶部。

滚动

这也有两种情况:页面重新打开,与返回某个页面。
如果是前者,必定用cookie或者localStorage。或者麻烦一点的、在webview中用其他手段。总之这个必须有存储。

然后在组件的activited或是window.onload时取出存储内容改变scrollTop 。非常牛逼。

对于原生页面,如果在关键位置没有图片和表格,可以尝试在onreadystatechange中完成,不必等到onload
关于这点,背景和降级处理等具体可以参考笔者的这篇文章:点击跳转

若是第二种情况,则只需要临时缓存即可,这里拿vue演示一下:
有两个方案。其一,利用路由中的meta,在离开页面时缓存 top 信息

// router/index.js
{
 path: "/user",
 name: "user",
 component: () => import("../views/user.vue"),
 meta: { scrollTop: 0, keepScroll: true }
},
// ...
router.beforeEach((to, from, next) => {
 // 记录需要缓存页面的滚动条高度
 if (from.meta.keepScroll) {
   const $content = document.querySelector("#app");
   const scrollTop = $content ? $content.scrollTop : 0;
   from.meta.scrollTop = scrollTop;
 }
 next();
});

然后在回到当前页面时拿到临时缓存,并赋值

// utils/index.js
export const getScroll = vm => {
 const scrollTop = vm.$route.meta.scrollTop;
 const $content = document.querySelector('#app');
 if (scrollTop && $content) {
   $content.scrollTop = scrollTop;
 }
};

组件内

import * as util from '@/utils/';
//...
activeted() {
 // 保持滚动条
 util.getScroll(this);

}

其二,利用keep-alive缓存整个页面。但是仅限于没有实时数据变动的页面

<template>
 <div id="app">
   <keep-alive >
       <router-view v-if="$route.meta.keepAlive"></router-view>
   </keep-alive>
   <router-view v-if="!$route.meta.keepAlive"></router-view>
 </div>
</template>

路由配置里 在需要被缓存的页面meta里配置keepAlive属性

{
 path: '/index',
 name: 'index',
 meta: {
   title: ' ',
   keepAlive: true,//此组件需要被缓存
 },
 component: () => import('@/components/index'),
},

组件内在beforeRouteLeave钩子函数中,将该页面的 keepAlive 属性设为false

beforeRouteLeave (to, from, next) {
 from.meta.keepAlive = false;
 next();
},

然后需要在下一个页面进行配置,页面返回时设置上一个页面的 keepAlive 为true

beforeRouteLeave (to, from, next) {
 if (to.path == "/index") {
   to.meta.keepAlive = true;
 } else {
   to.meta.keepAlive = false;
 }
 next();
},

不滚动

其实有的页面我们会发现,体验下来觉得并不想让重新进入时回到上一次浏览的地方。
理论上说这里不加上面提到的各种方法不就行了?其实不然。
「重新进入」也分两种情况:重新打开这个页面,和刷新页面。
前者大可不必关心。对于后者,在比如QQ内置浏览器中,短时间内重新打开相同页面的逻辑和普通刷新是一样的。

在浏览器中,普通刷新会&ldquo;记住&rdquo;用户上次的位置似乎是个惯例了。如何在页面刷新时保持在顶部呢?
浏览器提供了historyAPI实现。其兼容性还算不错,除了IE外基本目前使用的浏览器都可以使用了。

if (history.scrollRestoration) {
   history.scrollRestoration = 'manual';
}

强制刷新(CTRL + F5)不会&ldquo;记住&rdquo;用户位置

来源:https://blog.csdn.net/qq_43624878/article/details/125111041

标签:js,页面,滚动
0
投稿

猜你喜欢

  • apache部署python程序出现503错误的解决方法

    2022-01-12 20:37:21
  • 微信小程序(六):列表上拉加载下拉刷新示例

    2024-05-11 09:34:22
  • 小三角的做法与使用

    2008-10-08 10:25:00
  • Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法

    2023-09-04 23:12:41
  • Python脚本暴力破解栅栏密码

    2022-02-09 18:31:11
  • ASP与Excel结合生成数据表和Chart图的代码

    2011-03-08 10:50:00
  • 深入理解Vue官方文档梳理之全局API

    2024-05-05 09:08:25
  • 还不知道Anaconda是什么?读这一篇文章就够了

    2022-02-19 01:36:50
  • Python析构函数__del__定义原理解析

    2023-01-02 15:20:29
  • 分析Python编程时利用wxPython来支持多线程的方法

    2021-03-09 12:02:57
  • js实现一个简易的计算器

    2024-02-23 11:48:31
  • python PyTorch预训练示例

    2022-07-06 18:24:02
  • 深入解析Python的Tornado框架中内置的模板引擎

    2022-08-03 12:43:52
  • JavaScript中常用的简洁高级技巧总结

    2024-04-19 10:47:30
  • python 详解如何使用GPU大幅提高效率

    2023-08-24 19:45:46
  • python 画3维轨迹图并进行比较的实例

    2023-12-09 21:00:18
  • asp读取数据库中数据到数组的类

    2007-09-16 18:19:00
  • Asp.net中使用Sqlite数据库的方法

    2024-01-18 03:14:45
  • SaaS中的用户体验设计

    2009-05-20 12:28:00
  • Python调用adb命令实现对多台设备同时进行reboot的方法

    2022-08-06 02:40:45
  • asp之家 网络编程 m.aspxhome.com