uni-appH5项目实现导航区域与内容区域联动效果

news2024/12/23 10:20:46

一、需求描述

将导航区域与内容区域实现联动,即点击导航区域,内容区滚动到对应位置,内容区滚动过程中根据内容定位到相对应的导航栏。

效果如下:

侧边导航与内容联动效果

二、功能实现思路分析汇总:

三、具体代码

1、功能一

右侧内容区scroll-view的scroll-into-view属性绑定id,当触发左侧导航2的点击事件时设置subjectId的值,从而实现滚动到对应区域。

 <!-- 右侧内容区 -->
    <scroll-view
      :scroll-y="true"
      scroll-with-animation
      :scroll-into-view="subjectId"
      class="deep-right"
      @scroll="scrolling"
    >
      <view
        v-for="(subject, index) in subjectList"
        :id="'subject' + index"
        :key="index"
        class="subject-con"
      >
        <view
          v-for="(son, i) in subject.sonList"
          :key="i"
          class="subject-item"
          @click="goToDetail(son)"
        >
          <view>{{ son.code }}</view>
          <view>{{ son.name }}</view>
        </view>
      </view>
    </scroll-view>
  const subjectId = ref(''); //scroll-into-view 绑定值
  const navChange = (index: any) => { // 点击左侧导航栏触发
    navAvtive.value = index;
    subjectId.value = 'subject' + index;
  };

2、功能二

2.1、方案一

滚动方法中,获取各个块级元素距离视口顶部的距离Top1,获取导航区域1距离视口顶部的距离Top2,将Top1与Top2比较,Top1<Top2即代表块级元素滚动到导航1的下方了。

 const scrolling = (e: any) => {
    //subjectList 是右侧内容区的数据
    subjectList.value.forEach((item, index) => {
      //动态循环判断 Top1和Top2 的大小,将比较过程封装成方法调用
      if (isInViewport(document.getElementById(`subject${index}`))) {
        if (slideNavList.value) {
            // 因为我这里左侧导航是封装的子组件,因此调用左侧导航组件的setTabActive方法,修改导航激活tab
          slideNavList.value.setTabActive(index);
        }
      }
    });
  };

动态比较过程的方法封装

 const isInViewport = (element: any) => {
    //getBoundingClientRect() JS的方法,用于获取元素位置和尺寸
    // careerMap-nav 是顶部横向导航1块元素的Id
    const rect = element.getBoundingClientRect();
    return (
    // 起初这里用的是Math.abs(rect.top),发现上滑时左侧导航定位不准,打印发现 上滑过程中rect.top会起初是赋值然后逐渐增加
     rect.top <=
      document.getElementById('careerMap-nav')?.getBoundingClientRect()?.bottom 
        //careerMap-nav 元素下边界相对于视口顶部的距离
    );
  };

Js中的getBoundingClientRect · 前端押题宝典 · 看云getBoundingClientRect()方法相关指路:Js中的getBoundingClientRect · 前端押题宝典 · 看云

2.2方案二:

// 获取一级学科距离父元素的top值
  const subjectPosition = ref([])
  const getPositionTop = async () => {
    setTimeout(() => {
      const query = uni.createSelectorQuery().in(this);
      query
        .selectAll(".subject-con")
        .boundingClientRect((data) => {
          console.log("得到布局位置信息" + JSON.stringify(data));
          let height = 0
          data.forEach((item: any) => {
            // console.log("节点顶部离页面顶部的距离为" + item.top);
            // item.height累加
            height = height+item.height
            subjectPosition.value.push(height); //和父元素的距离
          });
          console.log("subjectPosition.value",subjectPosition.value);
        })
        .exec();
    }, 100)
}
// 找到scrollTop介于数组中哪两个元素之间
const getBounds =(number:any, sortedArray:any) =>{
  let lowerBound = -1;
  let upperBound = sortedArray.length;
  for (let i = 0; i < sortedArray.length; i++) {
    if (sortedArray[i] === number) {
      // 如果数组中存在给定的数字,则直接返回其索引
      return { lowerBound: i, upperBound: i };
    } else if (sortedArray[i] > number) {
      // 如果当前元素大于给定的数字,则找到了上界
      upperBound = i;
      break; // 因为数组是升序的,所以不需要再继续查找
    }
    // 否则,当前元素小于给定的数字,继续查找
    lowerBound = i;
  }
  // 如果循环结束仍未找到上界,upperBound保持数组长度
  return { lowerBound, upperBound: upperBound < sortedArray.length ? upperBound : sortedArray.length - 1 };
}
const slideNavList = ref();
  const scrolling = (e: any) => {
    console.log("scrollTop", e.detail.scrollTop);
    const { lowerBound, upperBound }=getBounds( e.detail.scrollTop,subjectPosition.value)
    console.log(lowerBound, upperBound);
    if (slideNavList.value) {
      slideNavList.value.setTabActive(upperBound);
    }
  }

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

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

相关文章

Matplotlib通过axis()配置坐标轴数据详解

坐标轴范围设置 axis()可以直接传入列表[xmin,xmax,ymin,ymax]进行范围设置, 分别可以使用plt.axis()或者画布对象.axis()进行配置 import numpy as np import matplotlib.pyplot as pltx np.linspace(0, 20, 100) y x*2 plt.plot(x, y, r) plt.axis([0,30,0,100]) plt.sa…

【精选】文件摆渡系统:跨网文件传输的安全与效率之选

文件摆渡系统可以解决哪些问题&#xff1f; 文件摆渡系统&#xff08;File Shuttle System&#xff09;主要是应用于不同网络、网段、区域之间的文件数据传输流转场景&#xff0c; 用于解决以下几类问题&#xff1a; 文件传输问题&#xff1a; 大文件传输&#xff1a;系统可…

云服务器内网穿透连接云手机配置ALAS

文章目录 服务器安装TailscaleNAT网络&#xff08;无独立IP&#xff09;云服务器安装Tailscale有固定IP的云服务器安装Tailscale 云手机安装Tailscale开启无线网络调试安装Tailscale ALAS连接云手机 上次写到服务器连接云手机时只说了有独立IP的&#xff0c;但有独立IP的云手机…

IDM 工具下载 地图高程数据

巧用IDM工具 快捷下载ASTER GDEM v3高程数据 ASTER GDEM v3是NASA推出的30米高清DEM,覆盖了几乎全部的地球陆地。那么,在NASA官网怎么下载ASTER GDEM v3的地形高程数据呢? 首先,你需要注册一个nasa的账号 注册网址: https://urs.earthdata.nasa.gov/users/new 注册方式和国…

彩虹数字屏保时钟 芝麻时钟开启个性化的时代 屏保怎么能少它

彩虹数字屏保时钟 芝麻时钟开启个性化的时代 屏保怎么能少它&#xff1f;电脑屏保多样化&#xff0c;让大家有了更多的选择&#xff0c;让更多人有机会把自己的电脑打扮得漂漂亮亮&#xff0c;今天小编给大家推荐&#xff1a;芝麻时钟&#xff08;官网下载地址&#xff1a;http…

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录 docker-compose up -d #启动靶场 docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at master vulh…

TYPE-C USB设计

目录 摘要 TYPE-C电路 握手过程 USB电路 摘要 TYPE-C,是USB的一种接口&#xff0c;USB的第一种接口为常见的USB接口&#xff0c;U盘即为这种接口&#xff1b;第二种接口的形状类似一个凸字&#xff0c;常应用在打印机中&#xff0c;第三种接口即为TYPE-C&#xff0c;支持正…

JdbcRowSetImpl利用链分析

文章目录 JdbcRowSetImpl利用链前言JdbcRowSetImpl利用链分析 JdbcRowSetImpl利用链 前言 首先说明一下&#xff1a;利用链都有自己的使用场景&#xff0c;要根据场景进行选择不同的利用链。 JdbcRowSetImpl利用链用于fastjson反序列化漏洞中。 为什么&#xff1f; 因为fa…

暑期档总结:哪部国漫年番表现更优?

“暑期档”可能是所有档期中绵延时间最长的&#xff0c;作为该时间段主力的学生人群&#xff0c;在学业压力较小的假期中&#xff0c;需要更多娱乐方式来填充生活。除了电影之外&#xff0c;动画番剧越来越成为这一群体的不二选择&#xff0c;各个动画制作公司也会选择把精彩剧…

html记账本改写:数据重新布局,更好用了,没有localStorage保存版本

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>htm记账本</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid …

RISC-V架构下 DSA - AI算力的更多可能性:Banana Pi BPI-F3 进迭时空

AI已经从技术走向应用&#xff0c;改变了我们的生活和工作方式。近些年&#xff0c;AI算力芯片领域群雄逐鹿&#xff0c;通过对芯片、算力与AI三者发展迭代过程的理解&#xff0c;我们发现高能效比的算力、通用的软件栈以及高度优化的编译器&#xff0c;是我们的AI算力产品迈向…

稚晖君同款 clion嵌入式开发环境搭建

前言 前段时间看到稚晖君的单片机开发环境&#xff0c;感觉挺酷的&#xff0c;自己也想尝试下&#xff0c;这里记录下安装过程。 安装文件准备 stm32cubemx安装 stm32cubemx stm32cubemx下载地址 当前时间是2024年9月4日&#xff0c;下载的版本是6.12.0版本&#xff0c;下…

一、关系模型和关系代数,《数据库系统概念》,原书第7版

文章目录 [toc]一、引言1.1 什么是数据库1.2 数据完整性1.3 数据库的操作1.4 数据库的持久性1.5 数据库管理系统1.6 数据模型1.7 早期DBMS 二、关系模型2.1 什么是关系模型2.2 关系数据库的结构2.3 键2.4 约束2.5 数据操纵语言(DML)2.6 关系代数2.6.1 选择运算2.6.2 投影运算2.…

【南方科技大学】CS315 Computer Security 【Lab1 Packet Sniffing and Wireshark】

目录 IntroductionBackgroundTCP/IP Network StackApplication LayerTransport LayerInternet LayerLink LayerPacket Sniffer Getting WiresharkStarting WiresharkCapturing PacketsTest Run Questions for the Lab Introduction 实验的第一部分介绍数据包嗅探器 Wireshark。…

2024高教社杯全国大学生数学建模竞赛B题原创python代码

以下均为python代码。先给大家看看之前文章的部分思路&#xff1a; 接下来我们将按照题目总体分析-背景分析-各小问分析的形式来 1 总体分析 题目提供了一个电子产品生产的案例&#xff0c;要求参赛者建立数学模型解决企业在生产过程中的一系列决策问题。以下是对题目的总体…

Cortex-A7:简单中断处理(不可嵌套中断)机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断&#xff0c;开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中&#xff0c;硬件原生是不支持嵌套中断的&#xff0c;这从Cortex-A…

隐私计算实训营:联邦学习在垂直场景的开发实践

纵向联邦学习 纵向联邦学习的参与方拥有相同样本空间、不同特征空间的数据&#xff0c;通过共有样本数据进行安全联合建模&#xff0c;在金融、广告等领域拥有广泛的应用场景。和横向联邦学习相比&#xff0c;纵向联邦学习的参与方之间需要协同完成数据求交集、模型联合训练和…

[Android] [SnapdragonCamera] 单摄(横屏)阶段总结

在研高通平台的单摄项目中遇到了很多适配问题&#xff0c;做一下初步的总结&#xff0c;为今后遇到相似的问题&#xff0c;提供参考方案。 1. 横屏设置相机预览显示不正常 1.1问题现象 1.2分析与解决 骁龙相机默认的预览方向是“portrait”。在横屏设备上显…

人车防撞系统安全生产方案

根据《市场监管总局关于2021~2023年全国特种设备安全状况的通告》数据显示&#xff1a;2023年&#xff1a;全国共发生特种设备事故和相关事故71起&#xff0c;其中死亡69人。包含叉车在内的场(厂)内专用机动车辆事故29起、死亡28人&#xff0c;占事故总数的40.85%、死亡人数的4…

DBeaver 常用操作

文章目录 快捷键SQL模板xml文件删除表数据执行脚本文件导入脚本表数据的标题栏中显示中文注释 (推荐)数据库导航显示表名 (推荐)执行多行sql语句ER图说明以及避坑 快捷键 执行sql语句&#xff1a;ctrlenter sql模板(可以自定义设置)&#xff1a;sf、swhere、scount 格式化&…