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内置浏览器中,短时间内重新打开相同页面的逻辑和普通刷新是一样的。
在浏览器中,普通刷新会“记住”用户上次的位置似乎是个惯例了。如何在页面刷新时保持在顶部呢?
浏览器提供了history
API实现。其兼容性还算不错,除了IE外基本目前使用的浏览器都可以使用了。
if (history.scrollRestoration) {
history.scrollRestoration = 'manual';
}
强制刷新(CTRL + F5)不会“记住”用户位置
来源:https://blog.csdn.net/qq_43624878/article/details/125111041


猜你喜欢
- MenuEverywhere 是Mac OS X上的一款小程序,前一阵刚为其完成了程序图标设计。© 2011 IconMo
- 训练用PyTorch编写的LSTM或RNN时,在loss.backward()上报错:RuntimeError: Trying to bac
- debian6系统:首先先安装mysql吧:打开终端(root)用户登入apt-get purge mysql-server-5.5安装完成
- 偶写的几个ASP字符串处理函数,用于文章分页的小玩意函数名:StrLen作 用:取得字符串长度(汉字为2)参 
- profile是什么当我们要对某一条sql的性能进行分析时,可以使用它。Profiling是从 mysql5.0.3版本以后才开放的。启动p
- 需求桌面临时文件较多时,直接删了不太放心,不删又显得很杂乱,故需要写一个脚本批量清理并备份这些鸡肋的文件。所以脚本需要具有以下功能1. 可以
- 最近,我不得不对我的一个客户的旧网站进行更新,使得它能够达到可访问性的标准。对三四年前的旧代码进行挖掘的想法根本没有吸引力,主要是因为我曾经
- 本文实例讲述了微信小程序picker组件简单用法。分享给大家供大家参考,具体如下:picker滚动选择器,现支持三种选择器,通过mode来区
- 阐述写SQL时本想通过 A left B join on and 后面的条件查出的两条记录变成一条,奈何发现还是有两条。后来发现 join
- 前言当今,随着计算机技术的发展,摄像头已经成为了人们生活中不可或缺的一部分。而Python作为一种流行的编程语言,也可以轻松地控制和操作摄像
- 用Python写个注册登录功能,供大家参考,具体内容如下本文是用Python写一个注册登录功能,难度不大,很适合练手主要就是用列表和字典,以
- 导言如我们在之前的教程里讨论的那样,分页可以通过两种方法来实现:1.默认分页– 你仅仅只用选中data Web control的 智能标签的
- 此文刊登在《程序员》三月期,有删改提到安全问题,首先想到应付这些问题的应该是系统管理员以及后台开发工程师们,而前端开发工程师似乎离这些问题很
- 1.Case函数的用法 (1)使用类似:switch-case与if-else if。 (2)语法: case [字段] when 表达式
- 本篇内容介绍了Python编程语言的优势和不足。首先我们来了解什么是Python?Python是一种面向对象的高级编程语言,具有集成的动态语
- 深入理解python try异常处理机制#python的try语句有两种风格#一:种是处理异常(try/except/else)#二:种是无
- Numpy 是Python科学计算的一个核心模块。它提供了非常高效的数组对象,以及用于处理这些数组对象的工具。一个Numpy数组由许多值组成
- 不能将 SQL Server 2000 日志传送配置升级到 SQL Server 2008。数据库维护计划向导是 SQL Server 20
- 在php中实现验证码还是很方便的,关键点在于掌握php gd库与session的用法。纵观网上php 生成验证码的例子,无不是php gd库
- 基本对比使用方式使用场合优缺点是否需要安装需要的dll网址引用方式程序内引用程序初期确定使用MySql,前期添加引用大多数情况下使用在类文件