vue实现平滑滚动到目标标签页

平滑滚动

   <div class="tabs" ref="tabList">
      <div class="tab"   v-for="(item, index) in 10"
        :key="index" @click="clickTab(index)">
        <div class="inside" :class="tabIndex === index ? 'inside-active' : ''">
          <div class="name">{{ index}}</div>
        </div>
      </div>
    </div>
const tabList = ref(null);
const clickTab = ((index) => {
  tabIndex.value = index
  scrollToTab(index)
})

// 滚动到选中的 Tab
const scrollToTab = (index) => {
  if (tabList.value) {
    const tabItems = tabList.value.children;
    const targetTab = tabItems[index];
    if (targetTab) {
      // 计算目标 Tab 的滚动位置,目标 Tab 会居中
      const scrollLeft = targetTab.offsetLeft - (tabList.value.offsetWidth / 2) + (targetTab.offsetWidth / 2);
      tabList.value.scrollTo({
        left: scrollLeft,
        behavior: 'smooth', // 平滑滚动
      });
    }
  }
};
  1. tabList.value:

这是容器元素,包含所有的标签(Tab)。通过 tabList.value 获取这个容器的引用。通过ref标记。可以拿到容器里面所有的子元素
在这里插入图片描述

  1. 获取 tabItems:

tabList.value.children 获取所有标签(Tab)元素的集合,tabItems 即是这些 Tab 元素。
在这里插入图片描述

  1. 获取目标 Tab:

根据传入的 index,从 tabItems 中取出对应的目标 Tab 元素。

  • 计算目标 Tab 的滚动位置:

  • targetTab.offsetLeft 获取目标 Tab 相对于 tabList 的左偏移量。

比如点击的是第三个tab,这时它的左偏移在这里插入图片描述

  • tabList.value.offsetWidth / 2 获取容器的宽度的一半,即容器中心的位置。
  • targetTab.offsetWidth / 2 获取目标 Tab 的宽度的一半,用于将目标 Tab 居中。
  • 最终的滚动位置是:目标 Tab 左边距减去容器一半宽度,再加上目标 Tab 一半宽度。
  1. 滚动操作:使用 scrollTo 方法平滑滚动到计算得出的 scrollLeft 位置。behavior: ‘smooth’ 让滚动动画更平滑。

  2. scrollTo 是一个用于在网页中滚动元素的 JavaScript 方法。它可以让你精确地控制滚动的位置,包括滚动到指定的坐标或元素位置。可以应用于滚动容器、页面或其他具有滚动条的元素。

语法:

element.scrollTo(x, y);
element.scrollTo(options);

参数:

  • x:水平滚动的目标位置(以像素为单位)。
  • y:垂直滚动的目标位置(以像素为单位)。

或者,你也可以使用一个包含滚动配置选项的对象:

element.scrollTo({
  left: number,     // 水平滚动位置(以像素为单位)
  top: number,      // 垂直滚动位置(以像素为单位)
  behavior: string  // 滚动行为,可选值:'auto' 或 'smooth'(默认值是 'auto')
});

示例 1:简单的滚动到指定位置

// 滚动到页面的某个位置
window.scrollTo(0, 500); // 滚动到页面从顶部 500px 处

// 或者可以在容器元素上调用 scrollTo,滚动到某个位置
document.getElementById("container").scrollTo(0, 200); // 滚动容器到 200px 处

示例 2:平滑滚动到指定位置
scrollTo 允许你设置滚动行为为平滑滚动,达到更好的用户体验。

document.getElementById("container").scrollTo({
  left: 0,         // 水平滚动位置
  top: 300,        // 垂直滚动位置
  behavior: 'smooth' // 平滑滚动
});

示例 3:使用 scrollTo 滚动到页面顶部或底部
你可以通过传递 0 和 document.documentElement.scrollHeight 来滚动到页面的顶部或底部:

// 滚动到页面顶部
window.scrollTo({
  top: 0,
  behavior: 'smooth'
});

// 滚动到页面底部
window.scrollTo({
  top: document.documentElement.scrollHeight,
  behavior: 'smooth'
});

示例 4:滚动到一个指定的 DOM 元素

你可以计算出一个元素的 offsetTop 或 offsetLeft 来滚动到该元素的位置:

// 获取目标元素
const element = document.getElementById('target');

// 滚动到该元素的位置
window.scrollTo({
  top: element.offsetTop,     // 该元素相对于文档顶部的距离
  left: 0,                    // 水平滚动
  behavior: 'smooth'          // 平滑滚动
});

示例 5:结合 Vue 和 scrollTo 用于平滑滚动
在 Vue 中,你可以使用 ref 获取 DOM 元素并应用 scrollTo 实现平滑滚动效果。例如,滚动到 Tab 页面:

<template>
  <div>
    <div ref="tabList" style="overflow-x: scroll; white-space: nowrap;">
      <div class="tab" style="display: inline-block; width: 100px;">Tab 1</div>
      <div class="tab" style="display: inline-block; width: 100px;">Tab 2</div>
      <div class="tab" style="display: inline-block; width: 100px;">Tab 3</div>
    </div>
    <button @click="scrollToTab(1)">Scroll to Tab 2</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const tabList = ref(null);

// 滚动到指定的 Tab
function scrollToTab(index) {
  const tab = tabList.value.getElementsByClassName('tab')[index];
  if (tab) {
    tabList.value.scrollTo({
      left: tab.offsetLeft,
      behavior: 'smooth'
    });
  }
}
</script>

scrollTo 的注意事项:

  • 兼容性:scrollTo 在现代浏览器中支持得很好,但在老版本的浏览器中(如 IE),可能不支持 behavior:
    ‘smooth’,需要使用 polyfill 或自定义实现。

behavior 属性:behavior 参数决定了滚动的行为:

  • auto’(默认值):立即滚动到目标位置,不做平滑过渡。
  • smooth’:平滑过渡,适合用户体验更友好的场景。

滚动容器:scrollTo 可以应用于整个页面(window)或者页面内的特定容器(如一个具有滚动条的

元素)。你只需要在相应的元素上调用该方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防御式CSS是一种编写CSS的方法,旨

1.防御式CSS 防御式CSS是一种编写CSS的方法&#xff0c;旨在提高样式的健壮性和可维护性。以下是一些实现防御式CSS的关键策略&#xff1a; 避免使用!important 尽量避免使用!important&#xff0c;因为它会破坏CSS的优先级规则&#xff0c;导致样式难以调试和维护。 使用具…

Python实现接口签名调用

目录: 1、第三方接口签名调用2、调用结果 1、第三方接口签名调用 import json import requests import hashlib import time import hmac access_key xxxxxxxxxxxxxxx secret_key xxxxxxxxxxxxxxx # 应用信息 def _wps4_sig(method, url, date, body): print(body)if bod…

【Hackthebox 中英 Write-Up】Web Request | 分析 HTTP 请求和响应

欢迎来到我的writeup分享&#xff01;我希望大家不要只关注结果或答案&#xff0c;而是通过耐心阅读&#xff0c;尝试逆向工程理解背后的运作原理。在这里&#xff0c;你不仅能找到解题的思路&#xff0c;还能学到更多与Hack The Box等平台相关的技术和技巧&#xff0c;期待与你…

物联网控制期末复习

第3章 物联网控制系统的过程通道设计 3.1 模拟量输出通道 3.1.1单模拟量输出通道的构成 计算机控制系统的模拟量输出通道将计算机产生的数字控制信号转换为模拟信号&#xff08;电压或电流&#xff09;作用于执行机构&#xff0c;以实现对被控对象的控制。 多D/A结构&#…

探索Wiki:开源知识管理平台及其私有化部署

在如今的信息时代&#xff0c;企业和团队的知识管理变得愈发重要。如何有效地存储、整理、共享和协作&#xff0c;是提高团队效率和创新能力的关键因素之一。今天&#xff0c;我要为大家介绍一款非常有用的github上开源知识管理工具——Wiki&#xff0c;并分享它的私有化部署方…

PDF文件提示-文档无法打印-的解决办法

背景信息 下载了几个签名的PDF文件&#xff0c;想要打印纸质版&#xff0c;结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器&#xff0c; 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…

快速上手LangChain(三)构建检索增强生成(RAG)应用

文章目录 快速上手LangChain(三)构建检索增强生成(RAG)应用概述索引阿里嵌入模型 Embedding检索和生成RAG应用(demo:根据我的博客主页,分析一下我的技术栈)快速上手LangChain(三)构建检索增强生成(RAG)应用 langchain官方文档:https://python.langchain.ac.cn/do…

【前端系列】Pinia状态管理库

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、Pinia状态管理库&#xff1a;☀️☀️☀️2.1 pinia基本使用① pinia充当中转站存放token② 使用步骤 2.1 axios请求拦截器 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;…

Springboot - Web

Spring Boot 是一个用于简化 Spring 应用程序配置和部署的框架。它提供了一种快速开发的方式&#xff0c;通过默认配置、自动化配置等特性&#xff0c;使得开发者能够更快捷地构建和部署基于 Spring 的应用。 Spring Boot Web 是 Spring Boot 的一个子模块&#xff0c;它专注于…

鸿蒙应用开发搬砖经验之—使用DevTools工具调试前端页面

环境说明&#xff1a; 系统环境&#xff1a;Mac mini M2 14.5 (23F79) 开发IDE&#xff1a;DevEco Studio 5.0.1 Release 配置步骤&#xff1a; 按着官方的指引来慢慢一步一步来&#xff0c;但前提是要配置好SDK的路径&#xff08;没有配置的话&#xff0c;可能先看下面的配…

Java-数据结构-顺序表(ArrayList)

在之前的博客中&#xff0c;我们大部分都在学习数据结构相关的理论知识&#xff0c;而今天我们要学到的ArrayList便有所不同了&#xff0c;ArrayList这部分算是重要的知识&#xff0c;所以大家打起精神&#xff0c;让我们一起学习~ 在学习ArrayList之前&#xff0c;我们需要先…

stable diffusion安装mov2mov

第一步&#xff1a; 下载mov2mov&#xff0c;地址&#xff1a;https://gitcode.com/gh_mirrors/sd/sd-webui-mov2mov 下载包到web-ui的sd-webui-aki-v4.10\extensions文件夹面解压 第二步&#xff1a;在文件夹中调出cmd窗口&#xff0c;执行下列命令&#xff0c; git restore…

RWKV 语言模型

RWKV Language Model是一种独特的循环神经网络&#xff08;RNN&#xff09;架构的语言模型&#xff0c;具有诸多优势和特点&#xff0c;在自然语言处理领域展现出了良好的性能和应用潜力&#xff0c;以下是具体介绍&#xff1a; 核心原理 融合RNN与Transformer优点&#xff1a;…

基于单片机的温湿度采集系统(论文+源码)

2.1系统的功能 本系统的研制主要包括以下几项功能&#xff1a; (1)温度检测功能&#xff1a;对所处环境的温度进行检测&#xff1b; (2)湿度检测功能&#xff1a;对所处环境的湿度进行检测&#xff1b; (3)加热和制冷功能&#xff1a;可以完成加热和制冷功能。 (4)加湿和除…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

OCR图片中文字识别(Tess4j)

文章目录 Tess4J下载 tessdataJava 使用Tess4j 的 demo Tess4J Tess4J 是 Tesseract OCR 引擎的 Java 封装库&#xff0c;它让 Java 项目更轻松地实现 OCR&#xff08;光学字符识别&#xff09;功能。 下载 tessdata 下载地址&#xff1a;https://github.com/tesseract-ocr/…

Redis面试相关

Redis开篇 使用场景 缓存 缓存穿透 解决方法一&#xff1a; 方法二&#xff1a; 通过多次hash来获取对应的值。 小结 缓存击穿 缓存雪崩 打油诗 双写一致性 两种不同的要求 强一致 读锁代码 写锁代码 强一致&#xff0c;性能低。 延迟一致 方案一&#xff1a;消息队列 方…

【快速实践】深度学习 -- 数据曲线平滑化

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; 在观察数据结果时&#xff0c;我们通常希望获得整体趋…

RS485方向自动控制电路分享

我们都知道RS485是半双工通信&#xff0c;所以在传输的时候需要有使能信号&#xff0c;标明是发送还是接收信号&#xff0c;很多时候就简单的用一个IO口控制就好了&#xff0c;但是有一些低成本紧凑型的MCU上&#xff0c;一个IO口也是很珍贵的&#xff0c;因此&#xff0c;如果…

DevSecOps自动化在安全关键型软件开发中的实践、Helix QAC Klocwork等SAST工具应用

DevSecOps自动化对于安全关键型软件开发至关重要。 那么&#xff0c;什么是DevSecOps自动化&#xff1f;具有哪些优势&#xff1f;为何助力安全关键型软件开发&#xff1f;让我们一起来深入了解~ 什么是DevSecOps自动化&#xff1f; DevSecOps自动化是指在软件开发生命周期的各…