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

 更新时间:2022-06-04 00:17:47   作者:佚名   我要评论(0)

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

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

滚动

这也有两种情况:页面重新打开,与返回某个页面。
如果是前者,必定用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内置浏览器中,短时间内重新打开相同页面的逻辑和普通刷新是一样的。

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

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

强制刷新(CTRL + F5)不会“记住”用户位置

到此这篇关于JS实现页面滚动到关闭时的位置与不滚动效果的文章就介绍到这了,更多相关js页面滚动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • js监听html页面的上下滚动事件方法
  • js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
  • JS实现部分HTML固定页面顶部随屏滚动效果
  • 原生js页面滚动延迟加载图片
  • js判断滚动条是否已到页面最底部或顶部实例
  • 当滚动条滚动到页面底部自动加载增加内容的js代码
  • jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
  • 原生Js页面滚动延迟加载图片实现原理及过程

相关文章

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

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

    目录滚动不滚动标题显而易见,要说两种情况:重新打开页面或者返回某个页面时滚动到上次离开时的位置,以及不滚动保持在顶部。 滚动 这也有两
    2022-06-04
  • Java深入分析讲解反射机制

    Java深入分析讲解反射机制

    目录反射的概述获取Class对象的三种方式通过反射机制获取类的属性通过反射机制访问Java对象的属性反射机制与属性配置文件的配合使用资源绑定
    2022-06-04
  • Android项目开发常用工具类LightTaskUtils源码介绍

    Android项目开发常用工具类LightTaskUtils源码介绍

    目录LightTaskUtils概述LightTaskUtils截图LightTaskUtils源码版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfh
    2022-06-04
  • Java超详细讲解排序二叉树

    Java超详细讲解排序二叉树

    目录排序二叉树概念排序二叉树类的定义添加节点中序遍历查找节点查找某一节点的父节点删除节点排序二叉树概念 二叉排序树(Binary Sort Tree
    2022-06-04
  • C++和OpenCV实现图像字符化效果

    C++和OpenCV实现图像字符化效果

    目录实现原理功能函数代码作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 图
    2022-06-04
  • Java超详细分析讲解哈希表

    Java超详细分析讲解哈希表

    目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的
    2022-06-04
  • netty 实现tomcat的示例代码

    netty 实现tomcat的示例代码

    目录netty 实现tomcat自定义基础类netty 服务端使用测试netty 实现tomcat 自定义基础类 TomcatServlet public abstract class TomcatServlet
    2022-06-04
  • Python中requests库的用法详解

    Python中requests库的用法详解

    目录一、requests库安装请求响应二、发送get请求1、一个带参数的get请求:2、响应json3、添加头信息headers4、添加和获取cookie信息三、发送
    2022-06-04
  • 深入解析vue中的权限管理

    深入解析vue中的权限管理

    目录vue要做权限管理该怎么做?一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结vue要做权限管理该怎
    2022-06-04
  • Spring Boot深入分析讲解日期时间处理

    Spring Boot深入分析讲解日期时间处理

    目录GET请求及POST表单日期时间字符串格式转换使用自定义参数转换器(Converter)使用Spring注解使用ControllerAdvice配合initBinderJSON入参
    2022-06-04

最新评论