uniapp中页面滚动锚点位置及滚动到对应高度显示对应按钮

news2024/11/25 10:57:18

在这里插入图片描述
在这里插入图片描述

可以把页面代码和组件代码放自己项目里跑一下

页面代码

<template>
  <view class="Tracing-detail">
    
    <view class="title" v-for="i in 30">顶部信息</view>
    <!-- tab按钮 -->
    <Tab v-model="activeIndex" @change="scrollToTarget"></Tab>
    <!-- 产品详情 -->
    <view class="cpxq" id="cpxq">
      <view class="title" v-for="i in 30">产品详情</view>
    </view>
    <!-- 流程溯源 -->
    <view class="lcsy" id="lcsy">
      <view class="title" v-for="i in 30">流程溯源</view>
    </view>
    <!-- 主体信息 -->
    <view class="ztxx" id="ztxx">
      <view class="title" v-for="i in 30">主体信息</view>
    </view>
    <!-- 优品推荐 -->
    <view class="yptj" id="yptj">
      <view class="title" v-for="i in 30">优品推荐</view>
    </view>
  </view>
</template>

<script>
  import variables from 'uni.scss';
  import Tab from './components/Tab.vue';
  import Certificate from './components/Certificate.vue'
  import Flow from './components/Flow.vue'
  export default {
    components:{
      Tab,
      Certificate,
      Flow
    },
    data(){
      return {
        
        cpxqTop:0,
        lcsyTop:0,
        ztxxTop:0,
        yptjTop:0,
        activeIndex:1
      }
    },
    mounted() {
      this.init()
    },
    onPageScroll(e) {
        // e.scrollTop 是页面在垂直方向已滚动的距离(单位px)
        // console.log(e.scrollTop);
      if(e.scrollTop<this.lcsyTop){
        if(this.activeIndex!=1) this.activeIndex = 1
      }else if(e.scrollTop<this.ztxxTop){
        if(this.activeIndex!=2) this.activeIndex = 2
      }else if(e.scrollTop<this.yptjTop){
        if(this.activeIndex!=3) this.activeIndex = 3
      }else if(this.activeIndex!=4){
        if(this.activeIndex!=4) this.activeIndex = 4
      }
    },
    methods:{
      init(){
        this.getTopNumber()
      },
      getTopNumber(){
        // 创建查询对象
        const query = uni.createSelectorQuery().in(this);
        // 选择目标元素并获取其位置信息
        query.select('#cpxq').boundingClientRect(data => {
          if (data) {
            console.log(data,1);
          this.cpxqTop = data.top-30
          }
        }); // 执行查询
        query.select('#lcsy').boundingClientRect(data => {
          if (data) {
            console.log(data,2);
          this.lcsyTop = data.top-30//30为tab的高度
          }
        }); // 执行查询
        query.select('#ztxx').boundingClientRect(data => {
          if (data) {
            console.log(data,3);
          this.ztxxTop = data.top-30
          }
        }); // 执行查询
        query.select('#yptj').boundingClientRect(data => {
          if (data) {
            console.log(data,4);
          this.yptjTop = data.top-30
          }
        }).exec(); // 执行查询
      },
      scrollToTarget(i) {
        console.log(i);
        let number = ''
        if(i==1){
          number = this.cpxqTop
        }else if(i==2){
          number = this.lcsyTop
        }else if(i==3){
          number = this.ztxxTop
        }else if(i==4){
          number = this.yptjTop
        }
          uni.pageScrollTo({
            scrollTop: number, // pageScrollTop为页面当前已滚动的距离
            duration: 300 // 滚动动画时长
          });
      }
    }
  }
</script>

<style scoped lang="scss">
  .title{
    text-align: center;
  }
</style>

吸顶按钮组件代码

<template>
  <view class="tab-list">
    <view 
    :class="item.index==value?'tab-active': 'tab'" 
    v-for="(item,index) in list"
    @click="btnClick(item.index)">
      {{item.name}}
    </view>
  </view>
</template>

<script>
  export default {
    props:{
      value:{
        typeof:Number,
        default:1
      }
    },
    data(){
      return{
        list:[
          {
            index:1,
            name:'产品详情'
          },
          {
            index:2,
            name:'流程溯源'
          },
          {
            index:3,
            name:'主体信息'
          },
          {
            index:4,
            name:'优品推荐'
          }
        ]
      }
    },
    methods:{
      btnClick(i){
        this.$emit("input", i)
        this.$emit("change", i)
      }
    }
  }
</script>

<style scoped lang="scss">
  .tab-list{
    position: sticky;
    top: 0;
    z-index: 999;
    margin: 0 31rpx;
    height: 79rpx;
    padding: 0 17rpx;
    display: flex;
    justify-content: space-between;
    align-items: center;
    background-color: red;
    background-size: 100% 100%;
    .tab-active {
      position: relative;
      height: 44rpx;
      font-family: YouSheBiaoTiHei;
      font-size: 35rpx;
      color: #FEE858;
      line-height: 44rpx;
      text-align: center;
      font-style: normal;
    }
    .tab {
      position: relative;
      height: 44rpx;
      font-family: YouSheBiaoTiHei;
      font-size: 35rpx;
      color: #FFFFFF;
      line-height: 44rpx;
      text-align: center;
      font-style: normal;
    }
  }
</style>

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

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

相关文章

Golang | Leetcode Golang题解之第13题罗马数字转整数

题目&#xff1a; 题解&#xff1a; var symbolValues map[byte]int{I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000}func romanToInt(s string) (ans int) {n : len(s)for i : range s {value : symbolValues[s[i]]if i < n-1 && value < symbolValues[s…

信息流推广如何操作,需要从哪些方面入手?

信息流推广确实是一个涉及多方面细节的工作&#xff0c;需要我们从多个角度进行深入分析和操作。以下是我对信息流推广的一些理解和建议&#xff1a; 首先&#xff0c;明确投放平台是推广的起点。我们需要根据产品或服务的特点&#xff0c;选择适合的投放渠道&#xff0c;如短视…

利用DataX工具,实现MySQL与OceanBase的数据同步实践

数据迁移是经常遇到的需求&#xff0c;市面上为此提供了众多同步工具。这里将为大家简要介绍DataX的使用。DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;它作为离线数据同步的工具/平台&#xff0c;在阿里巴巴集团内部被广泛应用。DataX 能够实现多种异构数据源之间…

什么是一站式知识库服务平台,它的作用是什么?

如今&#xff0c;对于企业来说&#xff0c;知识的获取、管理和共享变得越来越重要。一站式知识库服务平台也因此产生&#xff0c;它因为高效、便捷的特点&#xff0c;成为了多数企业和组织必不可少的使用工具。那么&#xff0c;什么是一站式知识库服务平台&#xff0c;它的作用…

【Linux】socket编程2

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;客户端代码Makefile(生成目标文件)UdpClient.cc(客户端代码)服务端代码部分优化1&#xff08;接受客户端时显示客…

基于达梦数据库开发-python篇

文章目录 前言一、搭建demo前提初始化简单demo 二、可能出现的异常情况DistutilsSetupErrorNo module named dmPythonlist报错 总结 前言 出于信创的考虑&#xff0c;近年来基于国产数据库达梦的应用开发逐渐变多。本文将介绍在windows环境下基于DM8版本的python的简单开发使用…

【机器学习300问】65、为什么Sigmoid和Tanh激活函数会导致梯度消失?

一、梯度消失现象 当神经网络的输入值较大或较小时&#xff0c;其导数&#xff08;梯度&#xff09;都会接近于0。在反向传播过程中&#xff0c;这些微小的梯度经过多层网络逐层传递时&#xff0c;会不断被乘以权重矩阵&#xff08;权重通常小于1&#xff09;&#xff0c;进一步…

2024人工智能与机器人系统国际学术会议(ICAIRS2024)

2024人工智能与机器人系统国际学术会议(ICAIRS2024) 会议简介 2024人工智能与机器人系统国际学术会议(ICAIRS2024)将在杭州举行。该会议旨在为人工智能和机器人系统的专家学者提供一个平台&#xff0c;以分享最新的研究成果、交流思想、探讨学术问题&#xff0c;并促进跨学科…

Open CASCADE学习|求曲面的参数空间

在三维空间中&#xff0c;任意的曲面都可以通过特定的方法映射到一个二维参数平面上&#xff0c;从而对其进行详细的几何分析和处理。首先&#xff0c;我们需要从三维模型中提取出特定的曲面&#xff0c;这通常被称为“Face”。一个face可以被视为三维空间中的一个封闭区域&…

【c++】c++线程库的基本使用

&#x1f4bb;文章目录 &#x1f4c4;前言C线程库创建线程互斥量mutexlock_guardunique_lock 同步机制condition_variableC20 信号量 的工作原理。 &#x1f4d3;总结 &#x1f4c4;前言 在C线程库推出之前&#xff0c;如果要实现跨平台多线程&#xff0c;那么我们就得需要直到…

Vue3报错:‘defineProps‘ is not defined no-undef

解决方法 在package.json中添加 "vue/setup-compiler-macros": true 记得在上面的 "node": true 后面加一个逗号 "eslintConfig": {"root": true,"env": {"node": true,"vue/setup-compiler-macros": t…

虚拟网络设备性能优化

在现代网络架构中&#xff0c;虚拟网络设备扮演着越来越重要的角色&#x1f310;&#xff0c;特别是在云计算☁️和容器化技术&#x1f4e6;广泛应用的背景下。虚拟网络设备如虚拟以太网设备&#xff08;veth&#xff09;、虚拟交换机&#xff08;vSwitch&#xff09;、和虚拟路…

Vue.js 过渡

过渡 Vue 在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的应用过渡效果。 Vue 提供了内置的过渡封装组件&#xff0c;该组件用于包裹要实现过渡效果的组件。 语法格式&#xff1a; <transition name "nameoftransition"><div></div&…

广度优先搜索--什么是“BFS”?为什么要用队列实现?--走迷宫代码详细注释

目录 什么是“DFS”什么是“BFS”为什么要用队列&#xff1f;举例&#xff08;走迷宫&#xff09;&#xff1a; 什么是“DFS” DFS 全称是 Depth First Search&#xff0c;中文名是深度优先搜索&#xff0c;是一种用于遍历或搜索树或图的算法。 深度优先&#xff0c;就是每次…

uni-admin初始化一直提示未初始化数据库问题

uni-admin初始化&#xff0c;一直提示&#xff1a; “检测到您未初始化数据库&#xff0c;请先右键uni-admin项目根目下的 uniCloud/database 目录&#xff0c;执行初始化云数据库&#xff0c;否则左侧无法显示菜单等数据” 最后清除了localStorage&#xff0c;发现就好了。

【MySQL】数据操作语句(DML)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

2.Spring 核心与设计思想

文章目录 1.Spring 是什么&#xff1f;1.1 什么是容器&#xff1f;1.2 什么是 IoC&#xff1f;1.2.1 传统程序开发1.2.2 控制反转式程序开发1.2.3 对比总结规律 1.3 理解 Spring IoC1.4 DI 概念说明 2.总结2.总结 大家好&#xff0c;我是晓星航。今天为大家带来的是 Spring核心…

vue3从精通到入门18:依赖注入Provide / Inject

provide 和 inject 是一对用于实现依赖注入的 API。provide 选项允许父组件向其所有子组件提供一个依赖&#xff0c;无论组件层次结构有多深&#xff0c;只要在其后代组件中使用 inject 选项&#xff0c;就可以访问到这个依赖。 父组件 (ParentComponent.vue) <template>…

抖音评论ID提取工具|视频关键词评论批量采集软件

抖音评论ID提取工具&#xff1a;批量抓取抖音评论 抖音评论ID提取工具是一款功能强大的软件&#xff0c;可以帮助您批量抓取抖音视频下的评论信息。通过输入关键词和评论监控词&#xff0c;即可进行评论的抓取&#xff0c;并提供评论昵称、评论日期、评论内容、命中关键词以及所…

C++笔记(函数重载)

目录 引入&#xff1a; 定义&#xff1a; 易错案例&#xff1a; 引入&#xff1a; 对于实现相似功能的函数&#xff0c;在命名时&#xff0c;我们常会出现命名重复的问题。对于C语言&#xff0c;编译器遇到这种命名重复的情况&#xff0c;会进行报错。而我们的C为了更方便程…