JS控制元素平滑滚动,页面自动滚动锚点实现

使用 scrollIntoView 实现元素内子元素的平滑滚动,
下面是模拟接口list返回,然后通过按钮切换下一个,页面就会滚动到响应的位置
具体 scrollIntoView 有一些其他参数来配置滚动的具体交换,网上去查即可
备注:下面的代码使用 Vite框架 + React Hooks + 简单的TS,实现的方案都是一样,具体的代码可能不同

实现效果如下:
请添加图片描述

首先第一步,配置电脑设置
如图所示:打开【控制面板】- 搜索【性能】 - 调整 Windows 的外观和性能选项 - 开启【窗口内的动画控件和元素】
在这里插入图片描述

第二步,写页面和样式代码
这里使用了react + ts,不管用什么语言框架,理解其中思路,代码实现可能不同

// tsx 文件
import { useEffect, useRef, useState } from 'react'
import './index.css'export default function Index() {const listRef = useRef<any>() // 需要滚动的父容器const [acitve, setActive ] = useState(0) //当前激活项const [list, setList] = useState<any>([])// 生命周期获取接口useEffect(() => {getData()}, [])// 监听active激活位置的变化,滚动到相应为止useEffect(() => {let childEl = listRef.current.childNodes[acitve]// 由于接口是异步的,一开始进入页面会执行要处理初始情况,list有值了才开始if(list.length){childEl.scrollIntoView({ behavior: 'smooth' });}}, [acitve])// 这里模仿接口来的数据const getData = async () => {let res = await new Promise(resolve => {setTimeout(() => {return resolve([0,1,2,3,4,5,6,7,8,9])}, 500)})setList(res)}// 设置当前激活项目const onChange = () => {setActive(pre => {let next = pre >= 9 ? 0: pre+1return next})}return (<div className='page'><div className='head'><span>acitve: {acitve}</span><button onClick={onChange}>next</button></div><div className='list_warp'><div className='list' ref={listRef}>{ list.map((item:number) => <div key={item} className='card'>{item}</div>)}</div></div></div>)
}

对应的 index.css

/* 同目录下的index.css */
.page{margin: 24px;width: 300px;
}.list_warp{margin: 24px 0;width: 300px;height: 60vh;padding: 12px;border: 2px solid red;background:  pink;box-sizing: border-box;
}.list{height: 100%;overflow-y: scroll;scrollbar-width: none;-ms-overflow-style: none;&::-webkit-scrollbar{display: none;}
}.head{display: flex;justify-content: space-between;
}.card{overflow: hidden;background: greenyellow;margin-bottom: 12px;height: 200px;border: 1px solid green;box-sizing: border-box;
}

到这里就是实现了效果了
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/813751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element ui 动态展示表格列,动态格式化表格列的值

需求 后台配置前端展示的表格列&#xff0c;遇到比如 文件大小这样的值&#xff0c;如果后台存的是纯数字&#xff0c;需要进行格式化展示&#xff0c;并且能控制显示的小数位数&#xff0c;再比如&#xff0c;部分列值需要加单位等信息&#xff0c;此外还有状态类&#xff0…

19c ADG补丁升级及回退

一、环境说明 主 备 IP 192.168.37.201 192.168.37.202 系统版本 RedHat 7.9RedHat 7.9 数据库版本 19.3.0.0.019.3.0.0.0 SID pristd hostname primarystandby 二、OPatch配置 19c 19.22版本补丁&#xff0c;需要的Opatch的版本为12.2.0.1.40或者高于此版本才可以。 2.1…

数据结构--循环队列

1.队列的定义: 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front). 2.循环队列的设计图示: 3.循环队列的结构设计: ty…

很严重,大家开始存钱吧

hello大家好&#xff0c;我是张大哥&#xff0c;今天给大家聊的话题是资产和负债&#xff01;2024年&#xff0c;特别建议大家&#xff1a;一定要捂紧钱袋子&#xff0c;尽量减少不必要的消费支出&#xff0c;避免遭受经济波动的最直接影响。 什么是资产&#xff0c;就是能提供…

Vue.js npm错误:transpileDependencies.map不是一个函数

这个错误通常是由于npm版本不兼容导致的。在旧版本的npm中&#xff0c;transpileDependencies是一个字符串数组&#xff0c;我们可以直接配置需要编译的依赖库。而在较新版本的npm中&#xff0c;transpileDependencies被改成了一个对象&#xff0c;并且需要使用map()方法来处理…

刷好题,固基础-10

今天打天梯赛模拟赛有一道全排列的题&#xff08;在我看来是啦&#xff0c;虽然只拿了25/30&#xff0c;一个点超时了呜呜呜呜呜&#xff09; 在此纪念一下自己推导得出的得到两种不同全排列的方法&#xff1a; 方法一&#xff1a;按照字典序大小推导得出的全排列顺序 p是全…

【数据交换格式】网络socket编程温度采集智能存储与上报项目技术------JSON、TLV

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

Git删除未跟踪的文件Untracked files

在 Git 中&#xff0c;要删除未跟踪的文件&#xff08;Untracked files&#xff09;&#xff0c;你可以使用 git clean 命令。请注意&#xff0c;这个命令会从你的工作目录中永久删除这些文件&#xff0c;因此在执行之前请确保你不再需要这些文件或已经妥善备份。 以下是如何使…

DataSource

目录 1、 DataSource 1.1、 * 建立数据库连接的参数对象 1.1.1、 * 数据库url 1.1.2、 * 数据库用户名 1.1.3、 * 数据库密码 1.1.4、 * 数据库驱动名称 <

【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步…

C++设计模式:代理模式(十三)

1、代理模式 定义&#xff1a;为其他对象提供一种代理以控制&#xff08;隔离使用接口&#xff09;对这个对象的访问等。 动机 在面向对象系统中&#xff0c;有些对象由于某种原因&#xff08;比如对象需要进程外的访问等&#xff0c;例如在分布式的系统中&#xff09;&#x…

【ZZULIOJ】1063: 最大公约与最小公倍(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 输入两个正整数&#xff0c;输出其最大公约数和最小公倍数。 输入 输入两个正整数n和m&#xff08;n,m<1000000)。输入保证最终结果在int范围内。 输出 输出两个整数&#xff0c;用空格…

【项目实战经验】DataKit迁移MySQL到openGauss(下)

上一篇我们分享了安装、设置、链接、启动等步骤&#xff0c;本篇我们将继续分享迁移、启动~ 目录 9. 离线迁移 9.1. 迁移插件安装 中断安装&#xff0c;比如 kill 掉java进程&#xff08;安装失败也要等待300s&#xff09; 下载安装包准备上传 缺少mysqlclient lib包 mysq…

oracle rac打补丁后sqlplus / as sysdba ora-12537

sqlplus / as sysdba 报错&#xff1a; ORA-12537: TNS:connection closed 检查用户属组&#xff1a; [rootrac1 ~]# id oracle uid1102(oracle) gid1101(oinstall) groups1101(oinstall),1102(dba) [rootrac1 ~]# id grid uid1101(grid) gid1101(oinstall) groups1101(oin…

大语言模型LLM《提示词工程指南》学习笔记03

文章目录 大语言模型LLM《提示词工程指南》学习笔记03链式提示思维树检索增强生成自动推理并使用工具自动提示工程师Active-Prompt方向性刺激提示Program-Aided Language ModelsReAct框架Reflexion多模态思维链提示方法基于图的提示大语言模型LLM《提示词工程指南》学习笔记03 …

【零基础学数据结构】双向链表

1.双向链表的概念 1.1头节点 1.2带头双向循环链表 注意&#xff1a; 哨兵位创建后&#xff0c;首尾连接自己 1.3双链表的初始化 // 双向链表的初始化 void ListInit(ListNode** pphead) {// 给双链表创建一个哨兵位*pphead ListBuyNode(-1); } 2.双向链表的打印 // 双向…

怎么用docker安装MySQL

可以访问 Docker Hub 上的 MySQL 镜像仓库。在 MySQL 官方仓库页面上&#xff0c;会列出所有可用的镜像标签及其对应的版本。 以下是使用 Docker 安装 MySQL 8 的基本步骤&#xff1a; 拉取官方的 MySQL 8 镜像&#xff1a; docker pull mysql:8 运行一个 MySQL 容器实例&a…

蓝桥杯备考随手记: 常见的二维数组问题

在Java中&#xff0c;二维数组是一种可以存储多个元素的数据结构。它由多个一维数组组成&#xff0c;这些一维数组可以看作是行和列的组合&#xff0c;形成了一个矩阵。 1. 二维数组旋转问题 二维数组的旋转是指将数组中的元素按照一定规则进行旋转。通常有两种常见的旋转方式…

SpringBoot 面试题(四)

1. 如何使用SpringBoot实现定时任务&#xff1f; 在Spring Boot中实现定时任务&#xff0c;通常可以使用Scheduled注解。以下是一个简单的例子说明如何在Spring Boot应用中创建一个定时任务&#xff1a; 首先&#xff0c;确保你的Spring Boot项目中包含了Spring Scheduler的依…

安卓Android.nfc读卡

使用安卓手机&#xff0c;通过NFC功能可以读取IC卡信息&#xff0c;。 IC卡有很多种卡标准&#xff0c;协议&#xff0c;等等&#xff0c;这些具体就不细讨论。 主要讨论&#xff0c;2种卡&#xff0c;一种是M1卡&#xff0c;另外是CPU卡。 1、 M1卡 M1卡是市面上比较常见的卡…