kl-anchor(vue锚点组件)

2023-05-16

文章目录

    • 示例
    • 功能描述
      • 存在问题
    • 使用
    • 实现

示例

在这里插入图片描述

功能描述

  • 点击左侧导航栏,右侧能滚动到指定的位置
  • 右侧滚动,左侧能自动选中

存在问题

  • 多次监听
  • 直接绑定滚动到了body

优化版本链接

使用

这儿是结合element-ui 一起使用的,同学们使用的时候要注意引入对应组件

<template>
  <div class="container pr flex-wrap">
    <el-menu
      :default-active="state.defaultActive"
      class="el-menu-vertical-demo width-120"
    >
      <el-menu-item
        :index="item.id"
        v-for="item in state.menuList"
        :key="item.id"
        @click="changenavigationBar(item.id)"
      >
        <span>{{ item.title }}</span>
      </el-menu-item>
    </el-menu>
    <div class="content">
      <h2>我是右侧的顶部内容</h2>

      <!-- 必传项为 id id必须和el-menu-item的index一致,activeId函数用于接收滚动到那个id区域了-->
      <kl-anchor
        class="content-item"
        :id="item.id"
        v-for="item in state.menuList"
        :key="item.id"
        @activeId="activeId"
      >
        {{ item.id }}
      </kl-anchor>
    </div>
  </div>
</template>
<script lang="ts" setup>
import { reactive } from "vue-demi";

const state = reactive({
  defaultActive: "nav1",
  menuList: [
    {
      id: "nav1",
      title: "nav11",
    },
    {
      id: "nav2",
      title: "nav22",
    },
    {
      id: "nav3",
      title: "nav33",
    },
    {
      id: "nav4",
      title: "nav44",
    },
    {
      id: "nav5",
      title: "nav55",
    },
    {
      id: "nav6",
      title: "nav66",
    },
  ],
});

const activeId = (id: string) => {
  if (id !== state.defaultActive) {
    state.defaultActive = id;
  }
  // console.log(id);
};

// 平滑滚动方式
const changenavigationBar = (id: String) => {
  var PageId = document.querySelector("#" + id) as HTMLElement;

  window.scrollTo({
    top: PageId.offsetTop,
    behavior: "smooth",
  });
};
</script>
<style lang="scss" scoped>
.width-120 {
  width: 120px;
}

.content-item {
  height: 500px;
}

.el-menu-vertical-demo {
  position: fixed;
  top: 0;
  left: 0;
}

.container {
  padding-left: 120px;
}
</style>

实现

kl-anchor

<template>
  <div class="kl-anchor" :id="id">
    <slot> </slot>
  </div>
</template>
<script lang="ts" setup>
import {
  onBeforeUnmount,
  onMounted,
  reactive,
  onBeforeUpdate,
  nextTick,
} from "vue-demi";

const props = defineProps({
  // 这儿适用于监听滚动的id 一定要注意唯一性
  id: {
    type: String,
    required: true,
  },
  // 精度 建议实际每项高度越小,这儿也传入越小
  accuracy: {
    type: Number,
    default: 150,
  },
});

const emits = defineEmits(["activeId"]);

interface i_state {
  el: HTMLElement | null;
  offsetTop: number;
  clientHeight: number;
  myHeight: number;
}

const state: i_state = reactive({
  el: null, // 节点对象
  offsetTop: 0, // 当前节点到body的顶部的距离
  clientHeight: 0, // 页面可视区高度
  myHeight: 0, // 当前节点的高度
});

function throttle(fn: () => void, delay: number) {
  let time1 = 0;
  return function () {
    let time2 = Date.now();
    if (time2 - time1 >= delay) {
      fn();
      time1 = time2;
    }
  };
}

const eventScroll = throttle(() => {
  let bodyScroll: number = document.documentElement.scrollTop;

  if (
    bodyScroll - state.offsetTop >= 0 &&
    state.offsetTop + state.myHeight > bodyScroll
  ) {
    // console.log(props.id);
    emits("activeId", props.id);
  }
}, props.accuracy);

function handleEvent() {
  state.el = document.querySelector("#" + props.id) as HTMLElement;
  state.myHeight = state.el.offsetHeight; //如果是异步获取,将无法获取到没有加载进来的内容的高度
  state.offsetTop = state.el.offsetTop; //如果是异步获取,将无法获取到没有加载进来的内容的高度
  state.clientHeight = document.body.clientHeight;
  // 监听事件 当前是处于哪个nav对应的内容
  window.document.addEventListener("scroll", eventScroll);
}
onMounted(() => {
  handleEvent();
});

// 当数据更新时的业务
onBeforeUpdate(() => {
  nextTick(() => {
    handleEvent();
  });
});

onBeforeUnmount(() => {
  window.document.removeEventListener("scroll", eventScroll);
});
</script>
<style lang="scss" scoped></style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kl-anchor(vue锚点组件) 的相关文章

  • WordPress - 如何向上一页/下一页链接添加锚点

    我的 WordPress 主题顶部有一个画廊 博客文章位于其下方 每次我转到下一页时 它都会转到我不想要的顶部 我想在图库下方添加一个名为 blog 的锚点 并将其添加到上一页 下一页链接 我应该在代码中的什么位置放置 blog 才能使其正
  • Rails 3.1.3 使用带有 link_to 标记的锚属性从 posts/index 到 posts/show/id 不起作用

    我在 posts index 视图上使用 link to 标签 并希望使用锚点将其链接到 posts show id 视图 使其向下滚动到评论表单 由于某种原因 我无法让锚点工作 这是我的代码 在帖子 索引中 这无法将 符号附加到链接末尾
  • 使用 jQuery 以编程方式单击 链接

    我知道这个问题以前曾被问过 但在网上搜索后我似乎找不到直接的答案 the HTML a href index php jQuery 这两个都不起作用 myAnchor click or myAnchor trigger click 实现这一
  • 使用 MATLAB 解析 HTML 中的锚点 URL,帮助快速

    我有严格的时间限制 我真的需要一个正则表达式来解析这种类型的锚点 它们都是这种格式 a href 20120620 0512 c2 1024 jpg 20120620 0512 c2 102 gt a 对于网址 20120620 0512
  • Android Webview 锚链接(跳转链接)不起作用

    我的 Android 应用程序中有一个 WebView 它使用 loadDataWithBaseURL 方法加载 HTML 字符串 问题是本地锚链接 a href link 无法正常工作 单击链接时 它会突出显示 但不会滚动到相应的锚点 如
  • Python Sphinx 锚点在任意线上

    如何使用 Sphinx 在 ReST 中的任意行设置锚点引用 为了更清楚 这里有一个例子 A title with an anchor some stuff 这将创建一个标题A title with an anchor并添加一个额外的on
  • jquery从外部页面循环链接到特定幻灯片?

    仔细研究了所有其他问题 但我无法弄清楚这一点 我有一个主页 其中包含我使用 jquery 循环插件的另一个页面的某些幻灯片 我需要做的是将主页上的链接直接链接到不是组中第一张幻灯片的幻灯片 没什么那么复杂 我的主页上有一个这样的链接 a h
  • 拓展:vue 父组件调用子组件方法ref(且父组件可通过ref调用的方法传值给子组件)

    1 ref被用来给元素或子组件注册引用信息 引用信息将会注册在父组件的 refs对象上 一 ref被用来给元素或子组件注册引用信息 引用信息将会注册在父组件的 refs对象上 div class formBtn fl 111 div div
  • (vue)el-popover鼠标移入提示效果

    vue el popover鼠标移入提示效果 效果 代码
  • href="#" 转到页面顶部 - 预防? [复制]

    这个问题在这里已经有答案了 我有一个包含一些 jQuery 函数的页面 页面上的 HTML 看起来像这样 a href class service Open a 当我单击 打开 按钮时 隐藏的面板会滑出 jQuery 本身工作得很好 但是当
  • 在反应对话框模型中打开 iframe 时,锚标记 href 不起作用

    我们开设了一个iframe在模式对话框中 在里面iframe我们正在加载一个document 该文档也是 html 页面 这 a 文档中的标签未导航至id他们中提到的href 只是来自的一个样本html文档 下面是 a 例子 a href
  • 黑豹程序员-字符串中查找出重复的字符串

    Collections frequency codeList element 字符串element 在codeList集合中重复的次数 List
  • 如果缺少 http:// 前缀,请添加到 URL

    你好 我有一个非常简单的代码 a href target self div class callButton Website div a 问题是 如果用户不输入 http 链接将指向我的网站 而不是应有的外部网站 如何在 PHP 中检查用户
  • 用不同的颜色为 html 锚点添加下划线

    是否可以使用文本颜色以外的颜色为锚标记添加下划线 任何例子将不胜感激 EDIT 是否可以将颜色指定为十六进制 例如 8f867c 你不能单独指定下划线颜色 但你可以使用一个小技巧 a color red text decoration no
  • Vue3 和Vue2的区别,以及钩子函数的使用

    Vue js 3 和 Vue js 2 是两个主要版本的流行前端框架 它们之间有很多区别 包括性能优化 新特性和改进的API等 以下是一些Vue 3与Vue 2之间的主要区别 以及一些示例代码来说明这些差异 1 性能优化 响应式系统 Vue
  • 链接到网页的特定部分

    如何创建指向我无法控制的另一个网站上的长网页的一部分的链接 我认为您可以在链接末尾使用 partofpage 的变体 有什么建议么 只需附加一个 随后是该人的 ID a 标签 或其他 HTML 标签 例如 section 你想要达到的目标
  • jquery .click 覆盖锚点 href 当我不想要它时!

    我有一组嵌套的 DIV 当用户单击它们时 它们使用 jQuery 进行滑动切换 在最里面的 DIV 内有一个带有 HREF 的锚标记 可以导航到某个位置 问题是 当我单击链接时 它会像父 DIV 一样滑动切换 而不是导航到 url 如果我右
  • 如何选择具有多个类的跨度并将其放置在锚点内?

    我所处的情况是 我需要根据应用于它的类将单击事件绑定到跨度 放置在具有多个类的锚点内 For eg 更新 添加了下面的 html 例如 div class c0 c a class c1 c2 span class c3 c4 span A
  • 修复了页眉与页内锚点重叠的问题

    如果我在 HTML 页面中有一个非滚动标题 固定在顶部 具有定义的高度 有没有办法使用 URL 锚点 fragment部分 让浏览器滚动到页面中的某个点 但仍然尊重固定元素的高度无需 JavaScript 的帮助 http example
  • 使用 React 组件内的 标签进行锚定导航

    我正在尝试在我的反应应用程序内的页面组件之一中设置锚点导航 我正在尝试模仿所看到的相同功能在 Draft js 上 https draftjs org docs getting started installation它使用子标题作为锚点

随机推荐

  • 系统分析师之项目管理(十七)

    一 范围管理 范围管理 xff1a 确定项目的边界 xff0c 即哪些工作是项目应该做的 xff0c 哪些工作不应该包括在项目中 二 时间管理 时间管理 xff1a 也叫进度管理 xff0c 就是用科学的方法 xff0c 确定目标进度 xf
  • 【AUTOSA】

    目录 一 概述 二 限制与约束 三 功能描述 3 1 网络通信模式请求的转换 3 2 当前网络通信方式的输出 3 3 外围设备的控制 3 3 1 以太网接口控制器 3 4 多网络 3 5 网络模式状态机 3 5 1 初始化 3 5 2 在亚
  • 【AUTOSAR】【以太网】TCPIP

    目录 一 概述 二 约束和假设 三 依赖模块 3 1 EthIf 3 2 EthSM 3 3 SoAd 3 4 KeyM 3 5 CSM 四 功能说明 4 1 系统扩展性 4 2 IPv4 4 2 1 IPv4 4 2 2 ARP 4 2
  • CMake 链接时出现undefined reference to 错误

    一 问题背景 之前新建了一个项目项目文件分布为 1 src MROR cpp 2 include MROR h 3 main cpp 执行cmake出现undefined reference toxx xff0c 显示main函数中的类成员
  • Ubuntu系统下使用VScode进行CMake编译调试C++程序

    一 前提须知 必须确保你的cmake文件能够编译通过 xff0c 并可以通过make生成可执行文件 二 具体步骤 1 设置CMakeLists txt set CMAKE BUILD TYPE DEBUG 2 VScode调试 VScode
  • 基于TCP协议的Socket编程

    一 基于TCP协议的网络编程 1 TCP IP是一种可靠的网络协议 xff0c 它在通信的两端各建立一个Socket xff0c 从而在通信的两端之间形成网络虚拟链路 xff1b 一旦建立了虚拟的网络链路 xff0c 两端的程序就可以通过虚
  • 示波器抓板子串口,波形错误,杂乱无章

    示波器抓板子串口 xff0c 波形杂乱无章 在使用Hi3559芯片时 xff0c 需要实现串口输出功能 xff0c 实际抓波形时 xff0c 波形杂乱无章 xff0c 感觉很离奇 xff0c 偶然间发现原因 xff0c 在此分享一下 串口信
  • GPS经纬度坐标WGS84到东北天坐标系ENU的转换

    GPS经纬度坐标WGS84到东北天坐标系ENU的转换 常用坐标系介绍地理坐标系 Geographic Coordinate System GCS 地心地固坐标系 ECEF 当地东 北 上 ENU 坐标 基坐标相互转化地理坐标系到地心地固坐标
  • Unity学习笔记--易学易会的unity中A星寻路插件:A*Pathfind Project的使用

    A寻路看似简单 xff0c 但实际项目中的各种应用是有一定难度的 xff0c 需要较强的算法功底 xff0c 不过 xff0c 幸运的是 xff0c Unity Asset Store中已经有了现成的A寻路插件 34 A Pathfindi
  • HTTP常见面试题

    个人总结 xff0c 请勿转载 URL 统一资源定位符 xff1a 就是标识网络中资源的路径 HTTP 超文本传输协议 是一个基于TCP IP通信协议来传递信息 HTTP原理 HTTP协议工作与客户端 服务端架构上 xff0c 浏览器作为H
  • Unity开发2D游戏实现寻路算法——【PolyNav - 2D Pathfinding】插件的使用

    Navmesh2d插件的简单使用说明 2d游戏如何实现寻路算法NavMesh2d插件的简单使用方法创建2d导航网格添加寻路组件 简单实现寻路功能的脚本鼠标点击寻路自动路径寻路 Demo寻路效果效果gif xff1a demo插件下载 组件属
  • electron中使用 alert和comfirm等弹出框都会致使input无法获得焦点

    electron中使用 alert和comfirm等弹出框都会致使input无法获得焦点 解决办法 xff1a 自定义
  • v-if和v-for的优先级

    文章目录 vue2vue3 vue2 v for优先级比v if高v for与v if作用在不同标签时候 xff0c 是先进行判断 xff0c 再进行列表的渲染 注意事项 永远不要把 v if 和 v for 同时用在同一个元素上 xff0
  • nginx配置history模式路由

    对nginx配置文件 conf修改 server span class token punctuation span listen span class token number 80 span span class token punct
  • day45 Promise实现一个分批请求

    要求 100个请求 每次5个 具体实现
  • 移动端软键盘和input遮挡问题

    零时解决方案 span class token doctype span class token punctuation lt span span class token doctype tag DOCTYPE span span clas
  • 如何获取 b站视频 纯播放

    通过视频页url直接拿到 BV1NV411v7Xp https www bilibili com video BV1NV411v7Xp spm id from 61 autoNext 发起请求 拿到 aid cid https api bi
  • vue3 ts vite 配置别名 导致报 无法找到对应莫模块的错误处理方式

    第一步 vite config ts alias span class token operator span span class token punctuation span span class token string 34 64
  • kl-waterfall 瀑布流

    文章目录 使用实现waterfall index文件kl waterfall item 使用 span class token operator lt span kl span class token operator span water
  • kl-anchor(vue锚点组件)

    文章目录 示例功能描述存在问题 使用实现 示例 功能描述 点击左侧导航栏 xff0c 右侧能滚动到指定的位置右侧滚动 xff0c 左侧能自动选中 存在问题 多次监听直接绑定滚动到了body 优化版本链接 使用 这儿是结合element ui